From 160d26c4e9a116184e980963aa7228d083b2cd29 Mon Sep 17 00:00:00 2001 From: Sethu Srinivasan Date: Tue, 22 Sep 2026 15:36:58 -0700 Subject: [PATCH] Ship Paperstow as an on-device vault under com.app.paperstow. Keeps papers encrypted on the phone, drops the cloud extras, and makes backup, search, tags, and restore behave like the product we actually run. Co-authored-by: Cursor --- .github/dependabot.yml | 28 +- .github/workflows/build.yml | 7 +- .github/workflows/codeql.yml | 8 +- .gitignore | 2 +- .kiro/specs/travel-document-manager/design.md | 4 +- LICENSE | 2 +- NOTICE | 96 +++ README.md | 93 +- app/build.gradle.kts | 324 ++++--- app/proguard-rules.pro | 18 +- .../data/local/.gitkeep | 0 .../data/scanner/.gitkeep | 0 .../presentation/.gitkeep | 0 app/src/main/AndroidManifest.xml | 47 +- .../main/assets/demo/blood_test_report.pdf | Bin 0 -> 174240 bytes app/src/main/assets/demo/boarding_pass.pdf | Bin 0 -> 130660 bytes .../main/assets/demo/boarding_pass_mobile.jpg | Bin 0 -> 54839 bytes .../main/assets/demo/emergency_contacts.txt | 14 + app/src/main/assets/demo/flight_itinerary.txt | 11 + .../main/assets/demo/hotel_confirmation.pdf | Bin 0 -> 145733 bytes app/src/main/assets/demo/hotel_key_packet.gif | Bin 0 -> 31347 bytes app/src/main/assets/demo/jane_doe_photo.png | Bin 0 -> 26358 bytes .../main/assets/demo/jane_vaccine_card.bmp | Bin 0 -> 237654 bytes .../main/assets/demo/john_doe_passport.pdf | Bin 0 -> 154707 bytes app/src/main/assets/demo/john_doe_photo.png | Bin 0 -> 25019 bytes app/src/main/assets/demo/packing_list.txt | 11 + app/src/main/assets/demo/sample_trail.gpx | 23 + app/src/main/assets/demo/travel_insurance.pdf | Bin 0 -> 144499 bytes app/src/main/assets/demo/trip_plans.md | 11 + .../main/assets/demo/vaccination_record.pdf | Bin 0 -> 160470 bytes app/src/main/assets/demo/visa_letter.pdf | Bin 0 -> 120572 bytes app/src/main/assets/demo/visa_stamp.png | Bin 0 -> 18190 bytes app/src/main/assets/tag_stock/car.jpg | Bin 0 -> 11474 bytes app/src/main/assets/tag_stock/family.jpg | Bin 0 -> 11098 bytes app/src/main/assets/tag_stock/folder.jpg | Bin 0 -> 9944 bytes app/src/main/assets/tag_stock/health.jpg | Bin 0 -> 13136 bytes app/src/main/assets/tag_stock/hotel.jpg | Bin 0 -> 15184 bytes app/src/main/assets/tag_stock/insurance.jpg | Bin 0 -> 15810 bytes app/src/main/assets/tag_stock/notes.jpg | Bin 0 -> 12664 bytes app/src/main/assets/tag_stock/passport.jpg | Bin 0 -> 17040 bytes app/src/main/assets/tag_stock/plans.jpg | Bin 0 -> 13966 bytes app/src/main/assets/tag_stock/tickets.jpg | Bin 0 -> 15719 bytes app/src/main/assets/tag_stock/trail.jpg | Bin 0 -> 10478 bytes app/src/main/assets/tag_stock/trip.jpg | Bin 0 -> 15893 bytes app/src/main/assets/tag_stock/visa.jpg | Bin 0 -> 17069 bytes app/src/main/ic_launcher-playstore.png | Bin 0 -> 172430 bytes .../TravelDocsApplication.kt | 10 +- .../paperstow/data/backup/BackupManager.kt | 206 +++++ .../data/backup/BackupRestore.kt | 129 ++- .../app/paperstow/data/backup/RoomDbFiles.kt | 124 +++ .../app/paperstow/data/demo/DemoCatalog.kt | 38 + .../paperstow/data/demo/DemoDataRepository.kt | 67 ++ .../data/dicom/DicomParser.kt | 4 +- .../data/drive/.gitkeep | 0 .../data/feedback/FeedbackDraftStore.kt | 156 ++++ .../data/importer/DocumentFormatValidator.kt | 59 +- .../data/importer/FileDocumentImporter.kt | 8 +- .../data/local/ConsentPreferences.kt | 7 +- .../data/local/DatabaseRecovery.kt | 4 +- .../data/local/DisclaimerPreferences.kt | 2 +- .../data/local/DocumentRepositoryImpl.kt | 43 +- .../app/paperstow/data/local/FeatureFlags.kt | 36 + .../data/local/InputSanitizer.kt | 2 +- .../data/local/SearchEngineImpl.kt | 32 +- .../app/paperstow/data/local/SearchIndex.kt | 76 ++ .../data/local/SearchIndexRebuilder.kt | 82 ++ .../app/paperstow/data/local/TagColorStore.kt | 163 ++++ .../data/local/TagRepositoryImpl.kt | 38 +- .../data/local/TravelDocsDatabase.kt | 49 ++ .../data/local/auth/AuthRepositoryImpl.kt | 14 +- .../data/local/auth/AuthSessionManager.kt | 6 +- .../data/local/auth/SecurityAlertService.kt | 26 + .../data/local/auth/SecurityPreferences.kt | 14 +- .../data/local/auth/TimeProvider.kt | 2 +- .../data/local/crypto/DeviceKeyManager.kt | 2 +- .../data/local/crypto/KeyDerivation.kt | 2 +- .../data/local/crypto/PinHasher.kt | 2 +- .../data/local/dao/DocumentDao.kt | 23 +- .../data/local/dao/DocumentMetadataDao.kt | 4 +- .../data/local/dao/DocumentTagDao.kt | 44 +- .../data/local/dao/FamilyMemberDao.kt | 4 +- .../data/local/dao/GpsTrackDao.kt | 14 +- .../data/local/entity/DocumentEntity.kt | 5 +- .../local/entity/DocumentMetadataEntity.kt | 2 +- .../data/local/entity/DocumentTagEntity.kt | 2 +- .../data/local/entity/FamilyMemberEntity.kt | 2 +- .../data/local/entity/GpsTrackEntity.kt | 5 +- .../local/storage/DocumentFileStorageImpl.kt | 14 +- .../data/nlp/.gitkeep | 0 .../nlp/BasicDocumentChecklistGenerator.kt | 16 +- .../data/nlp/RegexNaturalLanguageParser.kt | 10 +- .../paperstow/data/safety/DeviceBattery.kt | 13 + .../data/safety/SafetyLocationRepository.kt | 61 ++ .../data/safety/SafetyTrailPreferences.kt | 28 + .../data/safety/SafetyTrailService.kt | 200 +++++ .../data/scanner/.gitkeep | 0 .../data/scanner/CameraDocumentScanner.kt | 87 ++ .../data/scanner/MlKitMetadataExtractor.kt | 41 +- .../data/scanner/SmartFileNamer.kt | 4 +- .../data/tags/AutoTagGeneratorImpl.kt | 10 +- .../debug/CrashHandler.kt | 57 +- .../debug/DebugLogScreen.kt | 2 +- .../debug/DebugLogger.kt | 28 +- .../debug/LoggingInterceptors.kt | 2 +- .../debug/TempFileCleanup.kt | 2 +- .../debug/UsageTelemetry.kt | 10 +- .../app/{traveldocs => paperstow}/di/.gitkeep | 0 .../{traveldocs => paperstow}/di/AppModule.kt | 56 +- .../domain/model/.gitkeep | 0 .../domain/model/AppError.kt | 2 +- .../domain/model/Document.kt | 2 +- .../paperstow/domain/model/DocumentFormat.kt | 25 + .../domain/model/DocumentType.kt | 2 +- .../domain/model/ExtractionResult.kt | 5 +- .../domain/model/ImportedDocument.kt | 2 +- .../domain/model/LockoutState.kt | 2 +- .../domain/model/MarkdownChecklist.kt | 85 ++ .../domain/model/MetadataField.kt | 2 +- .../domain/model/ParseResult.kt | 2 +- .../domain/model/QueryIntent.kt | 2 +- .../domain/model/SearchQuery.kt | 2 +- .../domain/model/SearchResult.kt | 2 +- .../domain/model/Tag.kt | 2 +- .../domain/model/TravelDocumentChecklist.kt | 2 +- .../domain/model/TravelParameters.kt | 2 +- .../domain/repository/AuthRepository.kt | 4 +- .../domain/repository/AutoTagGenerator.kt | 9 + .../repository/DocumentChecklistGenerator.kt | 11 + .../domain/repository/DocumentFileStorage.kt | 5 +- .../domain/repository/DocumentImporter.kt | 6 +- .../domain/repository/DocumentRepository.kt | 9 +- .../domain/repository/MetadataExtractor.kt | 6 +- .../repository/NaturalLanguageParser.kt | 7 + .../domain/repository/SearchEngine.kt | 6 +- .../domain/repository/SessionManager.kt | 2 +- .../domain/repository/TagRepository.kt | 5 +- .../app/paperstow/domain/safety/GpxTrail.kt | 93 ++ .../domain/safety/UniqueLocations.kt | 105 +++ .../domain/usecase/.gitkeep | 0 .../domain/usecase/DocumentImportUseCase.kt | 68 +- .../paperstow/presentation/MainActivity.kt | 727 ++++++++++++++++ .../presentation/about/AboutScreen.kt | 170 ++++ .../presentation/about/SbomScreen.kt | 218 +++++ .../presentation/auth/.gitkeep | 0 .../presentation/auth/BiometricAuthScreen.kt | 8 +- .../presentation/backup/BackupOnlyScreen.kt | 67 +- .../presentation/backup/RestoreOnlyScreen.kt | 148 ++-- .../presentation/common/CountryCodePicker.kt | 2 +- .../presentation/demo/DemoDataViewModel.kt | 70 ++ .../diagnostics/DiagnosticsScreen.kt | 48 +- .../presentation/documents/.gitkeep | 0 .../documents/BatchImportProgressScreen.kt | 2 +- .../documents/BatchImportViewModel.kt | 65 +- .../documents/CameraImportViewModel.kt | 12 +- .../documents/CameraPreviewScreen.kt | 2 +- .../documents/ChecklistEditorScreen.kt | 160 ++++ .../documents/DocumentListScreen.kt | 36 +- .../documents/DocumentListViewModel.kt | 26 +- .../documents/DocumentViewerScreen.kt | 229 +++-- .../documents/DocumentViewerViewModel.kt | 27 +- .../presentation/documents/ImportScreen.kt | 93 +- .../presentation/documents/ImportViewModel.kt | 85 +- .../presentation/documents/NoteTagPicker.kt | 128 +++ .../presentation/documents/PdfPreview.kt | 165 ++++ .../presentation/documents/ShareHelper.kt | 19 +- .../documents/TextNoteEditorScreen.kt | 118 +++ .../documents/TextNoteViewModel.kt | 147 ++++ .../presentation/feedback/FeedbackScreen.kt | 218 +++++ .../feedback/FeedbackViewModel.kt | 166 ++++ .../presentation/onboarding/.gitkeep | 0 .../onboarding/DisclaimerScreen.kt | 6 +- .../presentation/onboarding/EulaScreen.kt | 43 +- .../presentation/onboarding/SplashScreen.kt | 123 +++ .../presentation/review/ReviewScreen.kt | 4 +- .../presentation/review/ReviewViewModel.kt | 10 +- .../presentation/safety/AutoStartTrail.kt | 71 ++ .../safety/SafetyLocationsScreen.kt | 338 ++++++++ .../safety/SafetyLocationsViewModel.kt | 50 ++ .../presentation/search/.gitkeep | 0 .../presentation/search/SearchScreen.kt | 8 +- .../presentation/search/SearchViewModel.kt | 10 +- .../settings/SearchIndexViewModel.kt | 19 + .../presentation/settings/SettingsScreen.kt | 267 ++++++ .../presentation/tags/TagManagementScreen.kt | 123 ++- .../tags/TagManagementViewModel.kt | 34 +- .../paperstow/presentation/tags/TagMark.kt | 85 ++ .../traveldocs/data/backup/BackupManager.kt | 199 ----- .../data/backup/DriveBackupUploader.kt | 41 - .../data/backup/S3BackupUploader.kt | 57 -- .../data/drive/DriveServiceProvider.kt | 14 - .../data/drive/GoogleDriveImporter.kt | 179 ---- .../data/drive/GoogleDriveServiceProvider.kt | 40 - .../app/traveldocs/data/local/FeatureFlags.kt | 46 - .../app/traveldocs/data/local/GpxExporter.kt | 33 - .../data/local/SecureDocumentManager.kt | 169 ---- .../traveldocs/data/local/TagColorStore.kt | 64 -- .../data/local/TravelDocsDatabase.kt | 33 - .../data/local/auth/SecurityAlertService.kt | 84 -- .../data/scanner/CameraDocumentScanner.kt | 153 ---- .../data/webserver/DocumentWebServer.kt | 228 ----- .../debug/LocationTrackingService.kt | 222 ----- .../app/traveldocs/debug/SystemTelemetry.kt | 252 ------ .../traveldocs/debug/TrackingSettingsPanel.kt | 127 --- .../traveldocs/domain/model/DocumentFormat.kt | 24 - .../domain/repository/AutoTagGenerator.kt | 9 - .../repository/DocumentChecklistGenerator.kt | 11 - .../repository/NaturalLanguageParser.kt | 7 - .../traveldocs/media/AudioPlaybackService.kt | 228 ----- .../traveldocs/presentation/MainActivity.kt | 588 ------------- .../presentation/about/AboutScreen.kt | 143 ---- .../presentation/auth/PinEntryScreen.kt | 72 -- .../presentation/backup/BackupScreen.kt | 410 --------- .../presentation/documents/UrlImportScreen.kt | 198 ----- .../presentation/feedback/FeedbackScreen.kt | 162 ---- .../presentation/onboarding/ConsentScreen.kt | 100 --- .../presentation/onboarding/SplashScreen.kt | 122 --- .../presentation/settings/SettingsScreen.kt | 193 ----- .../presentation/webshare/WebShareScreen.kt | 145 ---- .../drawable-nodpi/ic_launcher_foreground.png | Bin 0 -> 521522 bytes .../res/drawable/ic_launcher_background.xml | 7 +- .../res/drawable/ic_launcher_foreground.xml | 29 - .../res/drawable/ic_launcher_monochrome.xml | 30 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 6663 bytes app/src/main/res/mipmap-hdpi/ic_launcher.xml | 5 - .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 7139 bytes .../res/mipmap-hdpi/ic_launcher_round.xml | 5 - app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3389 bytes app/src/main/res/mipmap-mdpi/ic_launcher.xml | 5 - .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 3728 bytes .../res/mipmap-mdpi/ic_launcher_round.xml | 5 - app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 10813 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.xml | 5 - .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 11481 bytes .../res/mipmap-xhdpi/ic_launcher_round.xml | 5 - .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 21158 bytes .../main/res/mipmap-xxhdpi/ic_launcher.xml | 5 - .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 22224 bytes .../res/mipmap-xxhdpi/ic_launcher_round.xml | 5 - .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 34094 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.xml | 5 - .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 35573 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.xml | 5 - app/src/main/res/values/colors.xml | 5 +- app/src/main/res/values/strings.xml | 74 +- app/src/main/res/xml/automotive_app_desc.xml | 4 - .../data/backup/EncryptionRoundTripTest.kt | 2 +- .../paperstow/data/backup/RoomDbFilesTest.kt | 44 + .../data/dicom/DicomParserTest.kt | 2 +- .../importer/DocumentFormatValidatorTest.kt | 26 +- .../data/local/InputSanitizerTest.kt | 2 +- .../data/nlp/.gitkeep | 0 .../BasicDocumentChecklistGeneratorTest.kt | 18 +- .../data/tags/.gitkeep | 0 .../data/tags/AutoTagGeneratorImplTest.kt | 8 +- .../domain/model/.gitkeep | 0 .../domain/model/DocumentFormatTest.kt | 5 +- .../domain/model/MarkdownChecklistTest.kt | 36 + .../ChecklistGenerationPropertyTest.kt | 8 +- .../properties/DateRangeTagPropertyTest.kt | 10 +- .../properties/DestinationTagPropertyTest.kt | 10 +- .../DocumentTypeToTagMappingPropertyTest.kt | 10 +- .../FamilySizeScalingPropertyTest.kt | 8 +- .../GlobalTagDeletionPropertyTest.kt | 8 +- .../MissingDocDetectionPropertyTest.kt | 18 +- .../MissingDocSuggestionsPropertyTest.kt | 16 +- .../MissingDocumentDetectionPropertyTest.kt | 18 +- .../properties/TagAddGrowsListPropertyTest.kt | 8 +- .../TagDeduplicationPropertyTest.kt | 10 +- .../TagRemoveShrinksListPropertyTest.kt | 8 +- .../paperstow/domain/safety/GpxTrailTest.kt | 29 + .../domain/safety/UniqueLocationsTest.kt | 99 +++ .../domain/usecase/.gitkeep | 0 .../generators/.gitkeep | 0 .../presentation/about/SbomParseTest.kt | 33 + build.gradle.kts | 11 +- docs/ARCHITECTURE.md | 8 +- docs/HACKATHON.md | 4 +- docs/KIRO_GENERATION_PROMPT.md | 17 +- docs/PLAY_STORE.md | 117 +++ docs/PRIVACY_POLICY.md | 57 +- docs/THIRD_PARTY_LICENSES.md | 63 ++ docs/brand/paperstow-icon-1024.png | Bin 0 -> 521522 bytes docs/privacy.html | 40 + gradle.properties | 2 + gradle/libs.versions.toml | 83 ++ gradle/wrapper/gradle-wrapper.properties | 6 +- scripts/deploy.sh | 57 +- scripts/generate-demo-assets.py | 402 +++++++++ scripts/generate-tag-stock.py | 183 ++++ scripts/pull-logs.sh | 2 +- scripts/setup-env.sh | 16 +- scripts/setup.sh | 807 +++++++----------- 294 files changed, 8377 insertions(+), 6168 deletions(-) create mode 100644 NOTICE rename app/src/androidTest/java/com/app/{traveldocs => paperstow}/data/local/.gitkeep (100%) rename app/src/androidTest/java/com/app/{traveldocs => paperstow}/data/scanner/.gitkeep (100%) rename app/src/androidTest/java/com/app/{traveldocs => paperstow}/presentation/.gitkeep (100%) create mode 100644 app/src/main/assets/demo/blood_test_report.pdf create mode 100644 app/src/main/assets/demo/boarding_pass.pdf create mode 100644 app/src/main/assets/demo/boarding_pass_mobile.jpg create mode 100644 app/src/main/assets/demo/emergency_contacts.txt create mode 100644 app/src/main/assets/demo/flight_itinerary.txt create mode 100644 app/src/main/assets/demo/hotel_confirmation.pdf create mode 100644 app/src/main/assets/demo/hotel_key_packet.gif create mode 100644 app/src/main/assets/demo/jane_doe_photo.png create mode 100644 app/src/main/assets/demo/jane_vaccine_card.bmp create mode 100644 app/src/main/assets/demo/john_doe_passport.pdf create mode 100644 app/src/main/assets/demo/john_doe_photo.png create mode 100644 app/src/main/assets/demo/packing_list.txt create mode 100644 app/src/main/assets/demo/sample_trail.gpx create mode 100644 app/src/main/assets/demo/travel_insurance.pdf create mode 100644 app/src/main/assets/demo/trip_plans.md create mode 100644 app/src/main/assets/demo/vaccination_record.pdf create mode 100644 app/src/main/assets/demo/visa_letter.pdf create mode 100644 app/src/main/assets/demo/visa_stamp.png create mode 100644 app/src/main/assets/tag_stock/car.jpg create mode 100644 app/src/main/assets/tag_stock/family.jpg create mode 100644 app/src/main/assets/tag_stock/folder.jpg create mode 100644 app/src/main/assets/tag_stock/health.jpg create mode 100644 app/src/main/assets/tag_stock/hotel.jpg create mode 100644 app/src/main/assets/tag_stock/insurance.jpg create mode 100644 app/src/main/assets/tag_stock/notes.jpg create mode 100644 app/src/main/assets/tag_stock/passport.jpg create mode 100644 app/src/main/assets/tag_stock/plans.jpg create mode 100644 app/src/main/assets/tag_stock/tickets.jpg create mode 100644 app/src/main/assets/tag_stock/trail.jpg create mode 100644 app/src/main/assets/tag_stock/trip.jpg create mode 100644 app/src/main/assets/tag_stock/visa.jpg create mode 100644 app/src/main/ic_launcher-playstore.png rename app/src/main/java/com/app/{traveldocs => paperstow}/TravelDocsApplication.kt (88%) create mode 100644 app/src/main/java/com/app/paperstow/data/backup/BackupManager.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/backup/BackupRestore.kt (67%) create mode 100644 app/src/main/java/com/app/paperstow/data/backup/RoomDbFiles.kt create mode 100644 app/src/main/java/com/app/paperstow/data/demo/DemoCatalog.kt create mode 100644 app/src/main/java/com/app/paperstow/data/demo/DemoDataRepository.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/dicom/DicomParser.kt (99%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/drive/.gitkeep (100%) create mode 100644 app/src/main/java/com/app/paperstow/data/feedback/FeedbackDraftStore.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/importer/DocumentFormatValidator.kt (61%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/importer/FileDocumentImporter.kt (96%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/ConsentPreferences.kt (84%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/DatabaseRecovery.kt (96%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/DisclaimerPreferences.kt (96%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/DocumentRepositoryImpl.kt (83%) create mode 100644 app/src/main/java/com/app/paperstow/data/local/FeatureFlags.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/InputSanitizer.kt (94%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/SearchEngineImpl.kt (79%) create mode 100644 app/src/main/java/com/app/paperstow/data/local/SearchIndex.kt create mode 100644 app/src/main/java/com/app/paperstow/data/local/SearchIndexRebuilder.kt create mode 100644 app/src/main/java/com/app/paperstow/data/local/TagColorStore.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/TagRepositoryImpl.kt (69%) create mode 100644 app/src/main/java/com/app/paperstow/data/local/TravelDocsDatabase.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/auth/AuthRepositoryImpl.kt (94%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/auth/AuthSessionManager.kt (92%) create mode 100644 app/src/main/java/com/app/paperstow/data/local/auth/SecurityAlertService.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/auth/SecurityPreferences.kt (85%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/auth/TimeProvider.kt (88%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/crypto/DeviceKeyManager.kt (98%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/crypto/KeyDerivation.kt (97%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/crypto/PinHasher.kt (98%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/dao/DocumentDao.kt (67%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/dao/DocumentMetadataDao.kt (86%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/dao/DocumentTagDao.kt (56%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/dao/FamilyMemberDao.kt (86%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/dao/GpsTrackDao.kt (56%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/entity/DocumentEntity.kt (75%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/entity/DocumentMetadataEntity.kt (86%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/entity/DocumentTagEntity.kt (84%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/entity/FamilyMemberEntity.kt (87%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/entity/GpsTrackEntity.kt (71%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/local/storage/DocumentFileStorageImpl.kt (92%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/nlp/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/nlp/BasicDocumentChecklistGenerator.kt (90%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/nlp/RegexNaturalLanguageParser.kt (97%) create mode 100644 app/src/main/java/com/app/paperstow/data/safety/DeviceBattery.kt create mode 100644 app/src/main/java/com/app/paperstow/data/safety/SafetyLocationRepository.kt create mode 100644 app/src/main/java/com/app/paperstow/data/safety/SafetyTrailPreferences.kt create mode 100644 app/src/main/java/com/app/paperstow/data/safety/SafetyTrailService.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/scanner/.gitkeep (100%) create mode 100644 app/src/main/java/com/app/paperstow/data/scanner/CameraDocumentScanner.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/data/scanner/MlKitMetadataExtractor.kt (92%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/scanner/SmartFileNamer.kt (96%) rename app/src/main/java/com/app/{traveldocs => paperstow}/data/tags/AutoTagGeneratorImpl.kt (91%) rename app/src/main/java/com/app/{traveldocs => paperstow}/debug/CrashHandler.kt (62%) rename app/src/main/java/com/app/{traveldocs => paperstow}/debug/DebugLogScreen.kt (99%) rename app/src/main/java/com/app/{traveldocs => paperstow}/debug/DebugLogger.kt (84%) rename app/src/main/java/com/app/{traveldocs => paperstow}/debug/LoggingInterceptors.kt (98%) rename app/src/main/java/com/app/{traveldocs => paperstow}/debug/TempFileCleanup.kt (94%) rename app/src/main/java/com/app/{traveldocs => paperstow}/debug/UsageTelemetry.kt (96%) rename app/src/main/java/com/app/{traveldocs => paperstow}/di/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/di/AppModule.kt (59%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/AppError.kt (91%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/Document.kt (90%) create mode 100644 app/src/main/java/com/app/paperstow/domain/model/DocumentFormat.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/DocumentType.kt (74%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/ExtractionResult.kt (68%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/ImportedDocument.kt (94%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/LockoutState.kt (74%) create mode 100644 app/src/main/java/com/app/paperstow/domain/model/MarkdownChecklist.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/MetadataField.kt (85%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/ParseResult.kt (76%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/QueryIntent.kt (69%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/SearchQuery.kt (78%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/SearchResult.kt (87%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/Tag.kt (64%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/TravelDocumentChecklist.kt (88%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/model/TravelParameters.kt (80%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/AuthRepository.kt (81%) create mode 100644 app/src/main/java/com/app/paperstow/domain/repository/AutoTagGenerator.kt create mode 100644 app/src/main/java/com/app/paperstow/domain/repository/DocumentChecklistGenerator.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/DocumentFileStorage.kt (59%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/DocumentImporter.kt (66%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/DocumentRepository.kt (54%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/MetadataExtractor.kt (55%) create mode 100644 app/src/main/java/com/app/paperstow/domain/repository/NaturalLanguageParser.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/SearchEngine.kt (65%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/SessionManager.kt (84%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/repository/TagRepository.kt (69%) create mode 100644 app/src/main/java/com/app/paperstow/domain/safety/GpxTrail.kt create mode 100644 app/src/main/java/com/app/paperstow/domain/safety/UniqueLocations.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/usecase/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/domain/usecase/DocumentImportUseCase.kt (63%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/MainActivity.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/about/AboutScreen.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/about/SbomScreen.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/auth/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/auth/BiometricAuthScreen.kt (94%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/backup/BackupOnlyScreen.kt (60%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/backup/RestoreOnlyScreen.kt (52%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/common/CountryCodePicker.kt (98%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/demo/DemoDataViewModel.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/diagnostics/DiagnosticsScreen.kt (84%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/BatchImportProgressScreen.kt (99%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/BatchImportViewModel.kt (80%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/CameraImportViewModel.kt (91%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/CameraPreviewScreen.kt (98%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/documents/ChecklistEditorScreen.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/DocumentListScreen.kt (88%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/DocumentListViewModel.kt (86%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/DocumentViewerScreen.kt (57%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/DocumentViewerViewModel.kt (86%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/ImportScreen.kt (74%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/ImportViewModel.kt (67%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/documents/NoteTagPicker.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/documents/PdfPreview.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/documents/ShareHelper.kt (88%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/documents/TextNoteEditorScreen.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/documents/TextNoteViewModel.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackScreen.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackViewModel.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/onboarding/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/onboarding/DisclaimerScreen.kt (86%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/onboarding/EulaScreen.kt (86%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/onboarding/SplashScreen.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/review/ReviewScreen.kt (99%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/review/ReviewViewModel.kt (91%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/safety/AutoStartTrail.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsScreen.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsViewModel.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/search/.gitkeep (100%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/search/SearchScreen.kt (93%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/search/SearchViewModel.kt (87%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/settings/SearchIndexViewModel.kt create mode 100644 app/src/main/java/com/app/paperstow/presentation/settings/SettingsScreen.kt rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/tags/TagManagementScreen.kt (66%) rename app/src/main/java/com/app/{traveldocs => paperstow}/presentation/tags/TagManagementViewModel.kt (71%) create mode 100644 app/src/main/java/com/app/paperstow/presentation/tags/TagMark.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/backup/BackupManager.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/backup/DriveBackupUploader.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/backup/S3BackupUploader.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/drive/DriveServiceProvider.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveImporter.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveServiceProvider.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/local/FeatureFlags.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/local/GpxExporter.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/local/SecureDocumentManager.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/local/TagColorStore.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/local/TravelDocsDatabase.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/local/auth/SecurityAlertService.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/scanner/CameraDocumentScanner.kt delete mode 100644 app/src/main/java/com/app/traveldocs/data/webserver/DocumentWebServer.kt delete mode 100644 app/src/main/java/com/app/traveldocs/debug/LocationTrackingService.kt delete mode 100644 app/src/main/java/com/app/traveldocs/debug/SystemTelemetry.kt delete mode 100644 app/src/main/java/com/app/traveldocs/debug/TrackingSettingsPanel.kt delete mode 100644 app/src/main/java/com/app/traveldocs/domain/model/DocumentFormat.kt delete mode 100644 app/src/main/java/com/app/traveldocs/domain/repository/AutoTagGenerator.kt delete mode 100644 app/src/main/java/com/app/traveldocs/domain/repository/DocumentChecklistGenerator.kt delete mode 100644 app/src/main/java/com/app/traveldocs/domain/repository/NaturalLanguageParser.kt delete mode 100644 app/src/main/java/com/app/traveldocs/media/AudioPlaybackService.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/MainActivity.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/about/AboutScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/auth/PinEntryScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/backup/BackupScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/documents/UrlImportScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/feedback/FeedbackScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/onboarding/ConsentScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/onboarding/SplashScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/settings/SettingsScreen.kt delete mode 100644 app/src/main/java/com/app/traveldocs/presentation/webshare/WebShareScreen.kt create mode 100644 app/src/main/res/drawable-nodpi/ic_launcher_foreground.png delete mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_monochrome.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.xml create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.xml delete mode 100644 app/src/main/res/xml/automotive_app_desc.xml rename app/src/test/java/com/app/{traveldocs => paperstow}/data/backup/EncryptionRoundTripTest.kt (98%) create mode 100644 app/src/test/java/com/app/paperstow/data/backup/RoomDbFilesTest.kt rename app/src/test/java/com/app/{traveldocs => paperstow}/data/dicom/DicomParserTest.kt (97%) rename app/src/test/java/com/app/{traveldocs => paperstow}/data/importer/DocumentFormatValidatorTest.kt (87%) rename app/src/test/java/com/app/{traveldocs => paperstow}/data/local/InputSanitizerTest.kt (98%) rename app/src/test/java/com/app/{traveldocs => paperstow}/data/nlp/.gitkeep (100%) rename app/src/test/java/com/app/{traveldocs => paperstow}/data/nlp/BasicDocumentChecklistGeneratorTest.kt (96%) rename app/src/test/java/com/app/{traveldocs => paperstow}/data/tags/.gitkeep (100%) rename app/src/test/java/com/app/{traveldocs => paperstow}/data/tags/AutoTagGeneratorImplTest.kt (95%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/model/.gitkeep (100%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/model/DocumentFormatTest.kt (82%) create mode 100644 app/src/test/java/com/app/paperstow/domain/model/MarkdownChecklistTest.kt rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/ChecklistGenerationPropertyTest.kt (95%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/DateRangeTagPropertyTest.kt (96%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/DestinationTagPropertyTest.kt (94%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/DocumentTypeToTagMappingPropertyTest.kt (94%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/FamilySizeScalingPropertyTest.kt (96%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/GlobalTagDeletionPropertyTest.kt (97%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/MissingDocDetectionPropertyTest.kt (95%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/MissingDocSuggestionsPropertyTest.kt (85%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/MissingDocumentDetectionPropertyTest.kt (95%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/TagAddGrowsListPropertyTest.kt (97%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/TagDeduplicationPropertyTest.kt (95%) rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/properties/TagRemoveShrinksListPropertyTest.kt (96%) create mode 100644 app/src/test/java/com/app/paperstow/domain/safety/GpxTrailTest.kt create mode 100644 app/src/test/java/com/app/paperstow/domain/safety/UniqueLocationsTest.kt rename app/src/test/java/com/app/{traveldocs => paperstow}/domain/usecase/.gitkeep (100%) rename app/src/test/java/com/app/{traveldocs => paperstow}/generators/.gitkeep (100%) create mode 100644 app/src/test/java/com/app/paperstow/presentation/about/SbomParseTest.kt create mode 100644 docs/PLAY_STORE.md create mode 100644 docs/THIRD_PARTY_LICENSES.md create mode 100644 docs/brand/paperstow-icon-1024.png create mode 100644 docs/privacy.html create mode 100644 gradle/libs.versions.toml create mode 100644 scripts/generate-demo-assets.py create mode 100644 scripts/generate-tag-stock.py diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5a8cec3..3552f7d 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,8 +1,7 @@ -# Dependabot configuration for version updates +# Dependabot: weekly bumps for Gradle (including version catalog) and Actions. version: 2 updates: - # Gradle dependencies - package-ecosystem: "gradle" directory: "/" schedule: @@ -16,8 +15,31 @@ updates: commit-message: prefix: "deps:" include: "scope" + groups: + androidx: + patterns: + - "androidx*" + - "com.google.android.gms*" + - "com.google.mlkit*" + kotlin-toolchain: + patterns: + - "org.jetbrains.kotlin*" + - "org.jetbrains.kotlinx*" + - "com.google.devtools.ksp*" + testing: + patterns: + - "org.junit*" + - "io.kotest*" + - "io.mockk*" + - "androidx.test*" + di-and-crypto: + patterns: + - "com.google.dagger*" + - "org.bouncycastle*" + - "net.lingala.zip4j*" + - "androidx.security*" + - "com.google.code.gson*" - # GitHub Actions dependencies - package-ecosystem: "github-actions" directory: "/" schedule: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0b55e64..d5b93f6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,9 +13,9 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up JDK 17 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '17' distribution: 'zulu' @@ -25,7 +25,7 @@ jobs: uses: actions/cache@v4 with: path: ~/.gradle/caches - key: gradle-${{ hashFiles('**/*.gradle*') }} + key: gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', '**/libs.versions.toml') }} - name: Bump version run: | sed -i "s/versionCode = [0-9]*/versionCode = ${{ github.run_number }}/" app/build.gradle.kts @@ -39,6 +39,7 @@ jobs: mkdir -p artifacts cp app/build/outputs/apk/debug/app-debug.apk artifacts/document-manager-debug.apk cp app/build/outputs/apk/release/app-release*.apk artifacts/document-manager-release.apk 2>/dev/null || true + cp app/build/outputs/sbom/debug/sbom.json artifacts/sbom.json 2>/dev/null || true - name: Upload artifacts uses: actions/upload-artifact@v4 with: diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index ffbbe2d..dc83a25 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -19,10 +19,10 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Set up JDK 17 - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: java-version: '17' distribution: 'zulu' @@ -31,7 +31,7 @@ jobs: uses: android-actions/setup-android@v3 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: java-kotlin build-mode: manual @@ -42,7 +42,7 @@ jobs: ./gradlew assembleDebug --no-daemon - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@v4 continue-on-error: true with: category: /language:java-kotlin diff --git a/.gitignore b/.gitignore index 8297a6d..42d9fe9 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ Thumbs.db google-services.json # Debug output -app/src/main/java/com/app/traveldocs/debug/debug_logs/ +app/src/main/java/com/app/paperstow/debug/debug_logs/ # Build artifacts build_output.txt diff --git a/.kiro/specs/travel-document-manager/design.md b/.kiro/specs/travel-document-manager/design.md index dde5ff7..224f514 100644 --- a/.kiro/specs/travel-document-manager/design.md +++ b/.kiro/specs/travel-document-manager/design.md @@ -376,7 +376,7 @@ The `device_key` is a 256-bit key generated once and stored in AndroidKeyStore. ### File Storage Layout ``` -/data/data/com.app.traveldocs/ +/data/data/com.app.paperstow/ ├── databases/ │ ├── member_{id}.db # SQLCipher-encrypted Room DB per member │ └── app_meta.db # Unencrypted: member list, app config @@ -722,7 +722,7 @@ app/src/androidTest/ # Integration + UI tests (device/emulator) **Component**: `DebugLogger` (debug/) - Singleton with 3 outputs: Logcat (tag: TravelDocs), ring buffer (500), file -- File at: `/data/data/com.app.traveldocs/files/debug_logs/traveldocs_debug.log` +- File at: `/data/data/com.app.paperstow/files/debug_logs/traveldocs_debug.log` - Auto-rotates at 5MB **Component**: `DebugLogScreen` + `DebugFloatingButton` (debug/) diff --git a/LICENSE b/LICENSE index c8a3a10..e12f2d1 100644 --- a/LICENSE +++ b/LICENSE @@ -90,7 +90,7 @@ the Work, You may choose to offer acceptance of support, warranty, indemnity, or other liability obligations consistent with this License. - Copyright 2024 Travel Document Manager Contributors + Copyright 2026 Paperstow Contributors Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..ca0ff8c --- /dev/null +++ b/NOTICE @@ -0,0 +1,96 @@ +Paperstow +Copyright 2026 Paperstow Contributors + +This product is licensed under the Apache License, Version 2.0. +See the LICENSE file in the repository root. + +This product redistributes software developed by third parties. Those +components remain under their own licenses. A component inventory is in +docs/THIRD_PARTY_LICENSES.md. + +--------------------------------------------------------------------------- +Apache License 2.0 components (selected) + +AndroidX (Core, Activity, Lifecycle, Navigation, Compose, Room, Biometric, +DocumentFile, Security Crypto, Hilt Navigation, Test) +Copyright The Android Open Source Project +https://developer.android.com/jetpack/androidx + +Kotlin and kotlinx.coroutines +Copyright JetBrains s.r.o. and Kotlin contributors +https://github.com/JetBrains/kotlin + +Dagger / Hilt +Copyright Google LLC +https://github.com/google/dagger + +Zip4j +Copyright Srikanth Lingala +https://github.com/srikanth-lingala/zip4j + +Gson +Copyright Google LLC +https://github.com/google/gson + +Tink Android (via androidx.security:security-crypto) +Copyright Google LLC +https://github.com/tink-crypto/tink-java + +JSpecify +Copyright The JSpecify Authors +https://jspecify.dev/ + +Kotest (test) +https://github.com/kotest/kotest + +MockK (test) +https://github.com/mockk/mockk + +Material Icons (Apache 2.0) +https://fonts.google.com/icons + +--------------------------------------------------------------------------- +Bouncy Castle (MIT-style "Bouncy Castle Licence") + +bcprov-jdk18on +Copyright (c) 2000-2025 The Legion of the Bouncy Castle Inc. +https://www.bouncycastle.org/ + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +https://www.bouncycastle.org/licence.html + +--------------------------------------------------------------------------- +Google ML Kit and Play services (not Apache) + +ML Kit Text Recognition and ML Kit Document Scanner client libraries are +distributed under the ML Kit Terms of Service, and they pull in Google Play +services libraries under the Android Software Development Kit License. + +https://developers.google.com/ml-kit/terms +https://developer.android.com/studio/terms + +These terms apply to the binary SDKs. They do not change the Apache 2.0 +license of Paperstow source code. + +--------------------------------------------------------------------------- +Eclipse Public License 2.0 (test classpath only; not shipped in the app) + +JUnit 5 (Jupiter / Platform) +https://www.eclipse.org/legal/epl-v20.html diff --git a/README.md b/README.md index 3db5e92..4e32742 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,27 @@ -# DocVault +# Paperstow -Private, encrypted document vault for Android. No cloud, no accounts, no compromises. +Keep a copy of your family travel papers on this device. Encrypted. No account. No cloud. ## Why this exists -I needed a secure place to keep passport scans, insurance docs, and travel papers on my phone where: -- They're encrypted and locked behind biometrics -- Nothing gets uploaded anywhere without me explicitly doing it -- I can find stuff fast with tags and search +I needed a place to keep passport scans, visas, tickets, and insurance on the phone where: +- They're encrypted and unlocked with the device's fingerprint, face, or screen lock +- Nothing gets uploaded unless I share or archive it +- I can find a page fast with tags and on-device OCR - Large PDFs don't hang the app -So I built this. It's open source, free to use, and the community is welcome to improve it. +So I built Paperstow. It's open source, free, and the community is welcome to improve it. ## What it does -- **Import** documents from files, camera, or local folders -- **OCR** extracts text and classifies docs automatically (passport, visa, ticket, etc.) -- **Encrypt** everything with AES-256-GCM, keys in Android KeyStore -- **Search** by tags and free-text across all documents -- **Share** via the standard Android share sheet — decrypted on the way out -- **Backup & Restore** *(experimental)* — password-protected ZIP to local folder -- **Per-document PIN** — lock individual sensitive documents with an additional PIN -- **Folder import** with automatic tagging from subfolder names -- **Dark theme** — toggle in settings, applies immediately -- **Google Drive import** *(experimental)* — import from Drive folders -- **S3-compatible backup** *(experimental)* — backup to AWS S3, MinIO, Backblaze -- **Audio playback & Android Auto** *(experimental)* — MP3/M4A import with car head unit support -- **GPS tagging** *(experimental)* — capture location on import, background tracking -- **WiFi sharing** *(experimental)* — embedded web server for LAN document management -- **Import from URL** *(experimental)* — download and import files from any web address -- **DICOM viewer** *(experimental)* — medical image preview with custom parser +- **Import** from files, camera, or a local folder +- **OCR** extracts text and classifies travel papers (passport, visa, ticket, and similar) +- **Encrypt** with AES-256-GCM; keys stay in Android KeyStore +- **Search** by tags and text from the page +- **Share** through Android's share sheet when a family member needs a copy +- **Archive & restore** — password-protected ZIP to a folder you pick +- **Folder import** — subfolder names become tags +- **Dark theme** — toggle in settings @@ -54,11 +46,9 @@ Watch the demo: https://youtube.com/shorts/E43BueHc3gQ?feature=share ## Principles -1. Your documents never leave your phone unless YOU share/backup them +1. Your documents never leave the phone unless YOU share or archive them 2. No telemetry without explicit opt-in consent -3. GPS tracking is off by default, behind a feature flag -4. Experimental features are hidden until you turn them on -5. The app works fully offline — network is only for optional cloud backup +3. The app works fully offline — internet is only for an optional OCR model refresh ## Built with AI @@ -77,7 +67,7 @@ Pre-built APKs are available from [GitHub Releases](https://github.com/sethusrin No build tools required — just download and install. ### App Name -This app is called **DocVault** — a secure vault for your important documents. +This app is called **Paperstow** — a place to stow the family's travel papers on the phone. ## Installing on Your Android Device @@ -109,9 +99,9 @@ For general use, download the **release** APK. 4. Tap **Install** → **Done** ### Notes -- **App Name:** This app is called **DocVault** -- **Package Name:** `com.app.traveldocs` -- When installing, you'll see it as "DocVault" on your app drawer +- **App Name:** Paperstow +- **Package Name:** `com.app.paperstow` +- When installing, you'll see it as "Paperstow" on your app drawer ### Option B — Install via USB from your computer @@ -143,7 +133,7 @@ adb install document-manager-release.apk ### After Installing -1. Launch **DocVault** from your app drawer +1. Launch **Paperstow** from your app drawer 2. Read and accept the End User License Agreement 3. The app uses your device's **biometric authentication** (fingerprint/face/PIN) — no separate app password needed 4. Start importing documents via **Import** button on the home screen @@ -169,7 +159,7 @@ See the [full setup guide](#development-setup) below if you need to install the ## Project layout ``` -app/src/main/java/com/app/traveldocs/ +app/src/main/java/com/app/paperstow/ ├── domain/ # Business logic. Pure Kotlin. No Android deps. │ ├── model/ # Document, Tag, SearchResult, etc. │ ├── repository/ # Interfaces only @@ -204,9 +194,9 @@ The domain layer has zero Android imports. Data implements domain interfaces. Pr | Hilt | Standard Android DI. ViewModels get auto-scoped. | | Kotest property tests | Domain invariants verified with random inputs, not just cherry-picked examples | -## App Name: DocVault +## App Name: Paperstow -This app is called **DocVault** — a secure vault for your important documents. The name reflects its purpose as an encrypted storage location for sensitive documents. +This app is called **Paperstow**. The listing title is unique; the Android package remains `com.app.paperstow`. ## Feature flags @@ -236,8 +226,8 @@ Yeah, there's a DICOM viewer. Built from scratch — no library. Parses the tag- ### Prerequisites - **JDK 17** — Azul Zulu or Temurin work well -- **Android SDK** — API 34, Build Tools 34.0.0 -- **A phone or emulator** — Tested on Pixel 10a (arm64) +- **Android SDK** — API 36, Build Tools 35.0.0 +- **A phone or local emulator** — `scripts/setup.sh` installs AVD `Paperstow_API36` (Play Store image) if it is not already present ### Environment @@ -273,8 +263,8 @@ echo "sdk.dir=$ANDROID_HOME" > local.properties # Build both APK and AAB for Play Store ./scripts/build-release.sh -# One-command build + deploy (default: release) -./scripts/deploy.sh +# One-command build + deploy (default: debug; starts Paperstow_API36 if needed) +./scripts/deploy.sh debug # Or specify variant ./scripts/deploy.sh release # production build (minified, no debug logs) @@ -294,8 +284,8 @@ This creates `~/release.keystore` used for signing release builds. ### Build & deploy ```bash -# One-command build + deploy (default: release) -./scripts/deploy.sh +# One-command build + deploy (default: debug; starts Paperstow_API36 if needed) +./scripts/deploy.sh debug # Or specify variant ./scripts/deploy.sh release # production build (minified, no debug logs) @@ -321,7 +311,7 @@ This creates `~/release.keystore` used for signing release builds. # Live logcat adb logcat -s TravelDocs # live logs -adb shell run-as com.app.traveldocs cat files/debug_logs/traveldocs_debug.log +adb shell run-as com.app.paperstow cat files/debug_logs/traveldocs_debug.log ``` Or just tap the 🐛 icon in the app — there's a full log viewer built in. @@ -355,17 +345,22 @@ Things that would be particularly useful: | [.kiro/specs/…/requirements.md](.kiro/specs/travel-document-manager/requirements.md) | 47 requirements with acceptance criteria | | [.kiro/specs/…/design.md](.kiro/specs/travel-document-manager/design.md) | Component interfaces, algorithms | | [PRIVACY_POLICY.md](docs/PRIVACY_POLICY.md) | Privacy policy (required for Play Store) | +| [LICENSE](LICENSE) / [NOTICE](NOTICE) | Apache 2.0 plus third-party attribution | +| [docs/THIRD_PARTY_LICENSES.md](docs/THIRD_PARTY_LICENSES.md) | Dependency license inventory | | [docs/KIRO_GENERATION_PROMPT.md](docs/KIRO_GENERATION_PROMPT.md) | One-shot Kiro prompt to regenerate this app + 10 key design decisions | ## License -Apache 2.0. See [LICENSE](LICENSE). +Paperstow source is **Apache License 2.0**. See [LICENSE](LICENSE) and [NOTICE](NOTICE). + +Third-party components keep their own terms (Apache 2.0, Bouncy Castle MIT-style, Google ML Kit / Play services, and EPL-2.0 JUnit on the test classpath). Inventory: [docs/THIRD_PARTY_LICENSES.md](docs/THIRD_PARTY_LICENSES.md). ## Acknowledgments -- [ML Kit](https://developers.google.com/ml-kit) — OCR engine -- [BouncyCastle](https://www.bouncycastle.org/) — Argon2id hashing -- [Material Icons](https://fonts.google.com/icons) — Icon set (Apache 2.0) -- [Kotest](https://kotest.io/) — Property-based testing -- [Zip4j](https://github.com/srikanth-lingala/zip4j) — Password-protected ZIP archives -# document-manager +- [AndroidX](https://developer.android.com/jetpack/androidx) / [Jetpack Compose](https://developer.android.com/jetpack/compose) — UI and platform (Apache 2.0) +- [ML Kit](https://developers.google.com/ml-kit) — on-device OCR and document scanner ([ML Kit Terms](https://developers.google.com/ml-kit/terms)) +- [Bouncy Castle](https://www.bouncycastle.org/) — Argon2id / HKDF (Bouncy Castle Licence) +- [Zip4j](https://github.com/srikanth-lingala/zip4j) — password-protected ZIP archives (Apache 2.0) +- [Hilt](https://dagger.dev/hilt/) — dependency injection (Apache 2.0) +- [Material Icons](https://fonts.google.com/icons) — icon set (Apache 2.0) +- [Kotest](https://kotest.io/) — property-based testing (Apache 2.0) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c5863e8..1e09720 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -1,29 +1,37 @@ +import org.gradle.api.artifacts.component.ModuleComponentIdentifier +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Classpath +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.OutputDirectory +import org.gradle.api.tasks.TaskAction +import java.io.File +import java.time.Instant + plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") - id("com.google.dagger.hilt.android") - id("com.google.devtools.ksp") + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) + alias(libs.plugins.hilt) + alias(libs.plugins.ksp) } android { - namespace = "com.app.traveldocs" + namespace = "com.app.paperstow" compileSdk = 36 defaultConfig { - applicationId = "com.app.traveldocs" + applicationId = "com.app.paperstow" minSdk = 26 ndk { abiFilters += listOf("arm64-v8a") } targetSdk = 36 - versionCode = 2 - versionName = "1.0.1" + versionCode = 3 + versionName = "1.1.0" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - - testOptions { - unitTests.isReturnDefaultValues = true - } vectorDrawables { useSupportLibrary = true } @@ -31,18 +39,30 @@ android { signingConfigs { create("release") { - // Release keystore - replace with your own before Play Store publishing - // Generate with: ./scripts/release_keystore.sh - storeFile = file(System.getenv("HOME") + "/release.keystore") - storePassword = "documentmanager2024" - keyAlias = "upload_key" - keyPassword = "documentmanager2024" + val keystorePath = System.getenv("DOCVAULT_KEYSTORE") + ?: (System.getenv("HOME") + "/release.keystore") + val ks = file(keystorePath) + if (ks.exists()) { + storeFile = ks + storePassword = System.getenv("DOCVAULT_STORE_PASSWORD") ?: "" + keyAlias = System.getenv("DOCVAULT_KEY_ALIAS") ?: "upload_key" + keyPassword = System.getenv("DOCVAULT_KEY_PASSWORD") ?: "" + } } } buildTypes { + debug { + ndk { + abiFilters.clear() + abiFilters += listOf("arm64-v8a", "x86_64") + } + } release { - signingConfig = signingConfigs.getByName("release") + val releaseSigning = signingConfigs.getByName("release") + if (releaseSigning.storeFile?.exists() == true) { + signingConfig = releaseSigning + } isMinifyEnabled = true proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), @@ -62,15 +82,12 @@ android { buildFeatures { compose = true - buildConfig = true } - - composeOptions { - kotlinCompilerExtensionVersion = "1.5.8" + buildConfig = true } packaging { jniLibs { - useLegacyPackaging = true + useLegacyPackaging = false } resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" @@ -84,92 +101,189 @@ android { unitTests.all { it.useJUnitPlatform() } + unitTests.isReturnDefaultValues = true + } +} + +configurations.configureEach { + resolutionStrategy { + failOnChangingVersions() } } dependencies { - // Kotlin - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") + implementation(libs.coroutines.android) - // Jetpack Compose + Material 3 - val composeBom = platform("androidx.compose:compose-bom:2024.09.00") + val composeBom = platform(libs.compose.bom) implementation(composeBom) androidTestImplementation(composeBom) - implementation("androidx.compose.ui:ui") - implementation("androidx.compose.ui:ui-graphics") - implementation("androidx.compose.ui:ui-tooling-preview") - implementation("androidx.compose.material3:material3") - implementation("androidx.compose.material:material-icons-extended") - implementation("androidx.activity:activity-compose:1.8.2") - implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0") - implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0") - implementation("androidx.navigation:navigation-compose:2.7.6") - debugImplementation("androidx.compose.ui:ui-tooling") - debugImplementation("androidx.compose.ui:ui-test-manifest") - - // AndroidX Core - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.biometric:biometric:1.1.0") - - implementation("androidx.documentfile:documentfile:1.0.1") - implementation("net.lingala.zip4j:zip4j:2.11.5") - implementation("org.nanohttpd:nanohttpd:2.3.1") - implementation("androidx.media:media:1.7.0") // MediaBrowserService for Android Auto - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") - - // Hilt Dependency Injection - implementation("com.google.dagger:hilt-android:2.50") - ksp("com.google.dagger:hilt-android-compiler:2.50") - implementation("androidx.hilt:hilt-navigation-compose:1.1.0") - - // Room + SQLCipher (encrypted database) - val roomVersion = "2.6.1" - implementation("androidx.room:room-runtime:$roomVersion") - implementation("androidx.room:room-ktx:$roomVersion") - ksp("androidx.room:room-compiler:$roomVersion") - - // ML Kit Text Recognition v2 - implementation("com.google.mlkit:text-recognition:16.0.0") - - // ML Kit Document Scanner (stable version) - implementation("com.google.android.gms:play-services-mlkit-document-scanner:16.0.0") - - // Google Drive API - implementation("com.google.api-client:google-api-client-android:2.2.0") - implementation("com.google.apis:google-api-services-drive:v3-rev20231128-2.0.0") - implementation("com.google.android.gms:play-services-auth:21.1.0") - - // BouncyCastle (Argon2id) - implementation("org.bouncycastle:bcprov-jdk18on:1.77") - - // Security / AndroidKeyStore - implementation("androidx.security:security-crypto:1.1.0-alpha06") - - // JUnit 5 (unit testing) - testImplementation(platform("org.junit:junit-bom:5.10.1")) - testImplementation("org.junit.jupiter:junit-jupiter-api") - testImplementation("org.junit.jupiter:junit-jupiter-params") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") - - // Kotest Property Testing - testImplementation("io.kotest:kotest-runner-junit5:5.8.0") - testImplementation("io.kotest:kotest-assertions-core:5.8.0") - testImplementation("io.kotest:kotest-property:5.8.0") - testImplementation("io.kotest:kotest-framework-datatest:5.8.0") - - // MockK - testImplementation("io.mockk:mockk:1.13.9") - - // Kotlin Test - testImplementation("org.jetbrains.kotlin:kotlin-test:1.9.22") - - // Coroutines Test - testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.8.1") - - // Android Instrumentation Tests - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") - androidTestImplementation("androidx.compose.ui:ui-test-junit4") - androidTestImplementation("com.google.dagger:hilt-android-testing:2.50") - kspAndroidTest("com.google.dagger:hilt-android-compiler:2.50") + implementation(libs.compose.ui) + implementation(libs.compose.ui.graphics) + implementation(libs.compose.ui.tooling.preview) + implementation(libs.compose.material3) + implementation(libs.compose.material.icons.extended) + implementation(libs.activity.compose) + implementation(libs.lifecycle.viewmodel.compose) + implementation(libs.lifecycle.runtime.compose) + implementation(libs.navigation.compose) + debugImplementation(libs.compose.ui.tooling) + debugImplementation(libs.compose.ui.test.manifest) + + implementation(libs.core.ktx) + implementation(libs.biometric) + implementation(libs.documentfile) + implementation(libs.zip4j) + implementation(libs.lifecycle.runtime.ktx) + + implementation(libs.hilt.android) + ksp(libs.hilt.android.compiler) + implementation(libs.hilt.navigation.compose) + + implementation(libs.room.runtime) + implementation(libs.room.ktx) + ksp(libs.room.compiler) + + implementation(libs.mlkit.text.recognition) + implementation(libs.mlkit.document.scanner) + + implementation(libs.bouncycastle) + implementation(libs.security.crypto) + + testImplementation(platform(libs.junit.bom)) + testImplementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.params) + testRuntimeOnly(libs.junit.jupiter.engine) + testRuntimeOnly(libs.junit.platform.launcher) + + // security-crypto 1.1.0 still pulls Gson 2.8.9 via Tink; force a patched line. + constraints { + implementation(libs.gson) + } + + testImplementation(libs.kotest.runner.junit5) + testImplementation(libs.kotest.assertions.core) + testImplementation(libs.kotest.property) + + testImplementation(libs.mockk) + testImplementation(libs.kotlin.test) + testImplementation(libs.coroutines.test) + testImplementation("org.json:json:20250517") + + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.espresso.core) + androidTestImplementation(libs.compose.ui.test.junit4) + androidTestImplementation(libs.hilt.android.testing) + kspAndroidTest(libs.hilt.android.compiler) +} + +androidComponents { + onVariants(selector().all()) { variant -> + val variantName = variant.name + val taskName = "generate${variantName.replaceFirstChar { it.uppercase() }}Sbom" + val generate = tasks.register(taskName) { + group = "sbom" + description = "Write a CycloneDX SBOM for the $variantName build and package it in the APK." + this.variantName.set(variantName) + appName.set("Paperstow") + appVersion.set(providers.provider { android.defaultConfig.versionName ?: "0" }) + configurationName.set(variant.runtimeConfiguration.name) + runtimeClasspath.from(variant.runtimeConfiguration) + outputDir.set(layout.buildDirectory.dir("generated/sbomAssets/$variantName")) + archiveDir.set(layout.buildDirectory.dir("outputs/sbom/$variantName")) + } + variant.sources.assets?.addGeneratedSourceDirectory(generate, GenerateSbomTask::outputDir) + } +} + +abstract class GenerateSbomTask : DefaultTask() { + @get:Input + abstract val variantName: Property + + @get:Input + abstract val appName: Property + + @get:Input + abstract val appVersion: Property + + @get:Input + abstract val configurationName: Property + + @get:Classpath + abstract val runtimeClasspath: ConfigurableFileCollection + + @get:OutputDirectory + abstract val outputDir: DirectoryProperty + + @get:OutputDirectory + abstract val archiveDir: DirectoryProperty + + @TaskAction + fun generate() { + val config = project.configurations.getByName(configurationName.get()) + val components = linkedMapOf>() + config.incoming.resolutionResult.allComponents.forEach { component -> + val id = component.id + if (id is org.gradle.api.artifacts.component.ModuleComponentIdentifier && id.version.isNotBlank()) { + components["${id.group}:${id.module}:${id.version}"] = Triple(id.group, id.module, id.version) + } + } + val sorted = components.values.sortedWith(compareBy({ it.first }, { it.second }, { it.third })) + val timestamp = Instant.now().toString() + val json = buildCycloneDx( + appName = appName.get(), + appVersion = appVersion.get(), + variant = variantName.get(), + timestamp = timestamp, + components = sorted + ) + fun writeTo(dir: File) { + dir.mkdirs() + File(dir, "sbom.json").writeText(json) + } + writeTo(outputDir.get().asFile) + writeTo(archiveDir.get().asFile) + logger.lifecycle("SBOM ${variantName.get()}: ${sorted.size} components → ${archiveDir.get().asFile}/sbom.json") + } + + private fun buildCycloneDx( + appName: String, + appVersion: String, + variant: String, + timestamp: String, + components: List> + ): String { + fun esc(value: String) = value.replace("\\", "\\\\").replace("\"", "\\\"") + val rows = components.joinToString(",\n") { (group, name, version) -> + val purl = "pkg:maven/${esc(group)}/${esc(name)}@$version" + """ { + "type": "library", + "bom-ref": "$purl", + "group": "${esc(group)}", + "name": "${esc(name)}", + "version": "${esc(version)}", + "purl": "$purl" + }""" + } + return """{ + "bomFormat": "CycloneDX", + "specVersion": "1.5", + "version": 1, + "metadata": { + "timestamp": "${esc(timestamp)}", + "component": { + "type": "application", + "name": "${esc(appName)}", + "version": "${esc(appVersion)}", + "bom-ref": "pkg:maven/com.app.paperstow/paperstow@${esc(appVersion)}" + }, + "properties": [ + { "name": "build:variant", "value": "${esc(variant)}" } + ] + }, + "components": [ +$rows + ] +} +""" + } } diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index fcb1987..aa33963 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -5,7 +5,7 @@ -dontwarn org.bouncycastle.** # Keep Room entities and database classes --keep class com.app.traveldocs.data.local.** { *; } +-keep class com.app.paperstow.data.local.** { *; } -keep class * extends androidx.room.RoomDatabase { *; } -keep @androidx.room.Entity class * { *; } -keep @androidx.room.Database class * { *; } @@ -30,21 +30,9 @@ -keep class com.google.mlkit.** { *; } -dontwarn com.google.mlkit.** -# Google Play Services & API Client +# Google Play Services (ML Kit) -keep class com.google.android.gms.** { *; } --keep class com.google.api.** { *; } -dontwarn com.google.android.gms.** --dontwarn com.google.api.** - -# Apache HttpClient (for Google Drive API) --keep class org.apache.http.** { *; } --dontwarn org.apache.http.** --dontwarn javax.naming.** --dontwarn org.ietf.jgss.** - -# Retrofit/OkHttp (for Drive/S3 backend) --keep class retrofit2.** { *; } --keep class okhttp3.** { *; } # AndroidX Core -keep class androidx.core.** { *; } @@ -65,4 +53,4 @@ -keep class dagger.hilt.internal.** { *; } # Keep auto-generated code for Navigation --keep class com.app.traveldocs.di.** { *; } +-keep class com.app.paperstow.di.** { *; } diff --git a/app/src/androidTest/java/com/app/traveldocs/data/local/.gitkeep b/app/src/androidTest/java/com/app/paperstow/data/local/.gitkeep similarity index 100% rename from app/src/androidTest/java/com/app/traveldocs/data/local/.gitkeep rename to app/src/androidTest/java/com/app/paperstow/data/local/.gitkeep diff --git a/app/src/androidTest/java/com/app/traveldocs/data/scanner/.gitkeep b/app/src/androidTest/java/com/app/paperstow/data/scanner/.gitkeep similarity index 100% rename from app/src/androidTest/java/com/app/traveldocs/data/scanner/.gitkeep rename to app/src/androidTest/java/com/app/paperstow/data/scanner/.gitkeep diff --git a/app/src/androidTest/java/com/app/traveldocs/presentation/.gitkeep b/app/src/androidTest/java/com/app/paperstow/presentation/.gitkeep similarity index 100% rename from app/src/androidTest/java/com/app/traveldocs/presentation/.gitkeep rename to app/src/androidTest/java/com/app/paperstow/presentation/.gitkeep diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b303635..4b0fded 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,27 +2,30 @@ - + - - - + + + - - - - + + + + + + + - + @@ -60,7 +63,7 @@ - + @@ -73,7 +76,6 @@ - @@ -84,26 +86,23 @@ + + + + + - - - - - - - + android:stopWithTask="false" /> - + + tools:node="remove" /> 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/boarding_pass.pdf b/app/src/main/assets/demo/boarding_pass.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e8764a651030dec4f7424d776357414d68cc33fb GIT binary patch literal 130660 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

7^U)>#l{9SytnXi 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 Lojj=x)#3UVHt^W= literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/boarding_pass_mobile.jpg b/app/src/main/assets/demo/boarding_pass_mobile.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da096d348487e080f0cb547d2514f2485ae4b662 GIT binary patch literal 54839 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/jane_doe_photo.png b/app/src/main/assets/demo/jane_doe_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..dabeb6eb79d85de6c3d3c6869295b03503c31955 GIT binary patch literal 26358 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 Ww5~UFegS+u2jq^??W&s(p8h*uegy>p literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/jane_vaccine_card.bmp b/app/src/main/assets/demo/jane_vaccine_card.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2f717a5f8216ab428b80b51d74c00db9d4cce8ea GIT binary patch literal 237654 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

rSW?E6g#Z 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 NqCa;|O;?@%-vDVNl868R literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/john_doe_photo.png b/app/src/main/assets/demo/john_doe_photo.png new file mode 100644 index 0000000000000000000000000000000000000000..78c4812276292736d0fbeea95c4d538d7a5f5ba6 GIT binary patch literal 25019 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 Ar~m)} literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/packing_list.txt b/app/src/main/assets/demo/packing_list.txt new file mode 100644 index 0000000..bdf6b0d --- /dev/null +++ b/app/src/main/assets/demo/packing_list.txt @@ -0,0 +1,11 @@ +Packing list — Lakeside week (sample) +------------------------------------ +[ ] Passports and visa letter +[ ] Insurance card +[ ] Vaccination record and blood test copy +[ ] Chargers and power bank +[ ] Light jacket +[ ] Medicines +[ ] Copies of bookings (also in Paperstow) + +Sample note you can edit after import. diff --git a/app/src/main/assets/demo/sample_trail.gpx b/app/src/main/assets/demo/sample_trail.gpx new file mode 100644 index 0000000..5c73ef7 --- /dev/null +++ b/app/src/main/assets/demo/sample_trail.gpx @@ -0,0 +1,23 @@ + + + + Sample trail + + + Sample trail + + + + battery 84% + + + + battery 81% + + + + battery 76% + + + + diff --git a/app/src/main/assets/demo/travel_insurance.pdf b/app/src/main/assets/demo/travel_insurance.pdf new file mode 100644 index 0000000000000000000000000000000000000000..026666c3bb76d1f5806b27fae14f563252f610cb GIT binary patch literal 144499 zcmeFa2|Sc<+dn)aLJ?WAjzYGOonj^lA<4dlBnjE~b(AD~2qjEek}M{(l-}mpi>wez<^ZwuW^M9ZJdwbyBd%xb;o{|P1CaQWb`zZk4z@O)e|xXtbcILeZ-pQb zfPi0U_<8GJG~Bjzw)1?>cmDlFiMYPk1JA#4RKp42B#*eU{X?L>zcoqxmaV{RWTt4SP?IySDBsE>5m4&Occs&m*p8|HRYQ9Vn(^aMRYt zF3}@-i(lau#voM}Je~$hv3z+ph2L~4y7Xu5=MKI?@c1|wNpAR8B zdGaI`CDj=!sxzF7XBj#FZy%(uAcj+v;}m1$WEVjv7|6&O$Ve?9FhJ)?vcDame;i~d z$SF=zQk|lvp#=(*p9P&DBPTyWK@QMP0hA5`z6Vh-oMgNpp-g#B*P8008oC%*xLBnENU3b4h7gc|~Pabxl)q zOKV$uM`zc-;Lz~M=-7{O)ZF~S;?nZU>KbNecW)nifIB?;*)B2=`QMubT>sv%e`yy3 z(5@2{6yy|CKifri!Us6X87NL(kf3B#)}^v`J9km?=_#fg@gKf4Qu9jbZ8JY`@26qm zlSc7lem3oIE&HEq*t7pfE&Gp#{j*);pwr}JK9EtfsPVk zJGms#xZ@JLu-}3k3FH9O3*WX{2vQ<}&cH|@Jr|+@353@MZvz$V0~IXlkU(Xl-=uZ> zc!%)ovUvgJ)`4#LBZ~yT2+SKMHQ|q(@Rt-wZ%c-rVE2kVw_t1H9~@U8-E z0!|!7xoObD1vxVQb0z99+`q}EnXwCwa>X6(^?%W zIgvo^!qxm^D@TQ}1(=6oN#s5hX9tcz?uo({_A5ys&LZ^s74gnm76P#mLwWl!;ubLq4>pupWjOu4zetf-hxv zNw|A!ZnS3B(^}%V=C@9-vYJ)oy_aSW%G^pdta+v#%46qHEr77T_b4KB8W&|$Hc&Q} z?1-;qXy&+;S0ATb{gNCbJ?`kfsOjn;8Kr&5Bv>@l3Ol7}KbtOs*SF|58)*J!5}i56 zcBNguL!HlaJ=&N-McY|u@HN-R0zy;dW}xVHKwE>%fU)8CJ++!*yT>E?9;f|m*F!d` zkLHSMG7y7niukLis5 z6O%t}LhaxYvdKG>+Nho{H^ZhHCZ4#yf0)6S+bPz1Y=qo_R%ckNI{WH39*xHAtK_W6 zT0LoCC~GiIjVENWDY#R)O(T4}QOF1)xG)~W{T6${|DG})mpxO;(J;?x$eeM9RPU$DW7BH_dWRD)WnoWE>T#kPb<4(C` z6C&xm=2(FdZ;a#gg{s4iN6K_cR=+bdYGFTt?H|#|8w=!debV@%mbQ?V`R>;2N?xIp zn0V2Hit=Zso3{7Av@){z2)qZmYy0!(ZjeBji&!%0VAk}z(Q~G#2;^3>D@>Eo#k%SB zS|EcSEV*deXmiuFr((~0Gt)yHJ*+_Jt`F2Vhfk{TBs&K09B~;x-A9r^?Ih#Zv2~*>()-e0i(t z9W0L11*|$`tKZkSc?KY@cG680iRdexDLlpJ)dey${N1#-VNHE3IBeJ4Zu7X#gj3nDGr>il@<^;3yI( zg1}b1Uc)~X?d)Ap^fo5$y<3vNgtUBl4QKKGeS~0HJzLLzJt5;?KUmmE`Vpn-&r-jA zt$mtpK&;$J|N3KTyy}c}z8A$i%Im$u?mCuDb=Y^>&IYT!@5%-(Kd5>`=y9fVGu%J! zS^5TO;GN3rG7RFdFSEwSsLp#+Y^&;G!b9p*XGLlQtj?|$+RAjXU8KDE>S}1{3pHK^ zblQ%RDvNj3lyIctrq~qvL$9udcxVF{7u7yErHq=ohAtWZH1^>_Ui z0ujMrTvp>(+3F9|KW^Tk=;O8#81(I0#^g8r*9~UzDHb;5tY-R0cm3D~|3Ek+$5N@5_`!%~C(4SKE>fg=yRvbH9XF_9VXV^6zSfwY zWvcy6VlkzNyh>m_`fg&tIU4tOWy~}2&AJxgXho_yFqx(KxNrC!N1;vLT^nwPTWlV& zpIW@Qq~N{PUE1bunquO~n%@Kwcf+whxFomJ?(L}h{*Di?k88#ra;p={5K1GS0bBHI zmHw7F&Laodg!3OGUS2Z^hz{N7WOo*Ij!b8NJ-p0Pud5ch8VH`HXTTjTEzLC7I9hf) zJY76qQ#*U^X?HQ_k=N`EYnL^$L^0wT@fhh=Maz%0r4e z`Qxis4UywAv>!#7%!lR9Qm?g;eO1zC2{^mjE4gSt*^^mo#X{i6#69)w*cXMVgVmK$MI!I~uGK*`0m;V%%&O&#eO9#Nyh-M*QLSz4(A_NAU0?^SDBn+x zD!S)jd1|n{Q;)y4deElM^ZE^{$Dyw%J)+@OZAj_$J-a64j>eu2o=lkp%ATtc?5x-f zqBMS)Z=|oEv=R3P=!Bv`Clcs7k{&jzI79HS5&yxCLMSTFbA;1yKSsqr+oPz>5Lu!* zvcp~@fnHTcl0fUv!AIwYZfJMjn{Rv|Y}C>`u8Bo1c*8k~3cjJJ@W>76Lg8+$s*0)- z^AtI^j=rjnwd=xb63@Bn9fuVe5V=Y=JY6J|1mdc^-ydW&`|% zQuq2Bcvm48ilYuHUQOP!m(zmRT^}FAUZ|2e-2FUeg=1|Ul@0sm9~|(H4nn`nNFY-kcK_9|dkCDx(xi9PzrR+t`Ho^O}u z=XRegV#Ds}eRHc&BsHt=jT&xvb-2A9uK@8V9*J2y%)(mMrjkH&i^Ib$FSH^yiumIv z@};ga!lW$2@%Ma@8~&FPQNDaFl>~i4f}h2EyyT;fu`0$4wLdB0rrSjs#y8{ij9f%iF84w(8^*Vdb(*=C2V05w z1?Of2cfocH;KasV*oub5C_0Xq+lbtv)k3;UU6ITEAFVinJuq9S=-QRJ2 zvv!1J=o#4PH~5k0`c~9pS#|W7rJr-kOU#>xtHSe3_k3pe_7G2rl(0^l?a|}FP7)|{ zy5aS4wxYJ*EE?Lxz8LyosojY2WG^}5HR=^!GJ$?1UEr~-Q}VDu@!-23&>hGVjKI@J zI6us@ZdKQ|VXssCW%0@z&$K^==aHL1WnOCo_1l!{=ZTCiizB=tGyizh^3Uzes} z$?u~*)nBTfZAwyo!!C|~Q`xNQz2;;+jR+ngd9j&^MKv@Z?al-N0u4^&EYfxHa z%VfJ`Vh1~O^e!&WG+8?FZpBU^>JgiS2<2tEMxxJC@%5w)Txn7U<;`TF-i zc|g55HKWc;8~uszgOP5C2G>zA^KMGBOGIjWGnf7T8S(C9p&@k-M_KRN?-%SipD8q= z6NeZ@R+YfmlI`R?#^%D6qph=y3jxTQ7%WDfHPHeeGSeOcyU|2 z)#~&aEw$3pit4)Xp3*B81cWPMFYUA;IxZ&lTkjZ~69R zP2gDajr7WTnZ4Hi*20v~mj!inIlPn%#OVK|`KtdJr#)a}Y@&dK01@k~nI$qaz)M zr&R~W#G}v15_&>J&B5_=Dq@t`7raFkn10W*@0*taPtb)Ff&+3RlmxoyTu%a7lL6&N z5Jby#9ip0*`1c%)F*Xt-5E6W0&FoA@diJFKNQMUG08T7bW}$2hmJo8H!3W} zarOaXIZt>?honp0`1E$HznQns5iEzfpS)6#E$8+c-f=^-;cf+{)wn-57Z%MsI<5T6Y7K$4LTJS$vaCNk9q9{ z-nO`9?mrR$(YGOQ?jh(cajd9lGuhB5V&&#%6tfxfg{hrs63j1O2UUx97Cdg-JdWcP z%IYy34p0sLueX8uIc=KxW^SILJ;yJ^cx%^fi8eVWd5Qprj-%0G5~wuyDZyt})X_Aw z#Y|;l)hzmkmHbq*n1Fse&B6{_iQAYlIo{M)1ux!O!OiujkbyH?rAgo4u=#1}cM zH8CXW2K%+_7nIdY_?T50eH1|?Kv&UQ7d=i z`gTpdoAX`Y8~EGPN^j_fXTjx;!UVl9b{1XIV;bC9-x5A*4sG<_Qx($tidS%kuk{7u zL;#Ti=QN9x;i$@FAD*hJs;_;0x+&XvrxEI9;I+>KzwHMF#1_Z=z2Qqy%~xgO2j?H; zLEdv^+=oUvl%T1;CmxHe#Br;Lm2dC1=-Ov@%PghHhjs%z49mQB{b+d~(NiO=(a6uZ zOEcJ{#`NiNoFB#oE#Ni}Cv${w4VT?|Ut52x#YZ-QE2Q9M3zPHprVM4M<{sh)74ha& z0I`W2n2&{lepc4R4(QIM^%?A0@R6v4eP@?{+F_7?(ihz%b?-zeqA0N+BDl>OSFTO2 zUEH5jTE@T>@W$4j4j136*+FHbl;1({!(Yd}n*)dEeBamNy2zoyr$Ia3da=P^!F}M$ zvB)Z%19$}MHfw~7^cl@&)8w7+7knyST#DXOb$d2I-XHF;y%me(3{=8gYZ_snA!4O#(R^us-{H3ZOI{DPqvQ^jW(9A&rml&)@Dwl>5^np z9sDo2uaiSMF9;O1HO}rgas^3xq){5lWodbbMna$k(A>P!PLG1I@^Uak!7@kd+YfuYE_jX zPLT$WXkVo>J^PAz8jTq!OGv!ayX^FMBu`B**EmDTc%K9U9cqq`n|Hr)dLP{hNUAZc z`4aM=V3{LkigBw(*o&+Fmc=ao23MMe?jU%pPJaz3l?wLSiQ5=P(c?6TeB;yF-0Mor zXVw>7A9AWeYGb!>WQc&{tU7^tFz2e7S{y1}2yuDDsJaHQ@tmEc9J+VyS@16S&g;C7 znF|r!AA}7AEQQf4NW}UB@$tkal@>7l+z5I|sW(b6#eMgU6%CHyE!VFdsB4uOOxa(q z1>kaIud+sM+-7a-ED+0-%zpR%#M4S4o`g3_{!0xY%%w0lR60z*zo`94HLUq-`}wId zKr@I{A4#$;i{5px+;hxvwnZTJ55d`2)?~+ZUZ4@q3k>GUP8=E+R`Q=F1ce1w;>~;o zHm**m&vie>(7n$bS$R6}5PSh@a30W^ytbeWfT$G>sL5C=mt)p@ea(kuTd{De%X`Q6 z(WT~f-lGq}X&SUbXW&M+9|Gv5;et`gMWuW9488V)3oZOVAWMNJI1#~tQWZn{oGLzr z-Ap?yoO5c_CxWj%J*v(n4#9Rb#bE0@^h=K5d7tQknRY0>BFDo(0zwxVN^ z+pZI9c>!lLmw!e?qhw(DZwi)U)q>sRLoXg?uk%fG!>z=2*bWQE>ev<7i*NX2VJ{ob zeJ$tPP_K!T|RB7;9k46D;CHH z2u}o2os(R8TRO4Rx>Do!Za^MShEVfDn^frN0%9GP(B#b(4d;&YMEBk?Q`?=yOW(SB zv5vnf&bk&H7Lc?BAiZ8#ovu^7TxPz`Hdm>?U}Arpf4Y6R?Rw|hH;;Wp8iW-Wx!#H_ zqf9KE4iR(N%6^;V&m+;m6hQVArz=}OJd|c=QmIC#sjqF3H3j=!uwgMChm}_n61C{@ zw5ouh@evUva&?BG8E`?=A#VnRZvcP^ehm_611v{;p0qgw4i;U9(ei%hP%j@`z8aCH zh3%NC*x12TIwB5wJu-$-&=NQyNq__@4xBk+G#(^@7>S}Qa9Y;eP7g-!ra4?vW*wVX zn<#bmarPqO+N7q-a<^S#Ncde0H=fz~Y*PR{D)D$H(I)7f!K#|HK!e(WZ0XaiOa#x3Eu&L!>i! z7rqDhuS(@_{BQ7G{WtrCj@h;mgoL1T#IJW@tMZ6m2VoRMrIIT8s5Ei0zNz8uaV#)5 zMCXu4C@SLf{aqQREHPsbP8k<#Lxb{-ATm6lICb6_fNn6tkFJ{SyZnH)&uk~)WcFyQ zeH^Z`oq881?i>u*nM2YL#kA{IO#KF*&F-~pD+au{FscNE9w-Dk;`f4gg|rk>+?P@ zJ^)jz>D}SwFVe*~Ytr9+>P6?*#vQyW2J2d#(7o|_V{ph|S7=9*IcR}^RidAbivkQZ zw7A49%g#&P*HZ9YodV?DiR1!fvVg%aWOPODb%uS)gTpZIt#@@7;RG@?5nFO!x$%`<{KDjuj^??XS)vU zba(~iLl{Mv0A9aEk^T_(Q;HaElh)N05-9o77g2bpus%(}X}QXHrLuABkiUWP=bW}W zIuq>Kf9KqSkNC;xqk^<*7mtC4-;~|@b!-C(6fb@QC>}=~@W*XNGND-+^jh&(89#Jm zydWQrUqdb&x=-PRkF1ilM~yh*)YkcI)*$zl-i_3&|E}C_J27h(W_7vfNWOO6e4Z7= zUf&mZobIeh?~#j3RKujDnwbCKar7KIb=^ChB0tSZG4?sPr@cBC#} z(d4`j-_r~&aByxU&PHXlsEq!siKF)dNB6bY)fQ81NtO5U+~Mn{o_cAMFI#PFEp_cp z)or#Wpv=DK=2M z!QobvIsFaL$+3Gk`*I$e4q3;yGhTpJEe}Z$<{kD(pg1V|K7H5$yHae7i?v&jZ=7_u zZ)_tk#Yr9!aXvslZ*W8%2^wB5c!i3?8syx0?Pu--sJ64<>l4AFmRDFAIATPUW%2EA zc%R*G_2{L39pYxWkEw0Givwn?HX+$0)#ReZot_~(@8PL-e1{4BC&W|1kDqI$_qi0i z0u#cl{Gdv4#U#)}@ZmYHE&M6^W0rChl(XnjDXwqs+B-jXAyjqbtp$~5(Y!ZKLEcC1 z3Jc%cVm>GQroo@#gQNRCR4tepw+4QhK{L3YBrMi-DCdSCl%~5?*%T{Y!CG61{ibQv zU5d;zT#AWtV~awl>b>^b@>m0Azf~D`3T2cX3eI9dt5Gnd>If4*s^;YsRvoN zgaV;Bi|yU7W<3?@UM_BPe#z36c-8Nzv%wfzYu2zs6^}9>wxSd)V2+NLvjk>b2w1rKl zZXV4bf}R0k8gbHp0ZaaR6KYX~<&NGVinz97 zm_0bk|D3PpdQ++@f%PZ`pE=3lLzj%nr&O?Rn=?4=Zzn$w<>@zCvwv9N)py0R*I;E( zw_$k#S+eyUiUQ*Tj`O7hocB9#AM(c2EZP8uci7kU9z|`uiEl!8i&;)ZT<%K3s_Q*P zqaB^o1v?kNkVP<(^-2xa2TrJpKi)|A{`QfSL6&C1Vr9ni4=4o$x;DcQXz2D~y&~1A zRHjt>$%tDGi!HBvdhd@z4Mm&H)Lq1QcN6$WuvjsMiDB-HC0OhM6`>-UEOGw^@}Luu zvGQTaS@z*jdsiX7jjqK3^hN_Ouz{Qh@ctWgGe=?#5;!M}hb7MJ=xP6aNyfF=j3>q~ zH$#eCn;pgI`HZPl89z;EQwo5EOJi<{8Kro9myTmvU9omEnr~_%Z82dL-#z(caNE>kEibfu!LlA%JMGFo=XUF$2d?Fu!+q8N_o9s53|sZ z$;DiVMjqA&s!qHZcx`}q>9Om|QQ5&Ob5+;M3x!;U2f`&!la0j91&n#%5ZSMF+nPS1LTh^)9o zz^J8lA{{@90lM^c>G=zP*QG13Rr11IZO(65WiaW*+)PT9`Vbd(6;QRN0n`=jo%lt_rGEnhRIms!0mhk1;%WxHeVh74QW^U z{nxPqvHlldpbmB-u|VuhnaC3RGQ1@)*pYYuO<4ez(mciO%zwhe{(_19dHp+2 z$XB<1kQ431@g4wLZhvn-uo=$-`?g2|Im7Ul4H<=~ZMbz3tVU(|uoxKAeb@i$zn`za zLmt<&aE@je`t;-YYzOwZ_{ttUS831UviwvTryUjBp3I){FVhA3Pki5qsHG9a=A5$e zH;YSX81d$I9L{K38j$tXTfjI`KxdA~A~ILTKv#4zR7BcGfEUhj&nPmuhYL35Ndl$A z)2+4(>+AtzLflK}wz(W&R97d6xUj>%XU)+QSOBG=Wpt&GDL@+hr}!Vv{22s)rpKR^ z;LjTQXFK?_QT~w${zyxI1j9cf^S_aHV4B+gq8vf*2OU3B`;hC0uR~OrD?%Pgq}PV@ zN=n7)TIDeR2He#POX_{{$dHD~)=;As_9pn(h_)s0Z;IbN$hqMz-!kDfqv)y|D z)eHLT1eC&GLa5^YdEefzL2g;UYV@|)J~)6jM(h)E2ZwZ39fJM^bN{ax{Qv)c25eBj znlJta)JFbCB;ifsxxOCQl)w(*`+wDYXK^b3b5QPI6z~53L8tDgOh917N666~xDGHB z^7j6_k?a39^#MjJz^wcqd1`X=e~&#phtq+|004V<_pb79Ru#k>*gx$bqk}^#sMGn! z17K)R7?ZA%|F6xb`fYFs{$jjT{~uUWteyZ?utUHOY1I{^q{?KJ`yIeWbr2Osqyyq& z{p(X&R$ba(ynji1ir4<8$g6kvUJ@Uinn|eJoPS^N*n?Ue)0{9~d^kf<*ZV{xSRllQRR<@-4xEuN2<*g6p$|Rv)$0eO8$*~m)Jxj2X zO`F&V7;)pTA#wlY^!;N-=bf0khjR~mE~Dg^%2iREt?MyMejuO>-A>( z45CWvD@Q9;*4RZBV3B70;f;MSxfx)fPNk&930Ss0X0k4F-aqX0`2>|s>(JwA5g!0b zm{>akTaSXRN*V?P`I(JiC5at+x#$o2Qwy(?hT$~>rN-Vf0i~-oB5^n%vVyN0K%`)4 zf%w+`M-7HJQxb^AhR9$D07=)0Dh&b4L@0C^Q+aIMy}orP$5KO(=-ei+Sh+6EZ@JSy z-XABmKLvKuH9ewWVHsz6OZmFiv#Kyt%dngC##sumT+e~qDBP?YqZ3zmZ8mRjOlC@D zBVomtiAxSG^+_9OOS==rFFiv74o-59gPjKsyD`XJ_rI2*%>NJT;$*_!0nk| zR&$FLIZ45IIPOX%z)52{!g6P6=0{bApZ?;AY(pM@PaWCv_u=G7#euI6-ceP5AJ9ACl z=+Q4X`_AO1UffNiJLiXT_w8J@)F=vcz=(%lc!qC9(m8wfT++Cy?d9^h+0y`yHK11+ zimcXF_jpJDJpbiD(mS*#yi?9+M=2xnS=Y`PwXX4DfW{+4F)3{` zxSPQje&BBUde7et_{4HEbsRP=RqXVMS0psy{lj8%1tr1PLxy9YtQ|(*g~@m)235>> zj66n&k2YM;Fbd%2Hb{cp?ZPIkJ2C?Ja{b$Q+d`So~%LWr!z>NM|w zr^|Vq+E%ku0at|&y>|*j?L!d9V-7za?y8PnD(Q5SLJrwji-^~LSsaD_g--S5Bh$u8 z-jQ>G=5sFRSB_E}-{V;E-YqSh00K(IDZI1miL1s}(DHOKffw_Do=YIY)4cG~y!zc*U3U0l6yvUSO;tZz_8wVsXaVpb3G|46V^OCtTyW0>3|rXz$m3g?kaiA{n*}$3zS3EtEeQa6l^ur4aXiK56*UMms$A6T#LO&gRti& zs?n0YbRg82c6*gfZQ-2#Wteo$IIaJigWP`IEB}|i|2Ns%eV3yMx_qe(Svf$+@}r!h zRo7dp>5DN5QxRvM_6{DuQ_1hRr~kPfT`|kKLK`J8kB)A(HB9O0M?EQ^eD_Q6fW(%3WYPN_C;rDPoP? zY1>lMSd1sL?S6a9ws%SXYX{G6YmkQO!(xolsLeoL`bdgWW?~W|XD_zf{Ai|n7x`72 zw#AZSM9~&?M(fTH-5a)#rASBPTbFDPsg2qs*X}+|JkY*R0OPa*=5)dugtup2J`pdo zFWRz6oi?vkSC2_j<1(z+tELRzA z`F$nDrqRnYJ7T89V*<- zgebI4A0Frkc?YS@Jub447}qk|&5rASB&>0G-fmO;-d<5cWPkSX+eY?;T!_C@>mhVV z0bmv`2&H1-T#C^Q?N+a;Vjve$&rFW_^aR7IdVB4 zL-S@Nm7=cAwtCyhsI012kJoI5s3JqX9-HBI041+a_r^60fS(k%1VB^It!{6(eL%s_ z+WVwheB`S}mPnX)sLY>QSV)s~i*2ia6zQ7zeo&_)?T)>own9^ZalM#}`oo5G-WVLh z2H{{uU)~L%i6aU+8D9qGjxD(8q0GMsRnZp)X5|yE*4E(yo;+#b@=Xdfr05dgr_D}^ zt`=?4J)uS3W_}+;mz|1#7HKH>ITjs9_RgSDC4r%#ate`HvEH#`gSz1np-MeI?}$xaks>>u=Wi@U3Has%=?Ad zUJ@*b1=fcCv3svT+#tEt@bU=$Gjc<}up=ai|Pl3g!?ia`s z@DY5`3m)U237p$^zM!@uET#Pv#Q|a3eKmz)yls`YO^VOf#`Mn3m=OPSX`IGGWqMfJ zcd1M82^ppE;zgrH-Ko8GC&bjgq8#?#cP}e?oVZct@Lu;6#7~CBD|Uw}>}}wuw(Iw) z*{I+SgU26{3-N2P{plGJNR4LyXo=u8TL_(_4;T1eu2A%$EWQ5++SIVoh~j=p{E)xl zRqvdRS~hj=&o=W>p9-oIy>}p9BQACNb8*jz?Au20*&ZXucliN&l^7mJl~c{Uej$Vc z*Y_{l6c$F{Q4m(&xW=Q(W(4D^Szzi6fw#gNn^I9x*KzyFH&ZG-IxIQY6?sHvpi-te z&hf@zS%7*Hx(vrSE&KY}q5+7Shb-e7nVBJ^QD#fYlRy`q*2P#ZC}!SSUQ{;@sj(kB z>@3qcOEAWD1IS?}xo{aJTIKHpl2!&$ovB9Zb|3*u(~wON#c~>;J5c!s7?&UCD4OT% z@y8B*B?zbnHHqoW73Ngzi5%P1(OXN-Om4- z3gBKbFr6V!JX-dQtH#Oto}SvaSgu@-*RSNrs<@TZ3$?bhj4(P)PApqZsmPH1_0@#c z#fqB23yjT|X65ZVXe6c5_7tB+9zi0Rxy?;C4DbCISvKTJvvrc`Z#6qm^uUI0XA=c+ zPh@;QI0o6Nw7q|7E_xp1mtW;i|BknYrtvs+Z+$A*r^ie!WkjM~fzb z0L z|0gegH^(3O1N{P6d;ZF!p$mP!3nbCdARwi|zu^%7HCM+?$k{)(`Tvx+=l^}5!M}rT zo*4s1t6;X~pv_xRRM)pFUqYI5Ipq0FAnh*Vy@#Dsd=Gb@&M@)2LMAgCC^5z@$niv! zZM6SPWK)dLLxV@jBW;gM{HbK;-9rZznD^zrf}oooROPFuPhzE)H&9+P_dc$XwvGwHQlDr|&B9 zf=0Qsk8`PB9Gl)xFwFCPry4{)Hxe`Z&a332mbOZZ-fH1B7iit7(9;raL0@!Uiv>Yd zjRu=V!#?@lEV_7iK*X8ORe`D@$nnJPobj_g{L+_N3@jYIWq_95b-0@ya^xhMHbDL< z^NS3E&DW#Z+j}&%@1=C1Z12h(^_C0o3xzvUVUKv^I5B2`6lhyu(g@47G@mw^6vGvX zW}EWH2N}M8rC#-(*1%ZlBM#r>-;1~u_YnubSwEa5#@#he6cW%w`ko(-I_)zbspSI3 z-PyHpqMT@D=Nn(^z;Io?hD%+zdcq>`{Y1%!J8JTcd++HYBSqSPB+@_{K_G&Nj(E;; zJ%b&Ir_19SVkjWqc1M{OH#_Ew>o}a{?o+h&;vfwWQSK9>Vvp7C=!5Du3w z$8kC?)0#|ewIh;g;g%jxGu(QD$hJd?>{dh;?syW2mX@f>sg3PBq$Gj*Sa*QT`vf5O zkE|!bw?~fQ-cf8MVIzEgrX9`_s4+wkKtaz2eLO&?=#Gyc$F@Rl{pgkJJkKe7pdi2L zc$+u~XAeG$Yn#!;CE7EOTk~fO1U%-A|L{N!mmN-{Lq)a3MxnoG?ExUdBgf~ibw75# z;Pn05vzso4ygZ|=u(C=tcs}k7K`*hX0W@qjA}To?Jo3e~*>&KyLB~uG2bs;pVAYeM z95?urejx8fHy&MP>!xsWOPNm$0ym4F-r^uDGI8zFZYq;pUj2exqGoS16LtK2Rc=f?M`HQFe z+e{Y@c`ceRzqjLEbTAs24Z5Zp?B+`~9|wd=K@F-06@?J6$1~>Fo%!N6Qa!KPoMu&s zXW}+FO`hR6Lp%fI_R@eg!E#|ufEy!T=OGdp&98i>cP8wP;P5TOT>&y0bh zC4jYxwRtO=VTGF$LpA1^=;(AIbi;dx(0gaTdS0|w$q^l?ZSr?RVxSHtcWwqvj_T2B zHH%HRIgXm0Vn3XXx{IfEO_Vje_1o0HKUo=CGx^&UWZOsya?p!R*^vR0w8BkYiH7Z;DYAT_Bga-cV8 z>(0B2${Z0qAyRR#6ITL7^l|feb%I>UprYfEB$a5fBO3*oAI-j1!j6;7&H#+ehI9}*1mmput=f-ydeZkYW;_`+$o17ohQz0@BrOyZj&4+XHn$GHSm1a1+C z=~gR?JmZydi>JnTDiL;{G9JK77 z1~}E)Phzo^6V|f8thitu(kKv`w80Abl-WR2fBe2diNH4ESsl!0|7FTPWuc@|k!9tf za!ey%Xqf9MRB3c{B>tk#c`g@JVS6M&gsmZYUNeCNy7Rp4Ubnz&)3cdriM2EaoXZzq z6tG?$7uhYHV{Pvn7jF!|Q;PxeFKx%FeD-@WLcg(Y_3qKsj7WY}+dh75eIHTVz~xYx zy4Aczy;k#l+UuB@Wbff7_Put&*YIsIh@3Am1oR>QWN$K%h4bG|7yCESxq_XD832Ydy|9xec7k#*KGJDXsmjh8w>`Rkc<)MQ1mmYvlldWAfF7}mcVxQS) z#Y^ET^{RZ4D4`^?{bWf#EmKZD-6DU9JLj>Tyz!k!8DHwmQBm~lzBWeN*pCGx?CG@= z-DRlPSK4NSlpDEc^{Py8Hdq6k5Naldg(!r9#x{%=+)2?o!Iz?U!Jf^huBfZ=%}&)a zmq*4A2wm##EIry9i06zA3v#;@=JVNnbzq_c|GapTLa5496r6fxDp-Fk-eM*+_$J_VT+2mwOHaOZt*&`)>`@##97AQY9o~dEZO^Xyts({yyt(9S zl7A@CmXk%{IcedsM#e>5uoW^>65dP#oh69(%gmfJ>HF-E+Hzv0sy2b|sY&|hOj)+C zZCZ9|qs0V!oB(|rG+fqgH!ly40vZjz3%fQ!)qJSe^GY>(=8vfg2zPPxAJ?ovMFi>(s#56} zWorhW_cSO=O3B}wPj5_z#8|T7vz|HaXczA94@6rd$b7k&KCMn5%?LBVzaHS~o{fv~FG|XK=2WL% zf*l{BTsR!?V9=fDRe8F?5>^z_=XD%P00ahG3^)#vlp0V;>??~ueDFT}ZHfP4#p$Db z<1Cy97D#yU95$ala}J1=713&zjx+OHk<;T(u2u^eIlK(TW`nv*(C$G^`%!YtG8Ex)tA9Sdcue!k5W_ zg-NG9{K#s@=_;XlPz5#^?X#+Y6JDjO6Om4^y{ktobuL)=wk#5J4kfc0j>@O6bV#sJ zzSy{|&SGeO+2@+@-a&RH2Sgsng|VAEct&9G$i~q(iWaOgPHTu*iN$+)>OH!7Ql+g? zo+g)qyKWz$cAQEC;g(>L8W`3#tdxBo#h~S>%@B>vP21Dd60y3ami36s0F#EXTs2r6(*T1BddDdQCmW3H z)|`0Llml&$=8{jXqdgo*S(XNtvN@|eT+;HQeVRA^Ue6X<9FsrWTW({6k!$w$F{)I! z-^wU-$&g1P)+8c2KK}n8@4bVX?AvZp5EPXry*EKoX#&!uL`0fAfT$E{QHp>xkrpH* z6zNS+Kxsih5h;-_#e`m^D&vzWsi)_sn@`&g^q$&*87|Pcpf4 z-`DTD)>_wE8TChEs!p=0Fh1CrvoNtQp#iwKGCW?wRfp3Vb|1HJlDiIPuJ&bf>e^~m z^H|dgQF>I5>7Wxmsl^U&fA6;r$rZ^Vc2)@swQ?|4QO>`X+=%93QHLHtUxK+gxttyi zy^3pPXK$#G;69zn?2WGDHA*n4gc%QXh}y`ur(??K0v;*VP;H=a)P>0gVc*YO(RDS?M%#vMWrOI52eIu-nV2)dD?Vo zx*7$d`cFJ2mw)bC?iF{6iqkeuFk;G-?BaHnAL$Bz6TSG34={W_O+N*_O+es*+xpzo z8lW4m1FF02enbU6dvCu#^OZLL?fGo6Z=;&k6{H4QL2!Da0LC(rDo}Q5sx4-xY3y9d zt6@Rr(!7GK7j5P1GJJHrc12R(M4`;Ij}G6mljWne-WbsNT7ntY%npw>$Tv!jJv;JEld>Wvw}D6$=Ipf;gN@$Q zh?VG^K=6&KIBa!q@qf!a8}>*e?Av7{u1v-e>;3CSU_v}ehY%!wYSOY>f{j+v^Fl~` zgZ;KU*Qs?E&dc}W&olOq${d(JQZRx@?98qB$}S({dGzv1pMjqd3R`tr+yqWLF_q}~ z&QwGi_?>S{UwO7b`>LZAN|;+Qid~_JL6LZAF`TBT!b0;sY?PJI@uiAV@*d^l7XQt) zsLxOd!nVwnRMKZ#D~2wW>u#^rx|;`B1Rq4z6^-hR6DOBHeJ8$I3NEN@x!<)CZr$|V zO!@}I;kEjZ;G2*i7e-@Rg;*`Nj+xfMb1b+@F!v>bL_Ae*Shs4p)V{(%XuzwQfy>DF zI4iJ^b_0oosxG~Qi9z||yROHM6qK60Q8^4t@tM%T?er0mZ}b@GL*m-wsB0U!)2a1b z?j@Tt3l-m2dBWaE(k7xrY6N{W{(7Rk2@ZlpPdVUOtQ(>pMCGP(iW1qAf)>Hg&710E2OxKG0uXi-(c9#l5KIVTpVj#HLo zdx?F8h%|HbJ}00yYYu^bKKbKEqRFi*F;F>ZB{0EfIX4lpHzanpx8Je1Wkw(^@`BuB zT)DLw2V-8V_JpH5!DKHa+0I^rD*HFX{*^T_a60yDl)a^Z{;xqU0^64|`8s0>-3X@U zGlP$Qdr>iH6FD3R6Tc+e4Nm~^bD)>~IccpH{LhW*Xtj$<1*#d1ri?4njaT6-D(F#? zuIv{B-Ix_1HQ*}nwN!1#0b2#K5vUPVU$qEV{f9`{CpFHy4ngTz{v;@^7_=NdggXn= zd=Yvtz0Xbr&e7EcX&A|!r5ICJ1d?JYIVj-o^1J@}v<_85K zyEwYAGMTjSv1pXzADC}-k@|>!grH}2Ii~MO0V1!!hk%{HD&VYm@jMQt0RfR-6L-sT z2u{pwL{occ=qpUe+UEFPtPH2b50kf#zZ66)8uvpLcro_XIACivT(k=0qqWKx{kIgOw zq`!;V(vf{Y76XPLliCTY5^kt}vWvuldYF^bh!@6-7-(d@myzU2oz*!KDhX%wUfP>O zFDIj}goTr6wJSq_Hx$eo{XX5tkLLXeV6I_dpc%UM9566@)?>Gud|Kg7zYf!*V7#7% zXUQHcQCxb{pG3SQTf@$I?{QcX@FVPWLhWpSh6pf z7MZd=8mz1teI*ZSYu+_dF%olUAvAvUa?LW2?60b z{|FV$p|=Wc=>zGV-x0ug^-jmQ2=bdQNi}Ru@(pk{U21p)T~|egn#rZ-NC&hFt*%Qm zSpPF#x%{Gr<2-c&mcl>#QjMZP^$r8FZ=XVlzlTH-olB=hm!9bNOXmcCt+b}0+7M)0 zJ)s5Qn__^|pc;GG99xZ@_%2N{0qE~#1XO~QI@>cfybu!c#R*+z>0>+6gst1_L#JRy zas;|l?`k`#bX}_()opz@wh~~nw45KQ<>SG08TA9q0eS@!8z>^*RTb;a`=r~LTUxI7 ztoM#v_KB%NwApi0ty0q0(M!w^c7(Hr3194kF_OevUkbhIDt-1 z3>a79)z^d3AZ1Lxik_p%na2-dn?nCIIj*}Ljou~g%~I~tih`85H-&A}KI}s|pSbvD zDonB0xtvZ6nugVuooc;G43ylAjsssHCooDqgBJo;^$0(3mGyRADU~}tAaf4o@91f0gUBPxM z#bX7f$8@xCoL@IDPhkvLX7ImH@(cO`dmZv$PS5e3pegQv;Yqt8pgFWb41X#4_Wlni zj#B^<-f7h#o1nI!WRkX&m3YMZ4d4AL_`D;~bWc=ZA;+D$PN`Y6u0%_DH7J7N%N4AAL`)&xPcK9FxW!F_wHi^@GA%F3&fX4kgphRw}sSIA1}v zLrJ=>JvYS*LjPvaQBphm0Z#e-PWZ%|Bs`@SVX%x%3-S&xY3X$jXOtT3lBq%ebtsZy zp=+u;4E?qIs7-YV&g~t77Hng$+QPi5KD!WhsjWuOA^gJmlh{O-kevXmR@tBc=s|sz z|6kL-^zo0+)I&)$ojKDfYwFL8N7-~eLcwB7kf4rLu~~JZuymO*oX0W#o|)2Hk&s&~ z(xQ*2qv%5dSeD&}R2Vp3+II3tI}b8El~s1Qy3BLU!%EuP>3HV_dSy?RaWj@k2OY^J|We246>1Zod4LYTI*@KlY>H zm#y5XyeA)rn%sZ?nlNPD6>`+RP$r!*szx-X@}7&Q%7~wJOi6ZllTH@44X4}(e&8yI zHw_PLao)*Q`0Dsa4M=J+(iIl-qCWUgovO;4M&06K4SoFl)|-$CebGp74~j*<*Y;;x zEtaBN!o!MGgBHJXQ>U(Yv1pCREg>Q$>iC*^E#tE>>q$BWUpidb-Z*%Lg!~ot_#g@Dl#Wt~`^iM~dc-iDv9ZqslT92MB?H8 z85VD58By_@Nhfk7L-NWBHj%D96*S7Xjm4;|V;mffC1xe#eWLBAwNiNt1ygv^ya9VH zKA_#MssdoDxBr-ZS1e&?B{XKEO$figwoC;(h^f!ypY!+Q z=9Qh4zxCyhK#Gnwt^lyMx2I=)IdN4YvG%WHbV)o(R5HOl4SfwmwoWZWP4&e00|oHv%UtYv~7XC@Qyv8(@a_Qm&7@3OCT z-a20+xkS<|8yZs#*T8q-_AZdk^a;>HiRobTi)P6cu~~zll|=c^{c7iWUthNV})KEc9LjQl(X$;k?vqWb^6)!6b7V zrN(;K;`fq?{Zx&IF(epaw~C^K5cXC9J431!Sn*TS=`Se0xKs_pQ^o~(rx-Z&wPaSG zCVPrmHsTfWd-&q!dZ7M!y}j|GdwINLLtm83&fc<{^PKne{^lRsq#$hy*}Blo+x+%b zcf$v9m#h;Rcn0ubRakq=0)9P)YFj$0J>XHcXn3hbxj%i_W}c*x1Cw{#SvE2@c$gQ|kC28S$daPQ;-je))*uJ-+k!uS&>sj1Ju*<1f4HN? zjA%2yOH(NQ6_+Nk0!j#0I!BcwK5Z(Qr{z8PS`${aHiN9`y&m#ak`54FU`~`GeNuu4 z_fwYese)E6o_`NO%!)V1eUw`LIg%_wn*KUOeuaA?Po(I8eE+KtVgeNoH2)Fseo!Cw zXlm%h+}t-n_XnDdK8?~N!*SgNzzx6PY?#zr%WHFC0{6-{C9U>N(6>})NXVv2|EeQx zIqx~G%y6@JQ=aYySs8-vb`rPGsu69eyqpvbcvQ`Az&;zd9Ww8~4+>3PoU2O#(3P~K zRHAAhU5bF%$s=?bH#8Sc`NCMz!ZMPY8`3YivV3MkO8jICx}5B&7?Br9RP9i=?d@If z6&H^?RG;)${CK{f^V7uaa1inC8>7rSTf}c{m1R;<8~Vsp6hD0ch`#{0<3Tn*U7F!M z&qxZP;zdo0#k23YlcZU^?y0XompSNP5k!3TPjB!#stWC})leBN?Q;tjamz^L->JQL z6ItYcLo{e`y?Lo*-_>y!u-dr&o`9#$?%@5(i`@> z@4uA7BPtbF@|C8aXd-{;hT_!ISN2k-fdQj?rE-z{LTk-#=LW8ILQTf_{BH2s?;00g zScK>Q0`rphI-P}xq&GNt%yaLS^Y)*;6pr{=xX-Mfl6f&+OBn2%u36rX9sRW>2fF=B zz+wExf;o>1*1`C>0Oi9^b&&noe|Gnb2RZl%qCpRwwM}7p4ts73Jv(iiGs-qff_z$x zR=L%k)E>C$e06zLg8u6z02U}ftv?F{)oQH@*D|+t<4>}EOS|b;qY4|;P`od$TP=~5L1)kD%wSDJ(! zVbh^Lv@5kOtQi|1U{TF$G^ugYyO8T^nu4hIX^Ps%FSnnEot+l)=rgD<^!`jXq&Sk3 zB!qjGkV*DIHaRaw6iyRfbzExeUXmX_#F$E4?^WTH&N%dM$9@Iq@qFO13>mHco52-B z8_A>Ata)HzJCrq)2(1a#2e8~7dRrSlgC%m zV_S}a%Pb3&au5A*Z}~UK*~fX|a*-TvM$$2uwz&u7_Y^C#ZD$Bw<(J38a{0xiB}cVt z#Km{3y}j-U{`W$a?kN`rSkPLb08j#Fh^PR0(SN)d9z8x*gxjy_JSc;Wzs%`8D?N3w zIcIst9?J9OmJfPmoXcLNQ)w~lJa56`d)=#5uhWs}r=zJFAmKK?KzO;mfp_I*lf=^& z{u3_KEVk;ROe1~Cl){I9ri+~+z_)%G(wNJ)o^->^*LOkMNza>{xm-Z3x#QmC-o(Zh zn32|SFukKuMRs0aCY6_NkdCi=XXmi$m6PH**Hx>z#v-r3yRCl2EczzDFs2t=yH34? z7O8?=0^Zn`1inZbJfLV(K(M{KgkG%1utfOKc2mlsX1SN6$Jo&b`Jne@XczYEGy3IU zW)aEeuLcLvFOB-o$1J@2k{;;92i>E1151>I;yq}=B6tqpwgV3g=!Gvicq#NkU^zrA zDS_OqUS0v=v`AwY@Ayivx1Vb%6FP^2)~Bbq$?Bw?F$`w`_%5?WsBK#tp)X0HsEMdh zY6STdb@$TGXSW{TqfI-;M0E%)J)T5ALCDg1>*+RFRf_YBM>>x7@DKC0R{20i_`Bk$}T z)+o0VkRn!j76c3yw(scU;C%yXFn}@4fJSD*@raQ(I+DG%&eP0 zPva!yHFHA$)H|*}15k!PEDpr7xHgrJVDyDeVOQ~6sPAdq@V!rb`<7ImZMr^P4*-!G z!Gq6MV3#0>WsVx+18}lAIT%Sk?iL93Ul(i;@?8nzee&w+`D}NQml-pK#%kuz7oYBp5AnnsvwUEFZU{92dF*j)VQWu_pXx3htta8ePz%10W2MH$E0aO@WWr{@ zN;0hSWLg+`f22hPx6X~SkddZ^p_!wWZAoT9t{D=!Ro^&o-DOI@Z~4+@Ofe!1dKsD1nXhG`3m|g`O-j!lnzgExRw=>rDdymKO zZw8y>{2k}!P3IEg%F5}c4u2-oYPDLR?s6wPh}ihZ4eD#TXkk8>YHqi$XaRbQC4>YK zPh_Q0IDZE?=TTgs%2TL|)SGpAw;D4Ktj7IP2kH{s*AhP1&VUl*2Lpaa28=L%%DLVm z&MDA~#yq%B=*C`9c&xuH*km#+7Tc7`<-m5k@#&Sbl3!)m#34uk$+S$%0Q#JUUp>S1 zHZSS#w)u|Q?z|gWx@+=&RnGTGwCQO}*%+`S8BR(hx+6P9(62~~?B2=CuDVfer>Xr_ z*bv&-&eoS78vG2dGS9s$Xp!C9xKSbV%tq6)?n|znaR=ud>5P9f*!y~(&3i;E(^G`r zBS(cVV`CdL91M8+6;{#~uU^iS(Nr-xa2L>d$@p5u^73&cAT&v&bCb)SETt!sGAyQT ztsafGENYfDdYPPE>UrgU5~U-W7T4CYxbk3%uJsHPzjNSK(enbj`KaK-{-7%Rs(j3| zZo8Co=XBEEF*p<4CpSR#PFd@HX1;dh)N09Wp@QQ5Oh0B7lM9b~&pP^Oo(^L^b)}Yz zB#Y-E4oXDp@iw(aW8{XzAA}@zV(#CD771h!2doDP*G(U*Xi5J*(Nm{SD6l{o)};X4J844?f`13NC?4W-6_m-x*8`jp_{d+cw+nv zdif1fxo!teNGQwN1pH}->Lk+U@7qfOCpjZs*&gaexb1D~*O;4CABXuf?r>4-7RxnD zZMzFb5q+A&FC(Dle={(j98l2-S_>qfnH60P`riziRAodbYPR&(yDYFn-iGlzZfh0FA|Frpi=*qi{ih?fH(eCDg0kBqai#3 z1jHeOw@)m~J{Kqb{KJ4u1e%icNW=w{B=vDRn6MsCUnos>@caSn>^CK^-410(O8Tj8 zf_T59)%1==e~ENQSvw12x$e=~Qdn4peA*9j54 zfEFd`4V~-LB)xAPpr!}p>R|W+$VkAR^MIiMtArA4K;j(Kmw>)a{D@Ax(J+Aw=8viz za_qY9QZ6~LKU)($G=22tW$ZNGz~2WGjD1BF!r9d{;ki%j{3EL5UH@hfqsnbzuFlIt zODNarBhIqquoZU8UVtr>GaLFW6D@XgI4fF6?9uy1YSNkc)AwJJ+5uEVjucML0iYpn zsu9`W-{W&$avd~dNGG6PMf0L{aK>8|^|jv?&u5l^-Z;qW2R{(0`kNrK;@>^D!0G(c z$0ykQ$r9vK?WEtu=sAm9?WNvp{j7ETFNWXDcre&DLZM_Y9734NG)7hW;05=d_RZ}d z@&zJT=YDrv(>)%Sv5XyHP_K%Ulln5~!{XZo-T-JM- zn@gEw+EE960#xT*MwD~>O3aDbTdE@(W?s~JP-BRAvLI3s8PZ>t29Xv`2|VoK1v{ji z*iUy$G=$&Ez7MhO+}cvlJ8@4AgxB95O^02Gkeg^g#sQ~wH#TZ-SxI6`y$YB2)=LIe zr~ljV=HMt7!?o4Zn9|2?e(T>~(s--+^{$gm3EQM3@*}?WS2yzDoIOR3BNOcR_pJ*Q zk{N_evK+Pg8Sp{U(nSMbu#9LAz}SF+Ov2D>O8cQ8p2aU)_kr!pAJwALwQ|`*ZajTL z>wKgh-ji6@-{~0d4!AJXbj4h8eYs(zi9c05zh*>U?PIM0C{Ieu;F=r$>WJcUy6WhmOcZeVN;r;cGx+?>*2=-Y$5l&7?lkj`CX=qI4&%=^U@m%l;{>|f zpU3glWx>OAg}kp%b5&SYQ%`KiLE@mN?@*fL7~@};iE^7(n^V2>o!PftFM~rug#`Q^ zgVg4zQe@TT(HLP~j9+w}ncCzz#XUb0mHF$;Y)cHhZp*h;WXol8f}cp}Kw3$@04v>v zO{)FJ4_&@dPI<>Z+r5G5FG+W= zI)>=E)6(^L$mr##dANS4Ln-{}09>urA-%p!olqg^f8;mQyF4xC{hF2sI|HG#gM`)K z7s$!_6#n!8-(b;D37=^5ANwU&FllyfOc>NaaY1KaFS>rOeN+N!K>l93y(lsUTPU5I znd_1PN=39nb#4C-_122#g5m|+J72Dp&WI}Y!hvXJd9p2Tn8&!0Vo?TnAe%4<$m!l}^-uVFdSlpfbxcDGs(P<{d&+pwfxS02WMThG$ zf{oq}1Ce8J-9(n2f}pTVZ%4W3PmUja-V}VYZ-l-bFcXR_hG{}sC+YG~-3G$K+YGN9 zdsEwq)j7)Nkm?Q*#*xl%qA#v*)AMs7dlBpPmgRI=&sq4Y3g9n9Bh>SLkmKO%Jo`Guie)? z91hCZLNtIAgcPub1VsG9*X$#QFG@Do%z#{}>7Ng+o`3z<j34KrCBpJ34{1c0a>1ju2m5y4&*ho{)wM{a9gdMnLL@qAn0}0ys zxg>BJ_{@#bR2a9g`TW|bRehjZD#2;-uXi2Hp+=%yh3zDyMRD@?KG&u1EX%TZEy5R! zFK4I5_)tlX3;Jnm1H{Pk68{R@`>l|uf$EZFft^&`)iz&&RM^!mWv7K6%~t-4t~xn9 zOs^+RCp{&hMfpn{EG#>NSJqr=_AT*I1aO}OZ^Is&6U6ckeLQ+_%5L4iL7$`7gPF}_ z%aW-f4Br=peulU0EMFFRSE$5E%kue)HSkj(CGvy1fYGASc+5cmcK$S$_n%T8PRjv# z&~;KUi#O(P?@Ic)*sZ6qv3XPlI_nW^ds_kF&*dSzvFhLk zGPETQAyd;;RcS-Nd$x@_cT$wmwd#A)ytIZYFHSxZi*Ck>LsTuu@k=yt*UiuVHP7z7 zd!MssG<(`HyyEneUAf}o*Ah%#@KYeq^jCq;S}dc~&aRE`&8-(sY%TEhUYGD8dtwC# zEFfFYILG<#RWswMSBrXu9-90MvqT@-m-*gp9;4{+74p{;BI-~WWvbsn>|1JqiMyQ*`bLc>U9wZ@H$^cx8i{ zM-Q2RTHLRz3O2JczP)&^SC=5(hj-qt~D!nr$1-12i#}A-x(+e+46JVA7r_?P)r9RZiTI z1b}0S3i`UKo^;CJtxUbPd(Sridf$T9A@Z-{yiit&^V=X!_%pQlBh%%Da4WmR@TlLz z(oVBIA|JLy+jV-u_w+|UMqDDOE`{U~ygS}(;M`F^8>H8sX@rL)ItZRE`E1A>h0TPF zuvA(ZJaJu$qrFF|LdA)(YvlwKU9L6Ez>t?{$@b!%DYFcqzL0qw)W4z=#81_rT!-3_ z(}~($*8D4zCWi8&&`DBpqD@$bKvO3v*vt?{Cf|Y-_B#5zAU@Fjl5oT&~S^v z11Xz=`+hs=>i?&PbpIzP5BNHv?!+zX4YCJLi5sAr8k(*?6J%;xrkjv;jnjrk)8)ZqSe8DdEF+SO1`Z|2M@?2iMjZG>pf~VVaw8UFDq%`?gW%d2XAim30&+Mz> zQaz7zv+xaBrSO;G?`>{?E0h`Too$L6xudR6~+YCRPKo%(iEWWWrgV+!Cp`7L&7|44%^u{rHSOhg7;`?xiyL z3P^P;O{%CS15lH|!-!C)$r~Tv?21snEwLXi8hJ9gB>foIF)e{)FI3-fa_)N2^dK&K z@b~3=5rdi65{bvJrk&{Rda~nZTG4~_5e;HQ8BDclaG_OmU9gBFF6l$%b}l&n#)%rc z$NjoVA8AS5;hk-^yQb}@-$kleT+Nk82!iv>&|2^O@(DImSOeAD&C3vX#f(;E+}r|g z2|u(|3M9&PgoLhjuJ_O-;>hZgzL)=#*x1;Llc?6O$MA8&T0 z9(ys`;n@i@fA7zR@)=(UKL#sJn3{F3t;OT2Sh{;xJ#!cH%JXc_foA+l5QDDyXD}8M z&tLwzcji0a@D}z0RjOz)Pr)b;g!_@t0#+?G&S=Rj4vf#9Vb58Glp|ZXJ!8_sY(6#DeFU z?+pvHk4ope)dkCDMr?cB0)RPOtEtirF%OGhRno7!4`v)oH>w#fnMp~CUI^H|!eo>5 zZ|N=m`B;~vD){HwO`G9Bc&NXZ58|amBD1GnX}+zt2hpG%lZwGSB9C_EX#5qD@Z{%G zsO+St&lroXp>aR}`^UB>0q#EbwkvL#j|8t3M`fDoFtBJmsWu9DL#V`7bB$E(ac3B$1UK z0I{GTs_0Jz5gbP%`>zyyJ!^&M_@!Oz%Q36$>BtFGH~9%s+L&CmL{Z}2sKlKcNVAin zkoJ*_so#6`N1yBO8Q8EE#PUT|L)JU#g6|(sQB6y{0Wf8%C~df5|~1Bc-nuxrX={9}EpJ~9a<0d)fA z8`+-Emdob0l>54xMZkPxI9WUc4p|iA&Byz_-!zwt9Uc24_s@Lue@|#u04R<17)%^; z%3o;lFU6oqZr$Sc_PoZ|Pt^?QW9zz+vJLDv1hkXnma3#z`tY2@ToP%eUD#2*CAbbR z=k3dwrnhYGT_{A1zSZX(T@RI`*#9%buBW`|f(r!2?l)Z<)oi>lKUWd-n)yV=^4M56 zal^t!4)MauS&3psy*1UwN`S3&7xMm`nj+6TB=}`&u00TG(&VTt<-+nE2t=bU!G0nx z1f4tjn}HqNSoYCjaI7uS`%{I#HQPh!D=(gR6|L*s%jyd}Fp;P)+F=oc2I2K7n- zT|ge;LFy%cUjfCMFLf-7c~EXVyM2HMZHx`Cg~5zQj}m5jNtvQ!s0@3J3^fCv)Ra0dU`^pi~oOlV~R*=xMKS2ksQYffB@q8P+e9y3SuW(Pj_!Zll+MkzFedjD1uDP0;oOc*pNMTUT2PnS1Z)9X~7a;>B&B9_z z9~Rh(ZI-u9sH5RmWvB9zZ#OTFgLCN|v7Gzb-23GS zKZ64qAct zfzMp)@8D3uMRd3rtbXE~IxKPAak{I@=D>*@v8-!*FK+~mo~TmvyMz&drk}4Rl~z(GfpLy+3N5ZH=bAclR((ds zAV{g?1%higCK%nLpsaXE8E@;6xh`G*II{Pu3LLj>!?hTswn5~;#AHD1*ihpwuPwTlN1SM7GC-#lmWlJ!0n zud}r3%BwkJs~1y@G9ex(gS=90dtV-+rJd0cw{sZ6)K-QI#jrFOQkSBW*ogO7$jXK`XO-7{z~!d&VNa} zI`zNn^?!B1_>Ty#2H<)6@99m~WC?{pbkim%XD#Mm?WF%hl=(02)t}=#|Gk{9f7Mi` zV*rNJ4NC!NZVWH%Ki{nqH49K12WoWm+dnUpu2fkTohQeTNJRPxV3!*11-TWh-NVv6 zc!zU&O*Fh5*|fb(q7^^`i3X%s-+{8n$*zWusoq`9ycK-bOsz%A?qc`-9Ol?tCVhbx z7d_rnJ*H6nTi`QPred;XxAGz+y~}KMSa{aaa9zG62;aP7MXx`_s4F-Q-G2g>*p zsMwg_TF#H3L96uPHks9v3;ea$<0N7QSF4&`|rG10*8v8C`QwwEV0nAa?*0G_bxuC=<_|n%mD(;tz1sC(q zoQh*OrK{|GOi`z@5sxEbH=fa@i2N}m1#ui^OLJFmmO1bJZzHP)(Xah14Z(Ej7TU+d z?`HR#YR90LaK7SZiNbUEGuQ7Jru95_OMd-r2llDph--*G+=6T$Ho(b*>Yc5hI#l8@ z^^#ZK#H6(13OIyF${quZfvN3F;v8~AblF8L^abt96M_vA9>5XhRbFsY4l;M@$_n$~ z;7x#1IJodKt^NEVIvQISpLUVlj^JwZ_5SEtc&FB}Im40Zz#^;r+@W^Vet+GIUs?N zr5?miF6+1&Tsj}|&E6z2R63I)G-3VJWw2{VmqSaG&2|dJK=p_qGA*;jLJi6rX+~QM zD}{f#{(zK1l2?AUeaEIk=T`h(n#;{U52xjOGVK=?3Ib!TbN^JTWbHE&JG>zes zvFs;PWHps*nU#|fVrD{^dMC1D@5XvwmA02zH|3w!PR|bcZhIiYqy%2d15UVC(5;!^Jw^^4`sTe&1xvpzzC? zvwQhOa0sNXi(g!oFjBEhGZ(5<(++LQ@#+hZG zutBmdXLo_?U(=jDW=GbB{RooL z+i%zFY6qBjhOX|9sAj5Y^`B`)&KY!0!_JbEm%)h`m6Q9UGT!o$&zqiK7_a%8A&f!7 zB-PgwTnFz4C&7825Yau2UuzoUOcv_5z4(nXTz^a5i_MZgx|A$hxGuc`PX}>W_9(?- z*5j8_!S|Ju^VqxD9E}eo2bTPPtGr~n0e;A@2c~_6$s4X9*{FI1QsnTp?XjN90X7f$ z(A3wx0Y7(D++KdJ0?ZA3jh8HUC`;)K8#$cbibcW-x7QXL>ti443<|zr8UQ+a<+0oj zG9yI^a&VVi@?l%==6LF-)DPv~Vt#y&j+iL_VZ!X!&45RL(tEHCwg40*%DzNohpQ>& z{_L~H7qm~kn>p8z(dWO3;vYW;;&#OYqMZ~N$iSvA?2JBP%N+D*T*m>F`Y~#hlrL@< zCzKY#Y^if9CS~`&rLJb*80c$gH@ofq_-;K8RC6Y-%Q8uONJ^Uf@#&-%Hek){l8G4O z!nUoBNEz&>1Y3}{KdV=vIDu66aVCbZ;n#4t@9$5L^U#f%sJR!JEPT5N7FY7;fyxD_ zd5)<~eiw<=TvO?frU-SonIK?%E6K2zbvg~3Q}fA=8k)#_WC zr%n5{dTjnZUL}i+BrJB}&{4r4R_x%I!kBH`Z`*)qYc1nG7)1J;j9YN&Vo}BknlNoo zmUCa;?jUj+5}m7Xa^<3lJ3{<&!Mf+)sANM|GndlxU;aVtn66N0Ae`=T%#+q{d0n}0 zc`W^zX)c+n-!z4!OwBtYw*oeua-yJo6cZ?C4Wg@1XaWktv2%`iJ@MM*adU6UT9C0& z{TY*yzfwNhK$QjwBXtZyBZxA9qtDfPw;0PwQV!4FZPAR@)DL~wUCl$^Xgv_YC>vd0 zhFAKGOs-bEG#NVo!#DeOsXkZt^Q#iUMz)%()V}gzZGgUb@)4>yrK9|0c~kKTf%cPU zn4{pvo(g8DnK_mzaf+@%wL<7m2kU|?e+CD#WtctrG;esiu|V*em45aur;EOh?(os&-xONs%Y^RhJl3T_C~3(fgzC_6vjJn|!0>=`%`aR$9? z0=fG)gFbzZK233=IG+Gp-xR%t@!q_UJ)j4u7zxCd@j3K4ix5)~bxUJVMa3$rJO6uk z=8F?V-`}QO#RsQ`+ZgvNQg%CpMAypcKTzTTK!Rr4vO#k{{pmi1xF06zO}pd#EwbkV zgJx*^yu|O(@;)`)GvVeifBGzZ|2Y?YI;-s98BJ1_=`vak{%pZ$8h}OXEoTqkue3oj zM+Q>l1;b{4Gm4qWGahP*m3KY&m_Rp7C(uQ`T0G*bbOJrfx0=l4bJSlxMQFzVSn=`# ze<{-xTrKQlk+?`Ts2@W@MOzBv31;2me2ohtpIX&F1PAzRSTOjjE5wHwoqaNL^AKbU z1TEK1C+NwKmTc4cJw1LNl7*)ngg$be)a=TC6hht8S9opGFI}j$+7?LIBSn)x5?ah< zyR%C#m`5Mtx6!Rf3%;t5|pC%vI=i6!Z$Zz5j%e0H2SKvn7!l>ne zvUrPh>!cq>6a1IYjhm*X6B*Y6@@Zo)Q>L2mRVy@uhvX9fB}!iFI~}!;hRm5AEP8I4 z4EW0vx1OGFzaq=T^2t1ueu*r!f;S)`WBT|pz)mJ>b(O~pf7mQTcR-(D$o|mYQu&G> zq z8q4@xrKCe7xBcB$3(q*>w8nxJ67#&*nR)NsByJwVcbZp*&2R!83({6ovfil{6Q=T? zz6ECI4T0p8cjxY|9!nM;t%sl_X%!geTEK%yz}BiBJ0$OrM=RzBRvBV8!TM00CZahq zroO+;JJ>52_gqFJ(4OInh_H@6Sqq#z)@pb2zD0k&A0D-NU4 z+ERcY$a*K7I~c?dvFrk#qVE*gul-q zbsW)dU1dpn3E&yTbgO!B!p)!Rjn~ze{Hk4ol55=JIA1sFA?*KDbfKB3%7E}n0K`$0 zW;@}pu$r_LB58IbP0!18Lqw8m#@7my%KcSBhCYZmt)opW#`fsR5~ndoi4&WT?__S> zQIJ+V&YHDT6}J^#sSccz?U;0iGSVtR%Uol~YMHU>BeRH`4q+0{vqd6fH8^5R4va*Q zgW=qAtpxv0iF9z?ZdFCcl9`i0_e;HEeUN7sm&H8(MY@c;=&2V>Tu1HIF-ylgleiQ5 z6^(9m;;{`HQ}NvYVog+c$|P{(Xo0h=H8Ec-^~cx*0>pVJ22_1Z0cr&5D=~NkFw8m| z5)(lJ)y(*+$a{6i@+CO!wo|(gr9U&+UM0!`^@A<*z~Gl2w-@~~VYl2}$}4x@D%$A0 zN!sNQ4vxUF$8@+2)RUG=wFY&6MqP%gpc>zvNAlisdTg8FO96Zn$>jL7 z5z}2gTgi~qZ}Y>aeIFHyCO?en!u(}FPjvLQ!rW=9yL~;=;=(y0h$#PnC}&aC&FJX= zK1y;b(~8ln@#JlKM=kvB$sYY5d`S|3PvFxIO25@2l!=HgOir>MAGz+%I36`wj-6>! zC+t03To)917YX8)!y)3aXVG5iaa_+XKpxzs52agO@q~)saug8Jii1fg#U|h0zZs;DAq)6c%~6Woo+G>$iMJ%XbH*T^9q6Rr*jvbt z7|=mbrs+=YY`L3Ko-Q(=(agu+Zi>ItuNUh_z?w z2E`vhRQ9=iKP6-+2%l!a+;HWpDoy|aC9Q&mf4baH`&cy zT+qAu4(h=pxf2Qxj1Aq!;y2pbSEhxmL3_dD|4gT$IOie$ow+UxVAkY7_AjQQ*QAZs zPtQJN(0+REGdaewtej!gquWW?hD~!~q2x2{* zg~-k2o^+`iR7`K^IkkfNH`n)ZZYLiT-w1KTcBtKjuO9P^j-kbYVzWnf7QZ%mG)lgU zuA%q2G{THYaEu1dIAX5tXCJm#d9EsK8X!X{isYf&%yPIghz;)V(A`FoMV6H? z+U*#0EEM#4mX_YGZp-Z0vF0`56Z^h^?tb~ffwGS1L63F4z=NMaHT|1m7Lf68hA!)S zRbnEWWD)}tFgCXLfF9X2$sNn=;ZyrF>ZvN@(V)t>FF?5qG>|VII_ts<;og=wFIyk7B zPu!8~pz0Gqq;zsusJq8X^0(qi{OUY1IMhcfXLUI=Q>2}*tf*VQ?U!i@LhCXe%-8w!@Xdf$Y)z|XXMjY3C zL{tKtT9jDY{p-FqgD<=z@oRCmdc2`8z!TO_jOlIn0nznKzu%;Jc5ln0|iJg9Z7!l0r6mR$@`Jd)3?TJ zecx)|K0VQAZq%2SOoObpjCl-#F5qv-VObQ*K2W)dEU~^#Mw`{cpPd{XZt_Hm3@1NX z$cPpUO#99`B~gb>43^-A4YmyYtafY8v26G$Uy^Awzi8imH`>yX1*03u*AMsuV)3Vm zX3IgjmWlF*6;CIr>2+S}+}(BHmanJRUiZ6NKb)Vj5%LLWM;emZ34J}ztYk)<1gm$h z?X22dUBoJeR(w_C!Byg7+#xeGm7+?O%vn*dtJ-LKIlNY|+zKgfMw{K% znAd#Dr6d`Z@{fbc<~%GKDn))!MinD;)5RzDs*&=A`(~x#MJShDYZ23XjFj)sZyq8! z04W9sWDbbD07f_mz-sGhADq3#0nuQfzF#HvpSrlMKlfiopC`xD&vVjSm)9vxe>03M zq6Uddq#UYr3!0=sjnf;@n4$0ep~VkTuu6-4&br=9oC)BwATM}QYMF$9Cl+ID!OiM_ zSfvg~T^F!h3xNg6)4ErU!(;T8$;N=GM@c(^!~{SA6G6x%kSFLY8M!RmH%fkFBm6K2 zqtjIL?7Cx^4^b|XsY^=Y`Ksv4XytxQlI6eQt1#8q2jYZ=_zN3WLY00+Z?b!cs@UZv zK(ZbUY2;|m_Fq%su+aKc{}{Nk`cSVax<=13&1Socy?CR=Kaah2@4vD4-ce2U-M%jf z66sQ<2L%KKM0yW4nka}!kro6LkluSjk={{2L3&k$ARU2(UZwZmr3Mm8h!FDJ^}J`F zao>H$+2`(i#<~04eaHPH!=YmsFfP{m%{jmG^RYLyx0!*Sg}>ywHXST~;Ky=eSPNfu zlEU4?)IgLYj_mHDtrGf09tYS_V+M##6 zoQ^}hMuWdgl2S88e6e`neOZT2WLq^6OqPc)$4rfPa6BHduUCAUJXqoa>NAge{&=R3 zy7osBB^$TDzLQ-r&@9XF>G=#}ddJ}Vgw}}2vN@(>BIDpb%)qZz?JdB&8gkT4IouLN zdO^JlqjsU&^M@tUZb0r_PRxC7dh_}Y&3lRK6xSIS7?Mm=+(m{?a>AEu!S4x*MEcP} z8w{47&DiC8|F=e^I;9*L(mrMD@&M?5^@ZXt9CX8ADp1YK<#zqo$8~#7@4Cj8czw9) zD1P(PeW7j9@#P$0*j;7;PNE*Gph&3EbOqe^kEy9pl$5zVk%cEqvL^%|410w4!)yWP zu3Ev)W2|^rnnN*OM>wgAF%&YE3{GP^9uNmBoe2bQg%<&6EBfvnoneM$)?DLD5K32nsYXV6pNj?1yX1%)@xCZARo#~lJ^u6GYM zE=&5415uy2_7@s=c15}&Ot5a^4ZPDDr|$K4iseJ7Z?EK2CbX#9$aNGUt;T8G>ZT;e zaVv?1rTHuWUq+n&Cqb4Q4Z&-C&<{XuJ8L7-O7b#b=E3W!og05x?O;2u*F<|tpKEY^ z=ml-}69(})8}JTGGkCjp{e>!#kyEwC?=KRM{n=Q~Y68SUmCDVCNk!xdwghdzro>je zsH&S}pMuEb61RQBdZHZ1|LJ3>qW|>s(ziW=(U4i&LRQj_8J0^*jYl|5GBG*2rX zVEm&sji26FBatx_d^1W^V`HcBN@g{tgLjEj=c7Zc0k6_ts;a+G3uM2z6UdA??2d&q z<8ykT4pV~KMInsZU$581H7yyvvHay{=8@1i?3e?3=7#~{fXn;6#zSPohlfp*VkbLJ z8$s>H&R3Wh6j>7o*_=_r`&f{S-scu2g7$s#LXz$S z3kk$K6d6C>T^h~#80!d=O6GcC@knHkOc97-SEX)Terz0)Zqul&Um@fkRdBt~%{;^4L@ZhQZhU+Erp zvh~*=D1U!Nh^)6N)!IPc492yh0TT2tpxPI}4}RbC7h9_KEAe$+5~^?+8;L)oV}GyR z%WHkt{Xw^)4+z-szc;GgpOiryu_9oL6A- z#eI7z;t-hPyE5(SGYi5jKK5m{y>rn`TjR&}KNm3q9t+KKhAQ^PY`3LGJOJ^=bWR1@uOjHo zft_D~7cuT!%$~qGKeOs{E^<#0gGf-d7LS>$&52NU%Uc>0*h~m1sVlSQiqrkbEQ@a= z?kH(;Cmfmpaw8=;zI3jAZ|#tIz4KBqx6KWGhH- zFxv;Rtx=FWBQS;SG)2Lf+A>;62N4C@mV`Xf=Z*GetaEXsy=2*I$OFVL=-iDq;98`I z$l5Ei=6HF?Cez3!TGRe2HmnUVwBCqNPNi**J0c^UL+O;J^)hUsIGTOvgJImhVb2py ztHw?dl|yr{8`JI`4V6BL8pS79C#HjTEN)!fC63lZZjUzu&Pt|0kAf~Y@{w3^G^Lnh z^a}*aj#SS5#x%<=yk=e{P49g#kRa-;=4Z{ zI2F9yN=}TwQOp+BIrg$Z>^*MBdHG!icS!00{o>Cpd2Ww~wP9b+=*qE7ZRgi&6cI5e zoTLHQ8|vl!<0SmBJPDbfob`9*%X};(Fq;V__C<>h=Px<3R`p!$#WozIFOUbFf@0Y- zT+{8~dYw#%0z9Hk(d(myK~{E**eb9s5|tuZ+Qg+topZa@EQ^5=vQ^7sdHeu>xncb zd(;KGYbrcqucP#=1x~aT1aprDoQGFUZ}@oQSgRKohgn+6e@a&kO1;+{Re$w4k%WYj z{{#_@dIz3uYD1FYZ36XH@rO4jzaLncem%Im^tOdjcFJ}^2kb_h+Pc?MQU)95=q|#B z;aq->od)bc=J{{fmGN?`dmp)bJef1Q8{iVzY`coO!5IRuHLvd| zHrCB=!EKi`+%}zu7U$X4m2{-0L1XnIovOB|*)1aTBYZe&m5(?}oMBxjD#M01{VZ%R zrGsXVRemJ=LAVrl2VyUDV53z8_PWZ^6QzKF9Hw1~&mj%uJq~nFBJW&V&>|=O5?Gk? zXw@XA2Rx^`+LHEpEs^yVA0Bo&J&-+$xJ7Wo9s*SY_nx9{%;_PTlhaA8f-iAD z=~3MSQHL+xF}gJBlsz&n7ghvIY)N|~feXnn1qT*5Osm}?12ju-JLs1GC4g4Dj;efA ziZ5Ct=XZ8u=;dk124gDt>BW%>&YV)_*v>&%*L{mKh;;e4FlHrZp?A zn=2U}1wQj}dd)wbV;fyxlk1|yPDQg-g`H<-Ge(_3~HZHWLMl#S5Ii zd9!z}m`H7Y3u|;&52#R@T#nQ1yI}Oyyw`TY`VoHRo0_j!Vn=K>hU_6eZxxN%gKdDz=ae)ZJu{;9eHH4zE2H4qn|5SM)x-5ROl@$C`HY&|$^uI={zdY&;niD><| zyc##L+OM!TA_-*WKp+)pp4S9EB6q-PLj{VC*?xZg!yM{LsS@CC)SGb_hjMr({h@};@i7_y$3KOw+(9A--~PDZ;xCJGN5Yqbl^MV|RIC??W3exDZ(TU? zMGR;;^NSOg@Lr1S*!@B9tOG7#0wy6_lII&UwWQ*s^WLmz@LQ^ORQ*-{3Z1E|=_Mea z2MO*dd+|9BBMg1CB}O#_{kj3m8ATj*RYZ}g-y18sDsq?gCZ5oF}qvZyzzv$(@m zo>adI-{4ZLEP}CnYWoqj{DZ~HjCMLB+>;}fH)=kZ{jJzI4vph{XeT@?wak3PGXnCwc3dt;9{WwGv&mrW&sq5#moBnj*KkT-f?T&vTiFvZI9EGSkHrtY#HB82M)gWgOv18_mel68J`d zNe+EKi98X5L(KN9e8P*Y^f}!yNzr7oo=k9l4jO(JeRNng=^7`OA z-l%J51swU)(?2p=o8Mz-ls(Q}{;E}i#90nGqt5*yi7)HvW6F9L#@lC8Mn949IJBge z{$O~y+s)u;imQRAa9~U-a#>ir$oX`_X1umVxAR6F%7L!;HLYmO7T*`gg?ow# zO4C|csn+a!mmiv;x$ijSVmE#UJ+QFbisoS8Qy)MoSc$fMJg_L-5-b*;bri`derYK8 z-fMI%hsw@mJGP&rJnjY(dZyeviN!lt=&##$sp9pKS2KaT$E@lc(!BF|P$rs3-6ut= z$-%Sd=}TsR0T!$vL0ORab(m-fw7RpAgQK-zbP!l~LK!83PQwmw9xPV7M|ArRNlis$ zP=AIgW3#g`XYCxQ=-L;{R^zWFs}M`cRabJ)-rgx#nC?=9_Q2=();8vf%U4ts<)s5C zI@;_VoOi$2-2QVk29ZemawN~rasaMF0XIFWyJvlio0rJ>p`J52E?eT&x>8~XM3*3J zPbf#);#zt#6Av9@5d@Iai%~Okb>c5*P0LnSz`!t|jhv%~GtND>jj?0SH&-vDxJtk1 z)hiDy98%D_s@_1^4@dc+Se%Jqf=o>WXRK*~Rf->_OxLf0Gwkm-EDu1X+l3zzK$!&E zVS=poWf)NfUR&$ZcotZm&PGs#rHXfJmj(IY620-NPTz7kJG}SYr0<3b{*2d5E->Vx zp`bHH%RAq5H&5;I04hFvmv}fx8ERWhcvcm2KxyzMZO)iii-S>9j5+DG*2-ybZ(CQ; zA$gw%jfc7iR}8mqDc>!Wq%!pHxJqP~6V(|ms%pyF>6b%zy)TJf>T$?sU^uCu`&Zgw zvt(#-nvvmIo#C`>3V&L4ch%#avsc&plhL8Vns#Mt)L$Jvxea$gv&yVheVmru->)aR z`tFKsAZBl@CnmxK@rSR*m5l(w%FMjIlN%S@CX~C1(%S5|^b23BdpZh;GJ?@xB)95- z?xlr3a5SnzguyN0e}sv*0JN3}@CSH%u}@MzrT~@4!pD?zn%~;A;tV zSW8@h%_sTg2m!TZ_5h+uE%CR=?(jV2B;0nHnZlB~&yJaA3oQZOpp~t?uXmXYkXZ`W z;2|>Qx?TPyxcJk$;wh}wh8o>Wr(T@|N2&4;1wQ5Jf%8bT8&;!Z`8vY7VS4IVt#XoI zqtb!%4P$FclJycFjbs7)ki#O%^8IT}Q>S?1$317#v+IwDGRN@t!z(j^Pw?oqWtw-q z*SxMyObT>Am5i`Tq4%<+M@lSZ)XpT<5akKao5x@zOZcreliUdVf|~51{l_V<1v2ir zSFn53M)4-lH++Lu`E;r>20q2x`hE8;c|jbRu$~mCd(|AZ*6G0Y`0mW4hM}`tw!_9% z>>_}#B2p4G@G5KWuP07oOKpB=s4g}o4n+s4!+jfe*#UNqHIDHwk`$Rz_>43BlIiO0 z?~y^eB@P>jVBc!or^!HDgfU+HA!`Op)<)8t*=5=y4OX}vxtDgcN~yFBQNH&cUxsz* z$hoGhc#drGxajGhn|=HsW2XmGda{$IOy5Z+WZR2my)1(X5+K+U2p2x@UHbLt6wc1H zDfzo%lRu)bcVD?jvXw`p$S{TcaG4KNc!betPdjrpRr5o~6*J4wPonU`Z>}{|>Oi5}fvg)0lmQVs z&E3O58@>HjwowTo;O;M&lADF_zeNW5Fi8qTPY&mLI*sJyI3VGdpKTJ_rA@Vg8fp0GBAI6mA8%=b8X1oE#{nT9o~bY z4`dy!U#wc%I}>`AozA(sfo>Vb+zvR~Cfx$7!iK>V%G!VuYVqa+QQJN;iF*d~8>qq{NZWA!vqMxrb&B2=~K2ORKkT!nG zd-4~FxvcIM;af>(;_PuZgbWXNz&_dQ9=CXh#`ztjK8;nTc#-#HxHR-Iqq;U5tROr5al!N!r&C7J#C{Z`7c_dA5`9YR ztPlBGVy;y(=-xpQ6cbkwgzL@C-e6j4sml8gX+!_Ft?vIMZE3_8U_N^|3j@c=G5Cf( zY7W!IK9#rz9R~F^KRA1oL}|!PW{C~fAW19`%2Oi6AX8U{=f*qIB(_apc{j(cpm!9q zkNVA{6!)8Nzj}5dQzgsT6RI`i->k;+eB`!ti2I}8J#$-*m$8A5cV(U5`bz@!!wJ=QfX3bX z=PkT-M?Ka=y|Sm&T$dp^Rh>dJ%cEOC_``C>`BcnZR^^iRbB)e`!|-guD(u2s&~l8- zwS$x?5!x~ib<9=GzV^7o#XiB(KP}3cIAy#7ki5=FkG=hOqa~A@AiLuXo1~fVuL(y@ zHd%8AKZXPO{RMc(G*qAg*pH6`8{+72sJ`*VBw#1lLZU94KFoTPiZbXv(+*G1>In`yAr@_56 za?#$QNcSX&jWQ5oMl_TH-{cBBMzy-WTa}fdF&?PxXYEwJXr|#JvyV%^_rS$*ck4`o zKLvCr>PCtJf40M6j8I-vNXU8)Ej_!hR3{IQl%ML{l+>$ew;a)*EVK!DesDWd5^svx z!bRihA+`3aIoGx`YAf=$ZBl+8-H!XXKqh#&?v~V3da`1)`0;sGXipEcHn9yF1!Ymz zSdG`{K!Qy->&BJK^6On6^L=cz%GKf(MCc_SLd|!QT9BClE4WT`_3`U3E8!%Q--KmB z-E(pPi^K#r#pt`{1ab+_G-znNfpQEcq6=KhHzSw(_~IK8cP~pkj{$P8>`(s%Eyrp1 zol45J3oPqQQ~H7}-ww3E;CQ%GeAb7^G#tkYy$)X$xwtV~T$8yEo+Z9LByep7tW-htc|1+A9o`%z$i8Sn;Jx*fYuq6G^?J&7rb z=}M&0S}VXRt{bL0Uq#HQ*2ug;wn627%}0Z6Uk*RTPP3etGrw?N`Ma}29C|@`TVFXP ztrQ#J!n8B`>3##hh8LYSxhUyeYZ~u5SOPTRt5bqe0^%3RZ;J5HuJq)R$bIg>uj1lP zb24+X5iTN+rnuhX##{=kfN&~-Sg8*AYag#Pn1{42&gZ-v;<3hqL z|B6RQ$QMi7PLa^NmdDaNvJZa^{Y4`ALHN(7Y&yR+(xDCj!PdBC07sY0N;;+>Xcp&+hRVa#Wk&m=JWGN5GjI-@7G2o?C z-xKT$`I*ek%%b;~jDH(N+^3+7|700=hVaNwJ*nJ>y~D@i6!DowzQ}WK`Uk|Zk-VR` z$Ij4Gqn}?7y-f8Zy8;3wy)}jk zOhCA!sJxxG_~ySDwG%1v)EAEe6{k3jFoY=;Peko<&qs;`}Ro5#CuJ>{`7=|aM^@5yPAyh~p-Kj!&JLTDc*conmQf( z;z#Zt=L7dym1u--er$N+5P~F-^Rf_mW57o)Tv?SaM`eauwA=iyJ-Y@bGWk=;GD)zj z$ga!mA@PRnAp^X9{-U9tI0&d&RL|`JsT!H zYWaem1LKo)DHG{@cE(k=Xe*DS<6uoIg}yC$E|b6Cg99ezTc+EB|N2#+DEt#cO`)j{v+El&@FAD~mvxr2_`k0XQ=M`2Nfu;i$KBV zW~^$=UEZ9|dOfyVp%i!1e*6IJ9A{aTATH8uoo9Z-ovO28YewNnp=ICo)u8i4jnRdZMt_(*)XzcXue^L#K zPCw;uYH8#haBaOV6-=V{A)G8OyD&w&>>5^lP6KB?)$9i_r+Pxgd1KAqB%)=j`d{1n zwo;0^d(vDfZR=SCDIjFA^neh>VXeHjIDGBmQ+G0XNQb$F$@lvq!M}J18cDKqGcJAu zV4WT^jLT|JPCJ-%#`o=*hli-+_@X(>{MN5!zaKNM%=Bv9dt3A&IaiwDD~EHS=UAQk z+@SOasfRJAcwGQI?{SGg_u&ctV)%YIC^)Wp&BjrC?}{05sDoRVu}!zSaB z9JtZbg6U1>h%?@@BXe^dT&yF!3G(^o?0U>JS4mt+xXYGNb^vD^;A_U0f0vVZwRdh^ zQzs`GsxM07yUZ2tD9+1B6*kO!!42ewVXy&=HtyquvN(Om#pfj7hmxh=&TvbbYL2C% zs)5h1Uwd(ljmr)CDiDNMa=@6jQRWx5FYfwCW@hfynu(?)Q84p(my*z&ZeYI{mFhhL zXf~N9J^P2)V|{GaaP&c-0`5|;BEEgWV%d0zE$nEMKj|xpHI+IEiFFK47eqhT>sx=H z=O!BlkE$n*047=^LV#cF@5|xL1Luq8a}TKHsK&kTzQ9`Ug-U&Q`R(>It;W#t&bjAr z!b^G+)^2ZfcV2lw{zixX1-)5f_92oIHU^U#6;)=bSjfj){mSolb}5g0^0oay;A*1U_AIE*>JY5ue~di~i3CIQkfdA0q|{|@jy;xw>Gdm8}kZxKfd{&{~F{7*Z+ zLYM#N8@>vv2Bty39WLR*C#TGMCOP++^#BCmgenh_j{w0}deT$-hV3i5Rfnqm!x4P= zC2LGwSDqXD(1;A(FS07;u_lMs$ISJeCNdgR$4f5%{=76a<~tf>Ht$|`pm{!xA`Yw8 zs6}?86?f+X9*;L`m*fUyKDHX|W0ya+7R+i~3G3x|cc+yN-Ky7nH3yi$bLdQB%dKDj z79$?|heDh`s9xRN^ps7ZmSY++)a!_T+hk}q+UO$n|j^Y?2>oXiGJkMyd?ocNni zO`&6BH`6oL9&m_HMw1v)WC7?Ela|){aRPMpVj$G@R{ca?a`Z|24{6c~JqzIroxm5F ztMwg051r^cWldaSU*!hKo9Fp$#QplVU)f8yTJNnho)9GR=`s_kI_I0Y`lk^evYth& ztUi6z`D1Be-sFi@yJM%dv%0qBI^Z>42@+5X{DIY0!@e2riHGdz;!*i_{)!96X&7`* zv_M_h40f&Xj%yMafY4qWm<^l7GP*-Kg!rOmKfpDKm&+Inbf0^Io z5gs|&>7h^>d?;jk^p>K=)8+aO4_}>}qHLM?E8?uPk6c+-y_5pH>VEnb>hp9ZDgKB%T5!t_5?O|E5uO7Zrk=X=^MbLSDvvsS z46hHUl((FSDWvz)3LYeFT=!ulVQbsbS$w#as|OVgq!e_WEI5Xn-yE-p-)5LFH&U&+&_vx~iJQLtT$M-La={d8wX}I>&6C z=<@g)b=FhNt6^nhzb=qy#q<+}zgW*2XS7uKMrvTX66b4M412VzmiR8zPTL>wtdBUm zQ|Qn$lNPCYlmn9r%Hmj70O~wS5i0_iT9&(T|JBq2io=yVi35(A0ina1rajX=VaR6J z_cBqZlQ;YvB#mmX9gs4Z;qVR3(_sdCj+Y6NW$*y5tC6L29WvJHe?x7gZAWY4m0qar zP8kW`1IK*0&rxHf@_$L*aLD@ybt9NcM5*(}iO5M)s7b)!l3J_{{KNGq_dZcZLylPC*R-c%nxE?L`pn%Dm&%wqoH`A+uD2_Vx8m_GS-VAqlb zKMu&|mG>3L=GD4>>xH;0$g4;J01o7+MZl^!qkT3N-f2}G>k}_+f7?Mm-^pVAr9SOR zh@|=Lq(mtdkBJ0_hH)^Px0n)w?gXtboV6-MP`opgTv4`hE z?9=kSbgjwRQun#9vV?pEP&el?8?yfC(b5hgjT6ex&6d?Tdkbw?3@tT#l#P1Mm(en7 z@^E{h8dGu3ou1XviShz_1}BdBUZDuxllaE&wOJ>Ef1Li4l^~Rw6&~Kr!;O8XLj+IP zl$(q7GRfxnaks{OS&?mb`@(}v)i=aPuUt}`%)Ud4jC>a-Z3{ho9w7{Xti3*Q-1n?` z$?8)#7hmIJ=mRigp2+c!GunaIXqC%jRlEXGw0N5_^jN!HX)uL zlI0N>yidu#F8vdc5GbCz(B||F|3SU7q2c+cnokh3F0Tqzgrz2Af)u58>mQk<@vV<>KBLsQdhPyPTPF^G@9Q*kdFeckof%OaU2Y5 zfmnx!5!t3s_fUX-`A7fw@Md8^|KP2}R1&@RzoQ26ZXUFS;wqh^9aJnGjzmLeN=7Ou5?x>NeiKcf6~;j9cUFUZN>CYQCL zA=NsLY_~JyRR$RNwATEVXqh@QWWOrX)OgE{>h!C$OGpPV=NB|I#7waZX1|PKo2c&N zyJ|r8mH&igV4k3dky#v`EhpHo_Bl%>-cfl$5qJ(f2gttXH$Y=COUncaERDZzRJkX0 zpVM^T#i4r|5RF3H4f6^g^Hv7nHhG=}@Wo%~>Rkxpf~MyQh{`{@TYqMb2+iE{ z)!h|`J@ z%_d+#p3m#V&1pdV2WSU+A2zI7-4fZxt+@L;pk^XayOdWuv*yK*9yW!e0#H`t#)m#$ z*Lznvc^B}u=J@ym{KdKq4uzH9lS6VP_@yb)%2%AkYcaGpWjz#s*2(oDdrQWs3!;Qc zj|dDZ#OJIma2$lDedEv$QVZz}X(Wl}s&QfkBvr-~Dc0 z{3&%=?z{2ePwrR(-Y70x<5!{EPR0)3BmnijE@_I4T~(#~%FCIxy{R$&D;?NRFLC1% zM3=d&>9XJhS}kr?RX69f55IGE=BvM<U5Ta?H~0D20qCM-Bn8EySne9Hx0Ah7B-A z(akDK!R0|tu(LanP259p&EYZR7`_#9cYbllD2HY!-pz^GT@0O25d6kny}fWfcadPd z1C-rXF^m&#t|gT}gkFqQN&qBBcAEdPLO$4)WDC#S4Pt z#d1yOFQ^^lJqOin1B0@)^pkSmJN0*NAYhZdu)gIhFfic({+$d^%5Q_6C)Xx6qXjSC zbQ-_B_R>k~3PuZUfnHAxt=h|}J|u{kEB>L~EDx_?J<|^@#jvwVU(@#GF;6RaGfSQgJKE|7{kI3@D5)R~Joj zP>A%D4YC<)W^!Y`9Ko}RoA2Uqjv-G}k|ihM3U$}&9rOfO`a}x?b5qW4S)*wid;e#@ zd>B5PZibk%^-bp!4R1%P02BXt(#J=AO~ ze}+)FOass(Wo<0$? z1^Y`?UpW&=7=~d&W55H|B}NupW0=0yqBF8P=jdN}quzgb&S{;IOE@`AY_&aN;aihO zIG6rUhGF6Yl43+zY^|KkaLf@hSPImk?;0iqjtk)sH9L&!uZNfG?ZFC&Vj?wx5)WTB zmug4e9rL8G_KkQZ$!>CpPNz>xV`$#Dr}AjPtt(qK=FH8nK%*ey_DC=i(;Dietzn;x zzWq^SOXK#CLFQ(!@JMn}PqxB1p2-jUv-|KF2IvYZ3m4A#TI-B=GC(_|U0e^@4B}+_ zX52~pt|@vK1%W02Qnw1Q1|JI)w0lEmf01ZtJSXV3An}_QFFRJsEr@H}SH|@fJq@vS zMc!w2Y95+QMlJRnE|Mn+x=%k? zWMO+&(u%w=WSSUIi05xq=F^7ySYvVyIrtQ_)jL{E3?zyzb;>LR^-Eq#Hd-*ArqC5pQ>STr zY$GW2=4n=uLQn26%c-bk)QH?t>+n?3zLZE8{7A$Be!8hjjD1I_#nY~%I0>rQyCtP~ zrj7#hi8nv&Y=dW?dEScjmk9cCkMFkuyRrxL8xL=7+QoxOC(CEY!w#Zu755jqu8|2Q z6eFJip&yX%*=l6MX%-Orp~rc}52a0E`*01n7jLG?cJq1jg$wdq$JlS*_5-zjc7n;l zM)e$!kSV^ZDdaf!ge;}Ao^$bglB7`GUS{=XuCzG~{fyJYe|;0bLqDg4bH>6-u#!DJ zU|Q)_vCRRouCXo;8d?`G_N#Astc8>slx=^%&|NAAsBZeJs7`1cj0D3_g{f11^v>pk z{*Mc%pRs;aLh>HBr(V2F4%LzP!r?P{Pew*HG6z$IvMwjnju4l6Q8Oxr*uT#X@zmS0 zJA1Q`gHb%rneABr4%h{<1D&oe?BRf_T}0b50fuSdf820DzOglO4^f6>*fxobfUx;$ zt4}%+hrimNJF=c#KQx-z4Q6Q60%flxL$4F`FF!!|08kv0T$nVI*J{wil|eEMxC_<3 zJ9t3oNVr{r*9Lw~IyF0vt_dfH`IP|*SN6hM5P`FN%$%>2@~;oP@qx3MDrfi9hA+e{ zNLR%lD!?mi zaMjhNJ)B#y-uyhnBm!^!{D~-YG?arOTia@N;drNrYX2&YcF;s#h4lH|;`?-*`ifVKgCVfWD!?NlU%^@BFk++{)?$AZY(o-)iv@uU{#L^xzT^ES2Yof5wdZER; z-Z1Fzg8l=*77oMV`>f07GGz;a;sF;=_K*Uj^PL)45ywPvToiZk)e$XzN2y@f{tlH!1x3<6SU>XC zBoYi8;V9{Nk4)Qo+}Mb$_WeW%HFe_?ZS}Ug#k*eW>`$ZG7679o&KaHC#EG2@J~;|- z`w)J8p(OMAIY=V0y(IwWeEIn_F>*WeKO>FWPM{fBNFIR|vJ(i+4 zhv7ATt}7y5FplH4BhQU!D%=?4c6Bjx+(lQ}cQ>?Mb_g2o4;fK18RP)8CCnyKDoO1-h8xh-_{vs(bsfR&`!%N(l z>DFcZ)1s8~!|vqE6o*BffOHSfqpE_h552#||3xD7{2CR-Gf!ykVVgKNK@V`u9TEid z;C6E+#%yolwQY3M$8772iXYmzMW%prCYa2DD2L~Sua;AEpfe`Q>=@^V5|sDTWL-Yb zh?DBVCJ>cehx?}GOM9y1V%E)Bzd5{4aIWbJBG>2IJhtVMR4732&N-0q%gko(3IZ=) z?7IoRefZ+e!QAiNKhwhr=9N)Nhl`x|h!ls}A_FL^XAV8tV$;nUWqaqi#&3Ao(u7I( zTs)z=`>u9bVBSo88)+Xm8NJCfX8@&*eEhH19?lPt?w1JU4Lo8EfWaueSyd6aP~RQ; z^ZPSolv(L|_kD%rk32y_3G24{7sBv96keRzsQVX5k>sSyT%sukl8RZh#Ewh|jvrL4 zABom%QOo@LnnwNM>?NFGy-tA_oUJUpsyjE_#sjVzk>=F>u_OB+?V9r7oo6ARe*F28 zru;)W`*a*%wvyfrjzdw726`xqtjB{5(j3@q9o}f6d4$@`fsd5eX}6R0gm>loqq=-$ z@lHLwE)-*M34{w_WcY;kQ7hZTPOWd|!!%0%O%YMuFD@*(CpUwwnBrg|}f z1;$A6JCc_C;U5W&v>~A&-pOH5AQv8W0Uh*&c_cmuUZe6wt)ovPV=KH=@sDaa4}V-Hbl4|b>+lPGe|YE(`Yo8peg8_M zZZt#?Z%59@$}_#JS*yMIVJ zv?_mwlW(jD_vknrxNw^gOk-P#91w<<(cf67Z)%s{?@m6JbG+4=3DJw|>%I8m?}^BU z@ZmXe;rNacjl4bLRZLbK#JzVewW(d87nrRLd6P}Q3$=S{TS`!a)5-0Jd_}xR6e2Mj zCQsd7Ej)4GkG)gD8FGB(8Xp-s2X=V2qbofdbomJ>w0G_|54ZIuK3Z4ex3f}ngjX4Z z+gmEORuX=!B4%Cm@Lok9Cz~G#RJ(D0x91&Vq#3sdHDee!rQK2Es0T9TQ@%NGK$%> zOpyJVOqrY>(7#_OCDGfhqqwEg7^`wcml`&cVHkIIc4N=FV*U|J*T7+FK2^5y+XDmH zuPRuJEX?{UsAoCE;^rjqfVyU4XHp#dRWkBtOBQVSXhSqy?t4rtQxX~dStYH(-xVS> zh69eiQS6J*t0GR0^G#Z|G)-L{Y<9TWUi1Bj%M!DMZ&C(Q%KnO?dI_{NIk}6uftmya||FAQ`fY$o@bUn z80k@@EBYbj6u1%^1F}$oG+zSdtQOrh!^YR^;-KX=+qGE!$G#<2v5=0Raz-TRWL++d zx&qsl;{QOs1~f&oqc86I9>2hcV|+9xyrSpU^=neJg)6u=ive2BuYkI-MwMQ{mH;si zFufQ--(dwUDbBHIV($Bel6GM#_*%52#Qg???Qjj9+|ylu|A>446C{KG8T!G$>+k&Q zd9cy=GL?V+%4GjarT9<$aWToI#~ ze~3BA;f_dkH14?~B`4~x^;Y0hihs&8=h6T8!T$e>Fu{MGaDW;x)%pKl|Lte+pM==~ zMBx6nT9^Lc`t|=)*r2fVXf5o;np_7W29bxi?!4XejP>~wURJ{+0=h}iqkC`&#GWS- zf;(kdLsf&i26AHIbc~0Fjjsr5#lNQN_ZjqmsrvEH<&sc+aV6=m4J^aj;+nC*9bQz- zU!1}>+_724!PTkUz_EOjj%icU#djv_7ki}2wc>mnbx!_ABNj}g#e}jR2GwpdRqlq1 z2aS~gAGjCl$?w|>#`Dn7X* zVp=L*zTQxqp@7~r?-PB>Zss2jhGvfWwDh3xZTWb_!FsU531{yhiNh%L z25cUD-3v{%*E){Z?=ndZ&pK`S6@U9fsTQ+G@F?2K+LH5Y+g7=MeJ8#a?Xf~10e*@d zED85|l~m#Tbbmo<1^mdG;u5XFOtJFOMBAMQG{={XP>(9GvZi_YO*)=a7YnJkE$H(p7BQY*9^j(k zDqgXsVGjF{tuQEE0a|>irv^Aq(i`!qD@{truRYd)?nFl*r+wXr7vVObaeK$#KdCeK zOqGOPDx6ozBH_V4mIs@bCC9!?{7*m{v_FO3h3Hj_pBdM4pwAQ zs4{IQRz%YPvuS+%5Qb7@(|Iw8RKDjO$+q2hY8NiN#j!CE-RR7ap8J_n+^w{o;i{px z8L^ntUUzW!R&9jVR_d(?8POxnHiP@SS}IpbwA9?afv{O1t&a!J0nXv;ZW_1VpZGE) z2l9zFV>fx~v5`7WoFv=d(yj?3xw5~7PGSCzwNMs2!yCaXZ9b)sm;nS05bjv6{TX_` zq!jzAAbZJRA*Hh|wWpLXROpI{2(>vD5fLbUOQYg%$yuRWs_Dhdim1wcZ}u_{x#$yJ zh5|@DK;%ggH>_&Z3MRbFAeqc>M8kWQm@q{X-Wg}nC(my0K0bcId4bRMewy4MQps<_ zkYjCr?H`Ue61`V2fo9}*v%+@^`!rzlcA~uecG?_mIAPX+Qf*E_!IAad9z{I=zmd`Jz&B8+3*jFq^*4nqmne{A`E*=xy zBUci`#ST{LVva2)7V|6XJ|^V|UEK(DH*jyJVKk;m(7YeO!t&?h-?epFf>*-MYvD67 zV~1V!F&U0OANI-^`!H6rjRz>62^swcM{ThePlj%lk3vC!16d=`0YA7FuRgu{_ETC$ zP|`8E77aabqP$_67V&-$*voB!W+meQWqUXW?=%6>z|hsRP6y50=~o+})J3s^ zFLM95dw*d_P`~F+%k|v|QkRePy)03+n}yNL8{3_8x3mmLpR)aGUASUh8!7N8mE4&> zlw=6;d;Xfi<+wzt{i_r|$&K4PVO(@OLIAn(1Sn(W%PPY?u@ zCcP6B6uoI8AV^7UG?A)Og{X-1CLIEyNRcWapeRI|h?LMf3B8CCDT0KS0D?$MC?Sw? z&*d}UH}kx+zGq(FnKkpxvu3ff7Jsn9Rra;7z0dPFe#a2QQUtdI*LiaQ_+kz~ya3c~ zXiy)7*)`()xOrhBku8Jeip$wM4PW!gfKV+xX1?v@jg#jKBmXTvhw=Zk`T0l4%|9t< zKOnk84v~~%Iy9Ginu+eLMDYW99Q*$Wp_hVx{_!`17o6gN$}a@5IYGBx9MU}i4NKkE ze?D>W!+)6~5BVqg??0#H)KZ)Q&+q4{Bl?}SU*`)Oz>#vhZNHgfnXkv->)D9E847Y~ zJji6Ui|KEY>A--FR&Ogy6zK~ue;v0UX;8XLe;8JUZWHwCEKBVQw>{dY+t$Mu4SHZ_&SK3?SpHwc2mFHbwl3ua??0a~D zEc+$34~xD5gA?FgQ2uk{E5s*pxi4FTA9}5XJUTBNeQjqti2J3F-@?RH>Tmh+378#G zOP`R1jM;k_f%PA+A8b0+DQ$U|Jx%!~s5Lb7js>5ddJ;9{BMd@IrpksDj*ze^`>}b? zf|TECGk(o>(nN>lwj6&1H#z3UZmzX$*t2O7uaY1`zT|zWWoM0FPsf>3XwS9b@KUNiir}Fh#24&m z5$(E(LsVGk1+g;8T)5DDQNlz=?(H8XHiSnJlBsU(M9#T`-t(P1wu1NRIe*VkO=rH|Vve(`@wh*r5j%m&JKQm=BO1wD;)c z32oWEame1aD$r6+CmJY|^E-bHm@_pU-r71^`> zJ+A*iH*d2+Z2ho8x+NKpu zAMs7bh_|5Yk$H?t_H2kozs9;l8G(Y6*s7$c>JwJ`1HY8GdCHHK8A`vdEZ%*+BPl)eK69_I* z=$~v8Z5Yh+8+|RMuPY0>MLDa@y_EJG@S^MD(Fr-W;mCvl#KoH)ERPz@YYOkAHV4S; z1nY!rE8z}+SrRLRzcxWtDY7O76KJa)4-ocpM3^)`wLO<6-`2%+kW^o$!J3V87H}p#1LlCvQTX~UAXoWX zR5gWzY*2`-oe+>%ujpjf>95jZ-$dUwWpC}qbMZ_IUZ3`e4qnn;M8X__+=Oj`h%r%U zQhf^RCRj3h)iiyJK7H)rqYLdD&fNXnUSUu2zV#H4jA0!VZ`jpu)U!AVY5g%pr+Q6V zZ~82TPr#AGja`rJr*P})#4$}isM%B&>_1PeiDCDx!|5>HBa5*1l&R930qh_BayBaj z>l5-w_{o*;JlcelTq-Sw+Ivf&s}bE`@Wj45oF`btyg95=v!B1M&ctdT&5G6FAC z#`I3B!)-gpe;XTvPmT8kK)OBil9T>zrye!7wlt@-*JBt>^TbYRd0AXt>?p-2F9>-6 zfevoaQoRwh?|Q~Kc9!N1bWp3gk?O%0LCOl@)N zAOztdeM*rF0s&$=N`~Ry_>qE(sWyF^trwGNL(ja=RHv)NF~B;-oqu%BXEP0^LZ^?RaX#>qTY!Y;4|!@QC?;#Gmb8za{`<`t(^WslAMo`Z zEGpClDK(Gik9DXlF7%+WN{h*Y`P|<;sgTQ2-kL4n zCv>|v%HJ9B)V;GJ6xMWD;5QCYR5=J92|-E_l%mnD+)*SIvR{v;X*~5>!QmHq1)Xk> z)0snsrq^x@&o@T*23wLD-Xu<7<5(vT>bPSiIb zJL1|PjE%2Z(C=+$`aamY9k-FW8!0E{!Se$5RM>z07KM?h^bBTBVB9m})anBtBXTx= zOqUPR%*ubav;BfY^$q(6GZT|zZ~a$LdF1jX3W$OJ>BwoJC&e5m11<0qpxHkGT6wnmGWF5KR)?P00B0PTznc2;Y+{eDlC8fxb ze1I7`4wi(EsQmC;F|dAxE^zi?%Ow#eDUDCjfxFQ?Ix0PZfF z+wFES&bi)s@rif2VZpNN{ONgJokJ&Yd2z7bNxQYt&W=N3Z{Wg{>EeWu%-_I3mk2*2 zc2l1>(h3t*YiE4(i^Y>yB}~GRcoFiqkVUb!?dQ@r>qd=>WJDtn_05RTQ_Cr{o?PI+ z8GHxceV6`iQ2MjijsuA$Zdw25Cos>&}_9J+M$BkOZo_>{m zMf#=keo36J9xpH}gC=I5UTfX*OS_gY_sjafhcp;{cP#IMxPY*BhGbp0Bk;>J6I3V7 zh+kjDORDs_6(JX6GB>!~r?o9}-{uQWj_b;}D>!M?V()?=!`@2An?aW~iR;k3R?x;S zcWu#KiIZi@LhqIR+`Q|7@rtC;qK&X1MyuvU2uniA#O(v6X(LkjWV=>{F;Tid zk>H+FcDlai#Uq3Ec?TO-Lfx^e4qd4sIDd#F`U&TqCDUFb?o-zmwLH&!8aGb-`h+Fd zTiGdVnBiok@)_LL$hD6kHb4sf9*%$bbAbS?w+D+}M*!kzsfEKu3S@!`C=xG+FAOA4 zEC|CcP_D`La+=zZ1FD$b*~^2CpSLC)>N?)@o*QWsl0R{1dS$3|LKCD0GY5KpKvENQ zR80rew__yvZse=I?N(Hhetqo_&l6^erD$tOKj>BZsDnZ)abY8?IQWI`5Agd*mAU@c z*kZ&hZW63h8AwYBLj$TPWWOoT^ek0>qNu*H=@3SF^Xl==i}bcnamTEDJLy|Kmx7Vi z`_Nchu5v;HN}}DXRk+$nc;uS@ca|ZQxtR0bPcJl8OWvSx96|^sr8|v>2<(BR7o?+B z5lxV2*hP2F0-Msu=evSDQZk>xnwyKU|9q%w;~~MbHRziJfow27!$Ns+u)^rZ^@gVK5Zo`8&B1*GQ_WQ znh3SlB+~EIC$d>6Yq<1y&NN@_zw%@t^k5q+i}Qepwaa?DAOCC_N_s7ADle1C&P@M&KuZoh6^8+;Wo?ipSGF4{DzlxqB~+;w^Kg@va~Ub)Jp+0y77f z2C@vrMP(a9iNI9b2w6+|Wk%%{@%P@ivR_HRd`ZbCDj4*9Nu%g7YdpLQqK(*qOKi@N z(&}x!_h%aI(N({8wk4hEVqV-pl1c}#i#qq_KnL!NhNN!L)h5%X2bP?>()iufq3mih zZR6Xl*=G&k8FJWss;I#{lZUjoZ0TLn4T9DkY;-N^FbyaXSr-*%@3<%Km>&N)ym}>X zx7Fr8tVQhiWxpbPEN>DQJg^BzkX@Q1fK!%)JJ-&jOS2Gf2mnlC5>-g6ZBHYc*>1mS zf@2l5D}cNlj0u7u@$C*NkM_2N{KflWg-ehiX{k23FqH2%R1%p9G1XS*(yrs+S%vyYDR_f|gt;d;B zBY^y7<1dE_m;c$$kw5+a|0WKT|3X)sX%&$Gtp!9@2w{1Y6aWviA}Q4wyQ+VO)KS08 zU%Qj0@8e}MeA*s=0%5TA}LT}2LfX*y0#21cAo>yhLb^=|hrw{{IeJ4I{F zB&{dBOWQoB+!6HnoDmB?cqvtG8AJYz+@+;C#8TW27YGHL5#vBg83=nBU!tVOq{bkPXTQlij@>!| z#vZUqVMEnl=QSUEfhiH1aDh?48~Ke5(XxFiC$uE%eZjemh_Q8v#J-N|4_xD|SNocn zUR)LKcNZevB8NE>V*@Jr`f{wMP<#aX@GI5Wmf%8ll^?L4>X`1{V2q_~%g}?C1A6=- zkV!|v_!X>+MwEHPyBj$^%`8M*H%rg0D|5@%R4bZyQ*WHKOsB1FIa!ZJRP-`J5sZ_hN2v^mZP%;tgt(X2F| zRRHGHPr7goC9vt^_q9N~UbqXY*+6v1DH4@4J!mL5DtbJ2pEn2#^(juV$_eAH9Zk;>geo`M<<-{5tF^Vw)Kx zHTRh0NX2av+jMENKHklZmlIf`SJxy-yA7#)EX&K$&MVPxS1gG6a?izGW=x z=?c43(3rx`oI!Qt5%YiK!6u?VIl_t+KEfK7$FDN22(MI7S&8AR zk!Z)i83cplO$TN+sU!Y2c?;_z1g@RZ_Wef~#d^NX=pGP8VR3YH zUO4T+hMcMKHxIRPjcwJL8TXkh;APTSMS9cd%NOoDO?bp}urRI8<{Makjed^ERT79V zpoqtKnHT|8vh?Ypel6bx?Lc%Ly!U*&Eb(aOHleb=5XDYBzGRyux1-&i%>8nNKWn}+ zs##Jm+_gCt^ELbi&{-N&dp6p@&G$1qv^P1iQC*0ruO&ozr)RA!D=qGq8!!dfSslx( z(gGHZMLF#g?$u-;oqe16m2KFICI^h(2<+A_>3w5kb<5?Zal`im$2&!o4Xz)DcjD** zUn79`{4wpbgyC*cmX>$A!L2D@hz;%eD{Cw6wWD>1Y0YoJX0%!ES492u_bFQ~U!cIy z@n^@>{F(>A1r$`i?tB5i>E8^nIwq(JIcaeq0S2Ln1pC=Hbi59j(>uS{1rt83`4DuS z(z-P*s2(tcvHgK|T9|I?Li4~_m6BkN$NS3z-~sZ!H%Mh?th2b-d6PxnHZBeID-YOO zZV7>hI{>Zl-keB4`CO1uyxuCS{6$T@yvW`77x;$NLkn6elf0x@)C5mWh)n7g`!! z8WeXx*CyyEieulu%KQ~3{x`$Nj9G!^Yrk%NL{Of%RAXuvfV*HEL}3I_4~lK=y0o|6 zi$Yq1gHXW9z4Z1`t0-BE1o^6nl7T%STJ?T$(CHujk$ouyfbJD+{weH1nW*qk!yhnDA1qO^u~ z_y;!xzb6&s7v#qpSO4K%hPBk{=Zvco#aIK5F6-mWxCeVfNL6xLB~`GMFqa6^9)($z z1ZRxhJ-2S=uRIb{=5c!lsv%VvHI=4UD2FITNf8}l@ET{Dr}jHk45Ob+i|58p_{cS? zMBa}y(YiOMey4WQ;{kfyTVdP7O9*Bq2n_H+)W=T-08&oY)yxfA@4OMK>86X+HYyR} zY~LLIqSo>W5g0u4P-mF$K4t??oP?Z=z<@7DZv{}`&$3FY^&!FcdC%MrI`-7>r?3U^ zyfc{+51#FZKiu<#^d6mEsS(p`Na>(jn3RAC%5m~+T^R94Zz^Ed2x;-omyZS#{dF{b zyHa<}5(TNRqmY^Chsfg!?-7e>&qdojcY|!Ye3gGDJ(qov`8_WNve6Kd@`si`*PUNN zkejOi0=Z%3rTDNe+HmV!s<5Q&1EiDBsV6#Sgk#d=a+$143xtk2m1_^5=t`7gw zJl+S}roiAsCWKX5lojCF8#a{r4hmZrrDx*jt~5wE-mM+4-;+}Nw!Fr1H8U#b5vy#e zYOZX8e;S{45{>U(&BTTgKSejC+gK7m;bozxUlQ!RnRuO!$$cT?r}GLZT(sM+z@1X= z+!}>H;RHIN_gmaO&z#sco)|vJzVwl6G$wnM!7(#Yp`<_j_`g(POp;!I{O)e~Jmmd? zodXs!myf-dF81@20rJb7;yOOA)yq@+G(o!0;ewHGLsfs}Q`!4_PYifQ4F|>=A&&N8 z=3nVo=6;^4oXdXmp~p}BD4-`}R5iqDo(B*d1@>qv zU6QKRU-z?x*DLPEvZtq~xgBj^C9cM5Tlpz8MlE^@S++da9!N4p zCkE*biY4gDaJ*32hUP6a2t{gZ;gBhz5$Of43y;T*ks8d5 zSQL@K-NnsFRhp;@0G)J!PEX~S(eiD;Q`$3`J|2(sA6zjX6e+-VriqX_3(2(ui>OlH z3K(=$`%bA^N2jqUrZ;23i06{x`~v?ry?bh}(rQ=)UhSX{9^I~fYeD`$hvFb30XYLQ?g+lIzXU(wzQA4DI>xzZ zB;#AsGx#9;%1*`QG5nQwZk- zutKR(Y7fI3EB1e)Q-JBAGUX_~p*f!}lZrRJo@~dV)9>yzwlz=3%DpjMY;JsgLtoxR zLR|70PnQ5uiiT*{Dvuam?a%$3GnFrwbe$5=ur!OB2`(}oy_&xIq%)G~g^A%6k*XZh z@yTs(ZO~%JxsZ7y9q`Tth0)ZT5pIn*9mexqI)*xHc2`^WzBQ#$WkaeOV>}mAcs&Ci z2dCyqP>r8TFe;+VJg3b{rNti{S?NNxgZ)VN0betGsd#}8sF}#^QimyR3mcdXTJ!Ft z?##+z>DFOh;BIP++Mdoim0^g>wy?XyF`(cKITajwuwmQrx^c%#yEyX+B_SPUb=>4$ z!g3HY8z!*?!J-G~pvEbxRv2mS+;VFlB&$Tfxm>_IYvN)T^HaI?G@x(Dy&Z9$dTFx# zLg}0xcFv8{yD=)n7e7=PI~kuZEnq zU0{oB^T_<{<#U3GNw)c8$}`MI`Z0L-7vOaCD0D$2H5ud$uLD4VO#m#+cN3V5;5ple zc_CC~2Qgw1=^YV<;6dP5yJs{?Cf*@7GVBlKRBLCs+tbToAIqcJFKUUi_KhCjPxGXxRT~?1-_F=mszRLVq z^oWlXMc#EKcy~40W+j`siS}3DTB~jYU5I3;uS~tgFx;t~EuLDmiXoo|Wzy5*-IDL!i3ncf3F-{l~n@BImsmemV z?5|Fd^{&^->BKf=n7=uBD{X;UCQ|qdE7{XOkIoo@#QgoDKVhjW?f0 za^1}jtd>fqr26J|{>!>oBD@O>`

&kt-v8deOcVj6>kNMrys zaUL{A7lQQOP%$hBkM(x!XBukfOkb+Ye$c#Os)j=}O=SW_y44=7Mp_XCy1YNLJk+*7 zb7X}e$80VTy1?RdXzv*ma6%ZRM&l;%^h{cJ9`XsZ?H}bWY=G*7HkCq%4m-O&lII(v z7kV4hMHX|9pU*KbV~o0SVE>ehmDxEe#)K9JLy#@T5A9%>&9F3e(EPLzl+1-aT)=t3 z@wLzm5OJMWSsspQ`{B_%fFIv0eg7^L)1QWo>Dz(n!Q&C^9*a2^(ePTspyi6OVIT00 zUggfmDmMAfozizA+LJjHW0(zDcgbBxXpxkkIekAi#4wsaSL4;vmlWKg_%Sa1D_tTi z&FJZJ2;mzBD4>#Q6ur`eqr*0*Ir37_x;>K0&pkw+CMeFKT_`&90K2@caOP->=2F`c zyAnRkOtinoPcW#x@mIY5ofn_nq6--`=>s4Mr&{&C2JL!5e|{m9SZ^h8Ta<; zo1BE*e)Opb7FW&VdG)sFB*%;qqlI(UctaV3!K{fE-Tp-b@qjf4AO;FxdFxYDgXQj% z!wK;QUt#)=BnjJj_xKEMwX;}JOQ*y1#JAB}Q*RgMxhOY| zb^@`?1S3f<=&$<;2#Wgs*7oaGap$kU{{b#|fjg?a24E_!v7}N@KR{K2I!#pQXgNHS zWpiKY;Kq>5D^?~ACIa&Po&>uIp+Ci`XiYF3>)NQy_8=OZP_!>Qk#D#>?rn5hdI`w} zlOZ2aAa1rL$VmJs%&=g=KxW$a%$XW-*7G}h=EN>+um5_KLmOcpo_2&x_NSo5XM)2F z3BA`%8*HYtT%Vk~d?K3TRZkWq*hgy*ysImhI?%uHNAwn?KCKERO8y-^q6%DXuKiG<*T!&p9@E_e{ek$Aj6nGxI~1w zo9lKD@DM73f07@TkmInyQ!C9O%$CAC_-C=$w*gXdTXUgPz3|3`sGM#H?*`SlbntXi z@8pP+!3-c*K6WJ-)IGR{u&_nn*phaAm#yk2rkTa1SteZx>nWu7ulp^QbNUS+PN~6# zY0tAV=6BB7Q%tUFwb$~#{#7JWpr!R3u%oHKzyRqxfB?TgF6l#y8Ll448?%{B^1$H`Lw6sfg2r-=@T?aAe!_EhR6GRRWZ(-$-jb2eyThY zfJ}h6k)q^_3CP%Q6Q1fj!-4=h*(DYsNtHUX`lfoP*?I*mX-9rP)rEcRpw?R7O4Q&L zYpG=5;eGrl%BOtvWNO~E^$DsR(Uf$XoQyuDeS4nctMOFqK6{KRrv$BCu4WJ}Uo=?C zwj7mCm74mQ!Y})vrkiYpFG-6-@!OC&?F5J4Hze=$bp@rfWev1AKcTw+P>MqzM`^=2 zi4K)Q&+6xx%&RA&I}Z*rOJCeGJWo-t_^7wk$?Ug~NXZA10Kme3&Z4n;A2AN9Q#k0; zu^jJ<5a@`W>dhXNztpA0Zxm~B>rykTd-75~+kmtEz?rdyh-Y ztcsu90t>)60CgiicOM;}e?Eo+x;Ighmw8b0Sz4w@ueZOKr-en&FL?@(6Z_NA{6;H7hO?hVE9LPMn_+0YnNX$KXI|DT|!$ zw_g0@>G+jmVmBNV(i6|Nk#yRl@tU@8zAx1MH!>Fp61_*qI9wz@U*eSRo99YoAAS>d zvmtkM)gaGC#@WhZ`2q;cCKEn7r5(E6)e*EvLi&~s5Vd+VP13wM%xS51B0RayLkn#l zJB~~eIhCQ`_@PEzz_b1*#2ky@Hj*dM5baq=tR(|iLcUS`x@$3lqPe1*Qgq4rb8_5i z2bIjUS3CngqNq=WsSmBmnRaA$Vj95POx~L_U36Q^mmKqWsk?0RDb-T@$1{VfzZq15 zoV_&GBjws@6=2R_z&9;Ga7e>>o^sGF(oT3NqG3fx zqYFL01J%eJm@du~i|*HaJP(@m0u)=zA$|hwHP7w2&Ay0meF{tUTZ0CT8fzU-~y)hQg)8tck;0Y>b5-Pfx`< zT*ZCB?Qqwb>wdSU(sFP)n-@L=JAmR3RHO*coXqcSZ??ZkoHnzLAitA3Reb8A#v-bg z%uNWK!Zk(n=^DkhO>8--t53N#+nkl+IIq2F#vrmjw4{MFdvDB(;YbH>W?Znu_L;B^ zFh2zY0}DZV>i7nL{fb9XKl?y6XNGfIoZ0l2ZVv@#@|D-g%(P++@Qd%MEsex^+Xr`VFn1&oBr@qf4${s1Q*uA<9z z+Y)@`Pe%in_ifti2zjbKu_M2U7-VK3U)f#Uk}s5N@N)H2iqzpLUK3N{A&qmWUxlep z1f`?dDjy`WNn7KeUq5rc^Bxle<62@y;suUBZF2v=`FH;|4Rx|}uPtWN5C28|?xa%b zj%ptGg5r}mPcr83pJx~BJf6z$&ydU84DvIF=D~q9wTLmafDAgV+jfeSxrP_Th36Q@ zKY#%v-8$**rjE)Os*tR(v4!rUqPY+ zeKfv4O+UL?=20LZOJT2u@64tn6UTY;7p5Ld9daB;`H8DVKv{id$|MH#d{2MsW}I}X z0#$D{m^o{w$!n0|tz!dtd_YooLM>=a0pNY8tl4U=&bE@~sDkYUhML`rXK=>FoOC#d5LB;L4Sy zx4->b-*jOG6d!V1FPQf$3?v)BKX=CDIC0I=ZlW%QCz=bG^gj=Sz!(WEg>3cK_DtqQua=BDoTezRVYlAk6&!Tn14rH|UO*ebKd3dL`Y7Wn$~I!7 zExByOWC3=7G@H`)`$uQhJwj%*9_Xw(qELw}(%-dCS~5i>mXxfE2DZ2~<=WFK_lw@j zlj`I@L?jm{ex9NR;h`sHb-j_~9KA8GbEcOx8rXlnbH2YMrFBd%_zQzSza>lg5`z7w z`b9f8l+0*_q9VVlx&4AJ-yrw(f>*rU4IcNQw$sx_;l6$xm(BX0WGw2li|Vl$WosV? z%$I!(rn(QwVf_F}(6?Cg)Qb__5Eif*XC{&6ST|uWcd+=8Az!1qk~}$yAi8H2M6KvIvSPOtNd1g1Ft@3^GZ3H zwYNGL)JdwI4Nd`s0nHf@)$Sd~;Y1+Q==tDZA%i`P(Wa74VU%mIFtSR;+Ec2*xMSuPNX^Q%@nW4f_=dW7uj}|L$-8?@GIbr%tKR`$dh4H6d?~pn7F(k) z;L;z*-Q!9vJ^eB{n*03)wFff)U#yV*$ua#qRMDDEQxH4)FgTzUl-s7A+Mk<}CF<*; zh@c**(9fgCk`YB8T-7Zn3ETH}WrAPdd)mvGp)V746(kLmw$aOHm$r|VoPdh7@qN(d zJxxtiClp?_2rDMuCl425)KruB8n4;MF;`d$Pl-J4Kr^M7eC_99L$F8yR31Iv#e zb;IiW$UL~?!l6b7oZh|--}4VR5`l_Ed_gm5hvPsgqUZ#e?mJqNesg1Ms#aR#wR0;W z<}W?<3A70sf8zF-0fGp^r zzuDO}XH4!sA@YAnUTX;}`-@ScOKlCo3+91Ekk^oFKwL(ps)Um6xPA1TjS1TMuv*mq z4OZ_FD?==3YdJUkSvZ8C-`A9Xg=~s9hMQ|4x8(=&$pf#?@FoMhN0%~4iq?`re8)(v8<=Ahy67Ogn&leL)+W$C4`6mPs_$D*gn zLN}UC+jJ?Z>`8V|v!}_T2*{7u{!x@2duIPt?d0T1NSDqNN*B7mD#f$ZRWm29avPaF z5-xaT6>=ugoL+VPQ*5=t!TJNl!c z{&a_vg}NkzbUxL*gg&ys?*VbCRO$=OEBIFbecwRIYadZR(=VfOM_S&lCziA2Uf}9U zjZ%MUX%h8shV+AOG>P4tCi<<7ctDCEY{#Kk0LiD5e9lyaYT8Do!!N(twl}3&SrWJS z8t!@@UXQ$LcFDc)54e&JO@Pi{3`#_I0{u8nm&+iJ$r8J(+4KIstB-5yU?W|@C&Nf3 z;c+3{UGV3jm^eU8_yumC`XrZfEiB1MD06iu>b&&>XBMZea$0q&6*!e&Q!w4AhH~ zBhEJEw%vGIo#60eVpv*nHACM*eBbP%K5RAd06qOT1FpZUn0j)O%DL2`P=UDD+QNIi zZa|tXUzM>(`cm}C3>`LctL$JS+`s^Qn&L2li3D=8bc+^vP*;B3G(5KIuBlaE#eit- z^_w8Zhi|af2FG``a&L?hkON16;ljY!k=3W+2qlt-5Iiig1FLJ#aTA#-VAg9eBU zQB3i=#B=fCQkhP@35mTv;zdIu`U9-)JmXczWxDe1DC*SfN!@TzWj*HPteYGTeab=Y zLoHhR^ZCxh+jv9!U*E-|mYpY?ApZgHePoIU+C!jysPNiB#Fa(@DHEUY4B=K+_t)6x z+a7$(BFgc9MG$a7KVj%4&~N^7IqAh1)xOvT;!4;P(uAc2kp}tLd5l*bH6kvC`OT<~ zPq4zfuELk?38u90Ss+FGgzfzKNh)_q#Lzrr%)kvZglTJS-G5^hes~kTO#24v4c<&O zVD_Mp%dGiW?J8_a-qLhjGZ7#5{b6ki8E0JxA$sf4| z*Fe)_3#Lq+XxBJT{JkE~T$`hags*W2BS?vQ1{gSL{1IcVIWhb8Dw~qxal7Wv6|@iU zu=8XNi+zhB)(5SMub`U913;^(2f+z{f)W2YFEoy>+nY?paDbAEOj@Vb+|uwRkkHXz%qQMC|&ZVwzu?OVNChoHtFZbBBZH$ zw7m9fCFGcduQY0a5Nh&SdC1d{_+ z9gTl8j8;0t6T(QYL>S=m5?h4!Qp%y5_nOtytveU>T!9|ITjZyYZ$0nHzWd3-0sqed zq~}|k{jV&fq3aIfVQK_*I^TuIs5W9T{BiEVo%|oObJ`UjewpQcEP{XHKXxoC(;=QB zU%A~2nnqX<_J8cY%iP3jt8<|q#>pl-CMU=4ny~0IaLKjO-oZGL&H{fp=8XB=6e1T#Ndc^#JFrZcqEknoEPJ z_e_Xgv&zZDTStsvBQWqf4E20GksaQxPphLRcsuoTG?6n#1dn>JvC zKFMzUWXh;1D69$iPQ4BQ@z_Zo_G|$v=AGix9odgTJKbr5BJIzcwwcIQO+T%oGj}#PgfTYG7DN7f?#07a$^hxNU^`@cBp!KG`a%g?dMqfGk zp!aL=Qs;r$3^|1v?$VTDdj2zUX*l}|B)0S9mCo*%7y4l5aDX@(M*dQ<<_j~JC~6p& zzf`WhJJXWFrOuzqB{ImA-S2bBt$s9N5$IaC(M6Q-ta)g_jpU6Qfv;DfpmeP^$#46s z8*3yb@)HE-sxtseuiJtxnC{nZW0u;~YJfU_l%`NJif4ujZgO<;EY&?VUd1;5)kqX? zkM4M3tzNY>kGfY!K20$UzH=2#xSaAd1#j2ACOf@d*?Sw=<9X@PUCY(eS4T|6bM4-J z$IzmIMF-i=cK*wPGrcG0^BxAlvM_*LzYG7D;+^n&6g3zFhXew{!t~J)&INoDg^f~!jy!G3f!dVPj4L@ZO#cUOa-k& zZDEqTKp(_{%(tn98l}ZMp@Z%po|u|P-5Q5HfhIwOVBXG^RQm~Db~&FiMd#R+jI%%* ziUIg0b7p4$C6g1#mUq!|)@P#GCN&ZTUYM z$Nw(l)0yF@v0F-m_lj;kh%0r+m2{Q$|oCnx|fqX`&&Kg*zRIH9p!J6W#q&ntfVBD3XoN( z6EI_tAYH;WLN@GPee0`s^^2#^^4|5hJQjitewhDyK;sKcnK)oVE7+pSV z`xQUy_n~|-&^g32$4@hrdwCSRD$0Bw7n^G>Q^DYH?z1T$e=5- zM{xc!E{I9|QCvN9*tsI2N|&bYP~!ybA%0!!h0mkriGq}_BNZk)>=U3CZF_d*O}J;6 z%ij!vVXl@py^AiKL96@!Cxn#mw3L8N{Tt-fpm*1s0&TsDI6wQXO>r6B9Q~0KEEPcv z%#vl;ndMka1x!jODuZJT2y=)TwLFUfWFd!_xedP6s#r^U+;Q#ROe-rMo-lr)p zYCL@CGe7*{X7w$ytXqp`F;0?k6UqX+o4vc_y=gD>OwE00akR4G^n2Ztm$g5bJ+WxP zsbo1Kd?y&>+)2%3WuO2W>%jN*93cl=;a|SKnPclW+dis2EavgbTP6-`Z^Ff;&%_T1 zg45TL+i2{ zqwmSM)S_X|Hb^Y2TlLJiqraf2Q_I1$^3% zoB}YmGrsvFMW)I?gr~c~l+mL_&hLCR!@xKfI z{4P16-74h(5U@|?*B!0@Eho{>mZ%qxZ=N)Ew*gp7Ger(_GE#JT-H0&yXUl`jh=!Yu z2TgigJ0bxxxy$>ny9Y&p9zrI0DvY8VT#A=R3szO`bF-~GTp~UywtR}6Sb*Z*eVa=z*mr!~{|oFlcEN5)v*rAI`h>*3(q!Y?FtbnOiPV=-5-8^sX!IDAEoseaWd4dEgy56crGP8$cx?Rc;%i& z`-1@akG;uZV=j_f1Z3jY*~YKh#)ZG8PL;lvu?^q5Q>*CP{Or-yAttpQWVh)wqDKhI z><{>`)gb5QAT!{)LEdHGPJz2Y%{44{S#0 zXRd@~v?Kid9L0zedu1ZCRzs3tqVuNmM>58thT!l_K~+v`=yZJxMWIz>@lI^`l>Cjy zLFO?~yQvdItHp(Q@TuT{{qWG$gS4!M+JqRj@ie^o+PHi$D1rGZ0R8aBHZ8(?wm~=W zm_)%cU$)n$+YLP(qZjAwgwr`5NHcJSp6V%(aNo8iOXF925Pb9r1RtgsEof8q2Cwn{ z2LCNK%B`Cb){YqYcG&i8HdDUPcIZ>y3%{@>@8e76e+BKzU%q^?qj#t2W(t2DsFMlG z3G9vkh`DzJC#C&f;^~oBH)h%~8>Eqit;gPgM%~W=;Px?7ci=VDpeAoDc+?d=;;+Uc#(7=w6$DMu!9>2g-c_zl*IfG3xTj^}?THffbm>)w}9{_gVHK;a4A4k-C zpjkXCRKvOE=U01=lAk>AVpPWVWE6agR_DFO;0(GT`;|Jn^cgs0&n_C`0F9R!k61-+ zsjm{}5P+f>fF}}0eSr14HXY;C1UHp~sN?hgW~kJXiycY2LtdijQ`Kw7wapiYW#HTk zt%ttzHg+E`_`7=0K37uY(F5AWbH zcr++Q&Yoq!se~FtD+DVVe{`E?8ZU~`ulCRu%x>H&>%Z=eP>@~{If0RmN_Xg@08Q@$ zguu3vw(??!Ioi1O`gY31 zrMIWp2BmP3ZU`zr6I~C%0-t*MH^Yjs-0LsHKi$&!SqQQ$t-@9<>-;8^I^JM_O9 zz8v@-wCt}`dMK8DL$Lv&Pk8URT!GcT6i3ss_N$bl_I&!vJlp4z*}}N%(j%Q3&>P$K z@6(ZMn)KY({LGIwZldm6GeNGJMm$)b?*TGC*Dyft8oMd$91s9?HYYyf%*^wBEgD#3 zUzaxjqZxZ5K$#kq)p9&|5INET?~_y{i_*d5I}a;+z*#}Q%NSLKw;UWVrKrh2uWRlm z^USDSxUb~6H+&6{cRi!t3nYaKC8`=*ZmC{U6%-P_Kq4xR=-UUxp9Ig;d@$d5pAlyEwPH1|c(`(7p(}J`m$dT!p(0Vgjv!C_4 zW`?N`>oBx#DsqulOg|SKZ$qTf=HF$%sO%j*ktmY)J@$60r5YpZUO(9E;`!?PH1<(o zUJw3X*n97&ruH^%I0y6bElLH7)|0}F`*{`A z_dKmlHvayQ*B+PLybM~OZ-S@@F1b(Rpqu|#8M!D{hH_W5@$}KTF_HN`O=I1O7 z`Rdnh6|+Ge%0PjlY=H`S)89qereR^SKv8!3-t7BmA5`&AIB&UpKx3YLzA1Tv(vJ5( zA;VGBKVH>@+HEOfF%X~Vg*=j_&`ND z0*u#fla7>0V0Ore?Hg8B#(%KEi*inl%5te*8P=^MREvvW=I}2TV9Yr&PCN?_@>6bW zDtlan`mr_7jbnI$+T6;?5Y6=)nJFwhQ#bXd(>x@loYt4+2e>Le3S*%KJ`XiDv$XKD z9(pQ&d6xC|2f^pt@#*Hl9U;2`J2l=k$On!KO!X{pV*@*R|5)A5A}XRG{XvedOLyJ+DZb*?v&naCqSCvGAsqc5*rljBwj2=UY;;FIDB<6@0 zs6Fsz({`<94iaJsdc$UsXMJw=B?!Jz8Blj8T(u1maBg++HdPA+2O1 zvjcyDN=1)6(w-ajCLY-(-Q27N~vjv0+zd$0y{gY6{_d?)2bU+SRSMKnAGNUOtaBFvq_JL5= zQ~P6dJK-bO?5fHu=&AREK}&J0Q*2)=!{;^JY+S7$ z>6!TS*4j`qIu$2@nYxeS;b&D6%YIT(B6-ju!-Nb2N^&Eod# zWLa+Fgg7yTQjyfE>yXp1}4q%OgQ|ooY{0%msgW~J- z_<<_{a=_ha{{e=VBdH=xa|yEcB+eQVkPioLau@}khEVxubxqu^CyrBB*p&4o4>Is& z*qHY50LgEgszRkT=XX*luFAMy@5tn8*-@b2j`s|eq6_N#_gpL3iNE7?ab7nFn@12u zpl5>eeWxK`HmbJPk(ZPRqYcGWn+`eA|9c~9{~D3B7|3+QqEH(m62eN~gmz;%snchD zu2ptYIxqP~I;m2JY>B^8bhBGnzZrHBgNgvkNsQVWu9kx@#vR|Pd4URXFP%me{^5n zJ)00kVt`2k(Q?c@2CYi62@#tzaav2gDUa)33mJ2f-7Wc4?eY8^%V0buc?J})jFthj za}W{ccEQ>7VT5|z_CqI+d9%8HZUt>y6B@fx>ZRD-Xo6+5Vz|wBa6FKl5SxcbQnsO9 zx=~~l>hX+Lx{2Jv&0aaTFL6Wai(!op_v%L#f49xMz$p&}c&0M}fsC(`=F9ho20W<| zc{{AvkPX>dvs2HGoInB~gS!)BO>AluvqYVVjr|kR4$g(}eKTi6`z8aMl0jt!0a1Q? z2}BH!0!nQdVcn;+3ymKgiG)Q*+&fGiv1{TdcCcI=@sh3Q`J< zfC+xAGu8FaFZx!$>|vGC>v$RFOTm~ldmW{MH^A;5MByKu-F{JCt)fa9Q7q&Lsc?I$ zlRTP8uEP|;Fi2i87#kmUrLlG#rt0_^Z*vcen{&1bv=dA?zINU^ZZN;A{T$g+tUFY8 zp436QR9hJ&3zzXj5~$nTM^;S)v<$YA0NXO641ezrUJioLq(8E}e$&oV@FXt-+BCzJ zA_mLp>^RBkh8J1B2Fy%>_%!rDJQLuB@^-QNl)g26bh$c1#zElut>|@rVLRo_v--~i z88ePAF0M8w&=6U^)Ffz{Ymo z%)sO@UOC{p^QJRJ;1aLADDu^glyoTBD!baI`9PcG*%{(ZEIc1wmpN0&?iPx8KYh)_ z`s(G{*8;phAhdgV?vqCkzVfo+_t6Xy83|z(t3&0IBe-piw>*q7Co(xHM_f$TYfyTx4H$cv^dV-(VWmMw_~w zgEwgXbo<pHZF8UpRc#LoS|BZ794ubsNQ^!5=1uL&~Z?L)7yU0NbOV=;8W=P!KuvL zOvBCHUiqfPu1MKgZ@$=^M)w)nEtYP-ZFJR3wJXM^#(sr&Nke7jS?1rUvyDe@laa-@ zTg)5L9$`kt6itG@T_5Jdwn zOK2Ym;}srtZDe)Q@y(xS5WAD2p3GkM+QbG)WsLCmoQ<`OCe*UqR7ES~XvPbVid?1@ z326rTFdqZ%nA-q1e9FN1gI5uFax%JNGR=*W{lp(b6??be40kUrcg{XP=dak=%rXfF zmbR~&IEpr8A9 zm7#NCHiC*v1tlPhI1uxTpSYcwCOJL;}8B30ex4?&?B) zaCp}h-J;2SpZ%YEV90h1Hbbz`4lr}YHm!x9!7b8IX!p4Bs#}EyeY-sc?d>%K@(TCk z$LWM84jC4y=~iqhHa2I>T6i}vRcb}EXz2(nf~0h04`rE;!fjglN7ZDEiPV)kGByRo z`?b;5*aPFQ< zq*R>Ij`$`F*NI`{RmWOZq*S!@j8U2B8UID#YnuLcUU^^}wl_tK@oCy_7aSWo24#ec zF@b>5>w7Awxiepn;R=3L1`RkwM7=y(*O;w4HISUGH?vfKG+E1cZ?-u|5$M+w zHG`RsaNPo|qQeqmMNb@xH@q*)-)VKY!M^mC5~6TyR6GQj^}aS;P-7(e;?cezX8clG zNX&zmD-uf@EB#(o`Uy_iCUqWw&L4}mH=^}@&UEXgyCmc-H+IVj9 z7f2#VUlHY)6MdHf35TFMd~oy`YRo{gC;Jp;o1}u6aC1AtA2n{xXTfE6!NKrz@F66v ztaF^v*9@Rn`K0aKv<`eKU$0iG`%j4lE)m7+qs8y|lO_c7v%d7Ov=9ck z=`R{q_+K5e z_!kL7{P&ibr@yCu_OG(g{kO$^ryu`Qnd4uiz|g1-QNhsB1cXK~G>Y+%f1T$e&}Thc zOnO4#sc%wV74k|->8FGl&AdLUA~^XYv5kP=rEY_@PAO=kQfW-vU3wU?B-J!#WzOba|P=5MHOtd6E44cl-{_}sAl;>s2e7+C>||IZCoKcJN;V6$?b zcVZKQ!=2Yt!s3S zx){34bo>Nsi~H@W0)TuE^*od=Ki5BfCIL19z&#C|(t%gzB)tO3;@s!&`^m)AiOErD zQ=(+@v)Rn~;7#TCv}Vs0Dac}no+MZ zm5P{l?7nqiRw@k=@dGY61T%PcsKi^6zn0qRQ(h^5Rq5)UAT>v!Qfh%suBqxuZlH^u zBX~Z0OG2Qgz?{zk z5qT8@gfvx+^Gei={vJRMx;1tjDARq=j8jO=DWPeY1pkr!!W(p65ttq4n1X@yNR0nH z-Nm*HxdJ8Hav%92{chE-*JXXpar6o37;u$yKv8^}UA^`}%=(K^)sDBb-)XaWMRz7J z22msq!Ig+lFo6-G9(wM6_l*(R@3|DQ%t_pLH@LZ1-?k7*uL0$wh38V!)Wxr)%MCOK zGe?`eiyxaE)sxIaCRy*hZv(-S$4R8$k+GaSj>HG=isPi2%stEc!3Yj6iU z>#tf2Z|uD*G+%rC{HG?Xp})Y|mshSg-Gp4}wdeyUfXxyJ@>J9<7Rex9F~IB>@hG&N z<4Wc5#zy*?ukX5imB(s3&4S66Q0h`mPPz^Hzd#ts3pneCcYMP#y2>={rE;HBls=_T zd3H@d41BUwkeg<9cA!25L;2$U(1-D~Z%SMagI{zc+ut!(X$gTif~rED3vh;(rQ<%Q>(MByCx6m$Y0<#>SUM`GMAtQom- zf=fE(zJD)IR!rx~%Cf2A+3j%t2c_qkk>)3qqbfmYReobVu6sDODErU1I}2^x5zL+? zh*}D}FeZ=d9g6uDeyd*(lxlw*S_%xk9h(d{<8aF{=~4y7R&EbBlAq*n7H>nGoSmI% zQk;WiGM+s*Cre>|!DmFIXFyv}Zn|Olfr#n)OK+VsD2!r0&Mt77b#1w3Kdlqzg8V^< zYF%cSYd%W&tqW;f&l&^n9c}e`0&fxK4TC}5&+is%jJJM)4tuW2?m{9P#rz^#e}PKU zB4lUGrqV1%trPCDwIpP6MtDiq6>lcl_?lbeoMghdaBR&U_^S46=1x^chxa>} zAx_DHQTG;0gj>>kTvf7cxV`gS(ViQ13v7M}y`ePIh6%4a7oJF(AlX?*GNHFj7pss( z#zV3vLT!~ah@7=l(>F2KAJvq;xe}W+dhWiKrvD`VEIJ5+hDJ7m9k2J%Clwx*eymRH zev%%#X(yB=dih$v0gv-a0-)c-T*td1mIf&N-t~QQj8e-l88|KwZ!vqp`~FkGFHq&v z7+QijF$gU)f%wAJc6@ogt_?cXPP*h-9~%yMeft&LuS%*Q(5lL2dgph)aSB#eZY32X zWr;e^`|*=GQZuD9FV87^R--P{2#IBN^aN|~wV*#v z9Cv<*BJaVB#)&%Ug^1(vJT#9oLA&j_7{az<$JFh5#;wOk%%RWo5-hK$e1nNDL8mVs zgkklYoUJgbMg-QiErFW&0fJgz$wg^lh%WCoP$RiYO?UFnVgg~O8O0;ANXDK(>5XX zaVFLi431@_{j;G-Whd5h*BfeWP^yKI@dh)O9fofyYLfvn>L>``M9JTtJqNkC;q9-X zBPJEYo8=+itMx-N@$FDi*D-d=6Ek}OZyx7mXe^}cFdA?L1d1}SIl^U9w-hB(=Zamz zrp-04KDJY!pLw;RvbBdPF#T#jGu>Z;Nnn7T8Zshy{o6jQ7ACWghn3|j2=XLg&-XJQnEvwu+r5EpIL|s@ zrF8cfq!jgzSe3{i8hU?8g)G1Xh?CPJAF% z5=L3HFuU-x&sku+$uY6>pj1oik@4=A0u_5uNUZJZC|niZ%bDMfj7;U_3v2V4)_naT zljUtMoy@#-k7z201!S$+GM5#mHE{2T{{-==(GjTwRhg!&wcQZ!yeo}KXoYaXyK6~N z1wTlV$;SKVd_vbIyl72T^HOieT;tp3W@_HeIHAVdVJ2`3t=n|?WaHGU`^v(rsj`H^ zOJD`wnUIbOCJMLz5lPKQGjk3U0RkT(U7jF%{66{dn`)k`9T2!+A!ex?HKLsJnzARQ z{C9v-SfcY6{0U|tj?*`4?}Q5-AGJEEXDyWd3$zhUGS8c3*%eST{`x74F+1oRY~b&S zYMQiw^UVVxLjKXcy-`M7$3`4(pkv`8iEr)LD0+W;lZz(k>XuE+#`Bw%8ZvjduIHq* zerb2_3zEm(#Lz{2-6nUMzdFkAm{X!rN}=HR-kRkC@07Kae{yI$oAG0?Ai_L@VZI-hd2yv>dj;VbwU~Jrfw{cF_?> zeP|Y1GIujE?`yJ8Y4Y3Hr4^uitNr7^m)Z43}Mj#dk zpNm5L3P%PCeUDFKirlR5`^;uMbPaKXHPEeK5O59(+59kA3{)-yEq8$(jr{m@_eIGU zS&MR-; zMJpC1^;3Krf^QCbW|0p9$?r!i4R)A;Dc_~O?P#+bDffo6S1`JcS=U~!QCGnl9VkSD zTlqiozoW1Z!yn@KP4N|&I!WfWTJj&2!&5~Sv0^4+ZSlRvijNj{Z_fr(y0*VbG(UMl zagE{vpx`vLn7e7?tUA^k!%|N*ti$i6X_#yaywHKfh!Hk9C$x09t|UQJi?x5~2fo(eFc$uSpg5WioA| z$cps_y>Q^KiEha5zCBd!hv70}utjGT5+ zGdJ&yKf#y0bIuq~LlpS&a``>F&t@A#)|DZ7?F_%qe*1H6b9X(9NehO*FAZrLeYRKl zw5F-9s=U&mLA)(g27F&%ba%aF9*|;GxFEEBu&a?UL4=z(^NHUpj=Pbtmbkn;_@}Hzo8&-lZc!&T)lUPM zh>!}dit;iXGD5=jkIf6M1xtpvcIc@U_6)Ky)J>$YmYR^1*23zl!~Yx zXrxaD%XV1WgFzCtU)a~mnOv`lr=t?Z;%}&%=~ljd+3IYeRqU{gSlb4ynr*cSQ4l-v zXKO}M<~{k-PI87_{H|`|)`A*B#pIj3&F5YD(zk1&Z4fHw=a#dM*`kA}w5^@&{>5S-Y)LA50}e8FFIrkRs=S%8ISBM8~0CSbT41gR11HVD7xEvpn-?x!S0X4 z46QI%YLKl5Uo^y~VGruBddjUbrU~D?kn0a(?4qo&^%H7IVB6&R43i%5HX|_5J1M;x zPxni_`)IW+JljA#bM&*B=T;ySbvGMCTL#62x3O$W0mNR~xeE*5-W-glmFSAt6hAUf z`VSM2`%%-%Ew#{QXzVmaHl@zqkKz7>2T>}AiQj}XG!>o-eu0%F>Z}F2TLOI`XUPDc zE^x>0AA0@*y%pqs=ecIK4fZp*TUy%CfYXX{wu6W2nni76Zf`N~*;-FpZAqI|PF%Az z`{wQ<<7w9YZWw6SuFd{i$T6@YYI+K#@mpGy%Pd~^n4k0ew61;8%!$qm?ZR^J=(?Ey zRLMhOzEFc+59xOK4aOxG{Xi5G{szYX$_QVG+h$V#ExLNq@IAU3ebtBAE3ZSBAyY;j z^I|x*jv_a`aTSB2H6<^fwAj?Dw4FYt*Xd^xW82P<@wvAoF&p?tC`rg$Nv%Zz-dG0|BHw=L0=)504;8pq>SnV^c8@`(66Q5XH7>5vI{(U zABnMlvbd^xj$!o}P|5x-zrfp|-57z25|@)?)fU6x;e^-!+>a<1(YYTP6)*Fh@*OkU(O1-iook`-7xfgEE(XdHEUzJ z^i+%4`+0U49{vZz{e^a)CTD*>VU?^9`#aUx%KDcOlQJKyWrK*_TtkJ>6N? zD{t8Oyn(6lOXkQBT##dq8>o81(aEmDJwXSU#MFs5aP#jLEzAso`|X8pcaYXEkbbC7 zlq4@JRY-JJNV-N?!%>=kOBc?i+N4E1qEb7NOF0r2hZu|kWTUB^vf~{i!I6T|gLRL1A z%Qm*N_m=!swsa1G<%n%#+SRw)7HpeGzd-!k;fM{^g=5)*ypPbEn-7+dbU#v$?LL%Y z^saQ=s}7Yjc5};(Hj&Cr{M?*1aqlz7&8uf`ck(yDd~r}f_TUj(;XAZ`KibbNiQ^@nigM|yIOaL@Doayh%B z{C2^r@k(S5Tmh$o%U@+?P)Lp0X6PzLSY4^htE>q{l!ebeT>{yXww0^7_fP|f=}%mQ zglTuH;k=y+9Z1>mxVn3(^`{G~QzcLXqSy%_c7Dk#F-$a}jI6M@X;!79IaEVsUF~?G z@EXX~(oCfcVX7w(x|*)Nw9Q21JSnup&evdg%nY#+kphn@V+`w)ZL4&{2$kv^J}+Le z@16{LLhUD7nyN;rotMC8oi0@Nw3oi7LD8PM%>f((2*^9t$=kZ6)#*MxGQwM`>>sa0 zls<{^`tP&{{#7RXf3s>~FJd5V;226Mwkm=&mrtX>Z$g@KW9v`voDm4dCCva+ zauH99b5cVmPd;(fe|>4Our^l`w?4t+yp|zcZH%921_Nm?Iq>(L^29Viz<3I0UNE!=tqZw6}9Bw@jKE| z_7;V7eP1PCKQFvuWwZQoe_^`np=N~}t>1$?0xt4#0?)Jw#uuvr{{rIt&n5@Ah-_JW z7*<+mP;4`2jA+K4>S1{#)p1_uvevEQylx43CiNxMox@|`P3}OZa$8JSTen{*X@y~w z!C%(KcgI$X2I9)P#N7FDH4Xb7(9FH!H3* zhW^gCCC7F&9}#a7WE`RNFf$s*+6?t6;h&NO9d42KI`LvalDd9+sKGdv&XooY0z3;sq_@l znlaX6XY6Svv1;EvP98f3yL0JLl;r*~HTuzgOa~Z5@~|Dqn;}_@owHT&AwX&N#@)}U zhe=Y~(;kd-%ZaZB97d^MG=A&mT(v1;BEAd9B~%w`8&+D<4I2R zRk9UGx%`X$1a2Y^PA=rF$w`?}gE7Sg|0v#*vi8*#4`$dW1EC6M7&n%bi-v|bUL5ic zM3g!Curju~)9(kxQ}TNxGc4-)G8+boQC`C7l9&eY>fTLwji&F;I};m_wMNqZ!0|%L z))rw5i->PLOBzBjRaDEOn1Oy=&Q}-2>pg?Y^kbem^)|c2je7eiw)>-oj<4oFallFj zgR%9%8E7AYHv{j`5~P3@DHX){)+$N$h|pMX)HtMhg>nGF3*N<0s#)dWKs5<}$a_+-nt`vR}9uixJK%&LQ

!nV(d{LXknXq0Cfm~fxl-)aFhMI*Zgh>2O8i{Y>P|>#c#DVX}4^J;F?{2wTrF7rW z+7@A_w&)-y)HHWt8keyh5zp%R(Q~32BZjH1cPrz^FLa1kFoSfq^rZ|6ikyU9(bm~T zdDG4r76<7Fs*LtywyNwaKXA3Lt?;4FK*5><@frR)CQfS|{q%iWK+xh&TY(Jqr5MFW zsfyU}h{H71&i31=dWZLKLOZ&^|6mhq9W-GbH&=i2Lqa%Y=bW5h9k5XY@6XJT;A(Dl zRr%n!ptHYmrytNR)1Kt2u{%w0qQYgs8|#Efy7J_cGW|?1yVubepw~xJvE2_MUK`bdO~y&!Qncm+B`%gy8yDV#pb&C*KtvJ>;US85O- zQjet)E7P$x8#S+do$zvBCZ#{P_(2s$|g>D>NU8Ef~ow{4&eA!TmpzRosX>;Sl zvPt$v+qq<)_sP;tA6CeJ_5~PhJ|HMMH(gBA7$XV{8GLkj6yvHXG+^KYdbQ0uJti*JI(JRQ(k@ltRBfY+G ztJDte^Lqv%U|JQU#epe88=Q4~4^`?sfppz*fe$ff5<73?_s2f8jrH)`hH4sWcGxU4 zOztkO#sM-_OR>yvwUP(Ve6cfmHH3%KZX(01zd(;SV_kXN$4gZB0qmK!--Nm^#WYa% zVC&W<4lf^WCUSQOc)V~EQzPl3xICo$f?jK~u_VMHoPSr{7R3pQLPk208DnM5wo@1UE(i9b?XfqN_c^CNv%NE{*ro;l= zw5j5xjBur2*`VAX4$Ul4pQ{q$=(wBl<0Bw=bs@+RX>o_aa2Y4kB^+zmfjBQ_dQD+V zZHgi@eOb$}g8NG+WyLe1!$}755v1*7;}w`xV`YTJ?)?>K<(E{jW%l_Oaqq8zr79_f zQnDC63+JYXC#2?1Ae`n5S;y+HqxFQ7%I9U0O2C^>^nth(9-`<^NqWss8tBa{;;w$h zvL81un@zoA*Ab$kh^?omv5lu3eEfzvlVcUh1C#!Q??DSidx-Pz_3{P^dRtdd|$!hPV(LU8jG;Q_yX1o74^ON@odpAye z8b&Xn4NNA+X0*oVFP?21eLMd}T=Lb#7yRezFOCJSCZIm%_lklUiBIvGxEajhOBu71 zfR4MFkIS>(n_fwiG1R7bhEy3=Nw&&*t$wBiWIsAlsD~Z+CP@%XI1?wSCPL~rR%<GRSn~AzL(+=rclXHLAigGV;8%_Q0qQIfr z7=Sx@0^-yo$u;Sq<{OR~E3Zp!AlTAGqKzryzEs1{%X4|SxBC_T1948G>&L-`ifdrYiIvym8jx;jC`%Mv{@C!~P znu#mAJxv!1-{=RzSxnNLKHJ7e1#9qc+b&fE7BQQP!5*L)ULb)bll`Xd!wM|7l4O*O z@=uCP34vRW`Gc2vZ+ELHC>zJWc`iBu=NiEM0zJaTBYl@L-54Cz*duig3YDdb#M;_h zu4$yOd*pA^Q^F(W9dgh%OK!0U;3mMJrf=%ve3IUt?P*J!_8q7UV{{>3#AS+d zl?$IFLRJ73P8H+?WfD{dC}mchPY_r4fPfWKr24;o;Gcf{my*~2PlC(;=70MX_)dWj zOnY;{{ci@g|LDD)0^gsX^na<>r;P6} z4Wy^QcM5zBL8`aZE_64|UD_p10!}Uaw||EHe|?7}Op%l9B?*A)dwLK4_lUgR!2qz9 zO-Jn$^G8MvHJyU~(%|$Tf!F`bpPvHXUkdF0JUTrEzEj{k9d&~K3>E*KuTL4@Um8?T zf$tRfPDh>p6C#;^eV%X3{@2aS4-L>N#EFw(gk&G(24K09PCKaqgzf>y0gYCFTFIRP z-zo6@d3Afr`2JBAcnW-{z;_CKr@(hAZu$Sq7Ec-9DdW3XPj;{QEkHAp-Ols251jazhes{Aqr@pEje0AU$oG*g+ZqQ}2Skzbr8Qc`W%~@%nVs zc{=JmWqhZM@09WV32**kFg|5`e_3EX1-?_@I|aT|;5!ArQ{el{g4lnC5uO6yDe#>F z-zo5&0^cd{odO?-WV=8B+|1J~7x4xVSzrK-?Ag^I@F9Aae}P;P1k1mvDE_bWZenEg z=IM^_bjNqP<2&8){ljCz{|wOlZ~Hr^qt3r9Se`PzQ^t47_)Zz$DdYRkfa)pmodVw} z<2z-1r;P8E@trb0!22&xT7Vpc-y&Tc=tIm2?GOjyo#0(X#0-)&fyysj0sr3^f&IPx zQ&s1GW=Hq``gcwl-znoeWqhZM@09VKGQPhod;8CT;3@E(0^ffF@UbjS540DVE?{_m zfkOA7ln7_&^kU&JkmGyaCp%+Ztyj*;BLXV|>0kxEAJ?X#n~FuV4nTcUAO5a5ayoh8 zx!li`hHCb`4~fzfL~7hi23Ei1!&c7h1os@jmxI@xP2MvV+I*x3b+ruKW$e7tAk_%R zE`)l|Nb>lFVItzi-wrQ^PMg46DZbjDzdY&ja1nDY@O$>x`a0v1A#cdJHA{YMerrsh zq(Q|q?V`%+mYgTehyrV0Z}MeT1Iw$EMry-3jgC0isz8k7lvC@y(JPMI0uDpVo~c1; zXUT+WzQ$(nhhY-VP5wkuz?7GiU9|9i(NsmTzBhj2AA~brUOmr@@FL&ITFn63bWIJR z0z?g5ek9Sv8@sBRDjE|hYoRo~h3V!>ay&S)NWYWL0OASb_*wVU!XTK)wUj^$yIImO zq9Ww}*6;CippYr(sc7dhcc+@m6!_{71IjFJ!zVR+E-X9C2`?9M&`o~KoYGEUy?QMFz1b6Gp z0=Kwv!Nw9nLPcwXKa?bLKh1tlaIkz?ZA zO{X0h4T;x}b{hO1^Mm93J|xaxz~#660&$s|OsJlHRSIKhO_vqqZ0pFE@CQLiKY2jZJ%mic4!`^xRToZX&cXoL^sz4+E?xj(|$|Uh+ zp%T0~_r@>C%OqD1lzl{(x4%P zxXH6m=9iR2on)-Aq{VC2EGFe6#=Ap>T`RgJ zGmc!9i;KL9-#OncHcp77~Kljdhk61gWG0w1PT)L#u()G+Ui>zIEnFeVy z1QlDGu2?A}h-j$pZL8pB#nfyg#2&d`t5Itu$9_^1#=69(W3^iwr7K6>A|l^LPj+}o zAj1_5nIxXS(>_#(TM@Jl$u;m4bQeY5GCLn7Rw-lN++uGi{WrRp(B7K)+I`;4zzqJXmn zNiCTSZ@4U7cNkhb(>AB!p_y%jCF3goM{8CAaIax^#F z4APem*PRRSgx$u)6>Y^h2Vtj=Sw~%A1(q}e<$0e26aC|d+8+k3Cs1#Gq88}USQ7F;VGCvLul+_KGcx;{8iCt;(+n;tO}v38Wz&wMT&=LnSsKaxSMORc z9$mhfmhU@pm?Z)JXb(QNG9pqGXAqZ$+5`LFZ3>8yM-uQkQgDMGU7zdtqzfw|=q zH3l!5j$EpJIriNl)Iy|iIRN`v3&M%1x5rksn##8_Fi*|Qm{+`FErZU?^!SRtzt};u zY1?Cu5@6EUD>gWA#)2b?VbWHZ0FvPQ}&6=%bJmiI$K&B_9sZwHIf+KAI{^PO*T)v? zN<}+WotvZ2DGkjbtu$|Rzcz6%VZR619@8TO$&aR$*UsShFJHX;#l79*?Qw9Mq05=o zGMExR{}+h*pbq0ANf6qAPI^++FO>Ud`}VJAxp2W(0@+ z*`SL$TU5fu_82yz00JAa2E|7H0(G`VlKMy}Qh>zvK2maaZsG`&k2N@0C0?$D5(S!e zcy^kGNvjK8q}84g9$}6qO_p6qo47Q={vZ{55;1LGX|ge9sp~6Dkh^1ijypD3OPgQi z-s|RL>*ym?i=56PVp{$Ic0550=TOBulQFey&vET@`cag?%YN!rirBFr8vO*!FHk#_ zZPKsQIel-FyN9PZtE}ANo#0NZ)$PqL{sOC+Xdjk=T<-=`9!kwoZ?o4)n;YWaYm%%% zH4pE%fo^j&Z)w`%+1ig0Z9HVMMN(WJT`aXC1&2R18lld&+2BwaGG^}n&N!nM-(7=( zAC|n8^$jDjBiH42H5%@PQtfv^Ywzr>TU2dKEJ7H}@lRX7-Tz6bz)RTQ-m3q3ZYZvL zs?JS|KR-bHt@$x$bZ*g_T&-5ZM<=$n7}47T8P>T%)&=4Tu=Dusf8>xLd}rwy;ZF1s z4aVp9DIpk6HY!V<5!fa1hSx~Zern~dz@dU+%6$1hc5i8Vu6+_lW!4+55O18kjR>pg z$qdIXzq*v%t!OHnb#&&2K2?`s?f%zA>trL2y*PiimyNPezaG>2h#S~fRZ4Vm&C%-* zQ%MT-AG;J&xk!u0>GC z3ihqU*{u}R%Ks>p7PA|>Wv0utApCW!eQSTgkD={2A;t^5$@8G~(3E8&W9TG)-G@kP z)oA-545>f1OZjymqLB+H^wofUy*B&JL7b638{{c+AW5Ymb!~m8@T`Kh0pEn)BKX1@ zFY8H$Y~KT2>$D+@T5Ud#>)U>VUk=Hlc=u##&klSPjU6W17eev7_puu!md1+VO@2w% z(q&?L=hRN|Jz8Q%F1QxKAcwz+E!3E(zx3Yk!|}Rd4UTR~p6;XIMl|k=hg>W-w+-cU zMa55+G?x%g4D89z&t@hgsICGBhl|FI5RW5z6?+)UYYAD z*qf^3>CBy6@^q443zX8;zN7XBfSS{4+~L8fR2MNCo!AimydYeGOL_l6J`L| z+AA)uFFXM1V3M_Set{-*6Hd7Id*CC-Tkjn0&~KQgw{&%ROfeeXB672zHpq1Lj=K08 z&$5oUDkGyIED*GrxdS7@_N0kmX%qu-*r_kdI|pC4-zIpWG*QWo3V429toScb$TKhh z;>X=O@2`wIPCqiDyC5Zj@kt%vdjiWnQ)|F-)O4ZA;nL!!#|j#zXh&sR8vi)XUQInQ zB~(hswc&X+d%nwA&!3#4E5ATzdLSWcs!rK7!xFAfv9n*&&%RGir=a^Db&mRn=MEuM zI$2Z*%@DB(mtAWV7$-Wqdk1;Ch=|EqqnC7_&m@rD=A(T=pT+%s_>1{*M)XnP!JFZn zAr)%0g&MW1VCeMEBwox-{w1qsF@H5=xE?{bJMJ?~LA|+ZTJRb9WI4MG@P7x^g!SOa zbvY+CCErfU?6zFTfwWmt&ce8s)k#TVEezW(}{rY$q=758QJl-NfsB>IGAJ&-?<>n8J*|l%|?&dQoHqvfEjsIaCG}4kv4l zjX2N-bodAi<;#6K3l;Gol(W%ArEkS=g7};rK@?;(jEPe84EOxLaliB26cPQ7jKSh_ zW)@e&UFxA+AIjW5);}8%xiieCHQC#JTZr3xfO~8pMvWI5VY(XZy(w~xUpGodR$Ayj z?|0?6t1WObn0|#zi;del{$9=2^g`R5kOrcZD|>7%ZKA(X-a z6em@z|6IF-effy=lL5K%HCnh(_0Qh{`3iXY*S`pyng8#a zCikG}U-mfQKYcODN_ecI)v|M|52AGIo@C`igJS%pyGPi)n#OAuz#r`)TnSo4< zTJF_*JXf>1@Qm-)voB&>o%M=ZmQ7p5j&*7rHi?^I{tkcGv1hG1T7GC~jP|ABc8i6x z;oaH~SmkQNb8kEYndxkDbtli#K7a2XPf5Y}?Gg6y>l(^hu(#Q{DrQUR)L%Ti+)q#y|3+=4knNkX~mgA$)5F0TFFT zn(|*DMyIm1q;)mEVK>(^QApiUPR1)^=cTIo-;#$|^f8;$%YQ}E5S15CE*cI$D_YK= zyDK%X<9W$ng6!;Vn-1#$n}Yq%3ulSEBPx^yg5xPg_+ZmQWrV%1A6+i1xotbMZG2l6 zR&+=>XVE_%g%xTwO)U)iIBn_7sZ#qAKEa#j`@O?G``xR8#bes@8!G&ZbKvGXzZ?DR`mFe2 zMMJL(Z8Ur6qYw&P4+Yi2-eMBj52fIEnoZBP!+>Y5JYMT@cN?lZ^r4*?>PzAkw;*WUmL(J6Z4nqN@|*t_55SZspqKl&53^) zCNu`DRy@LPx6IMBsxge$i#z%js38ltci(5+k}Cdw-X}4bp7Oc#;K!UrKi@V~1Q;6+ zW30w@yxiOu*X^l}zr8fIsy~(H`8-=;QjzL-m2om_~K5HRcesHY`G7~ zr=`C9u2ihPXF2MD<$|X2my&OO+h}+Uj$CVGFY`!ZQ*47dxY|Xe07?V0se-`I-@%k-Qc#p8rur zi=o^ptw>pfi5m1=QAF9uMw9t(n`k4prR|rd+HEFYQL?%*Kg@KK-bZW{$5dC&Zp{`U ztCegTd|ut7WW)Uaq*$WHJ7?cRwxKzPQtBtVzUr|z3yIAI0(ROrL?E2NOyV%!t*C-) z$k(yZ40O5aOJ;Yvx+1v(-{PJ^XE7#Pf>Qh~o>G5s?~S&8V3FIwp@@fZa;q!5va zhH!*Ku8bF{AP|og1qFnth;9Z^xdcIpf(Ri3(F{k3;Z`sNIeeJ#vQMXWMcl2et*zRv z+DfWkRjU6~zyACG-`Cyg|8@ULQeKv)qjef;5wlWB;bMn7S4yX{>~Tht8$5ZLU!G6p zmLHyfV*>|hj$c;hE1yO zy;|ewL1#>=@;9B>ipGu^pA9{CL9nx_5&_0;8cE4Z;sqBuiFoHO{h?#tl3mZAH}+nN zwbb1n6;T_EYl69jX6b@~*TLm`#Sv@QcYWG7oKW}~SgSEU7#!1wTNX8DGCE2iV)c&8FiEPx-l9+AcvmcWE``)Bp4Nd-7 zuqpS<@fy%w7L{1>BR6Q7PYSnA@A_$TlhUvc9Y4)kD5zcP|G0Md;J(WFpu^2*Fcg=(SUxytzS4 z+k%>}9cqXN_gn+pcNV=`=Q&a9QKaQBBD__lKVCUE#2IbhO>A#+T;YDAa>)QmyS%*W zp3R+DF|RyS45&I_7YPZOvLgIM_G>H6u>M!jt( zS5myi;V^8SR1{RxP}PP8ujBCk5w~3Y?i{ORTzHb_lIp`#h>kNxuA{km6AuUnXcq@#)hVID6NJN_?2uTb5 zi`Q?`{>GM^3S3a_RfEfucegtpa4xpx(R5@>*fQyypicdwha%r?qBf_reFryNUD~tz z!6_hwdy6QA7ZToICn_-hZzy_g1D=c$t2QrGKy2FH@Uk;2E&>sxi>MUUJZ{{^Cb(5P z@z%;N_fey?Rqe*xT2?2pa^}RkyKMoEt?eHgm+>|d_!0SoA5qI>dkU>qL-FbmXW{*=vSU61e%%L*quq86noy zrSAEY8p;j}T=PKgkRIL_^pU9ngJ>r)-=?XfC?y}Mn|t7pGkUV5IBa|O)qY;MjqiPF zBHih{czs$qu`#2aTbiM8F}j5-T6%AxexzcNc_(p@0Lz4mSJZD6k+2@%Yp*l1+pW&M z&IS*U8PfuKXp*aTkhv>CnCR(rv0LI?6Vl;pozFxkZOwdHt=0ZgTatY?!oRcJ)vR=d z`>6!fK&S4j@u}@Ej@0#uS3GKn`cul%di=s`X5IY`E?sxs-*R-;iFAGHUGL(z zG=jkK*?i2+d9~g9^Wcqc7}13}(YbO2bNYc)ZyV``c49W(+o{QW?#0ZKC2N{-fhO!b zkR9m51=WBOrQF^JVTM?Ntf9s;rI}T+VOOV~w5%K~hB2TT?3X#Qy9KWNpDW5lMe|`60kpes&T%YL=UH z|K;=vko=|!;2xy#zo8|e`Z_LJ2>bub-zE*mQU!ra1So6Oev%mSg3(S7D!VAn@ypu9cp0Y zAz79KEoZ*0gF{{$vMTsNpO5g!AcNfBrEGdT=6;#U->kA$134GefN?MrlwcGu)xd(P zfrDzGZh1Cj<7_3zc;%=8GOCk9$*tf+%P_K%Dc$TzBe-)*&A@lJv%3`XNrIdNE5~Bu z7x#U~O+_H{>7UT#4^D7Akv@T#eDxcqtmUP~(Sx^~1&A^eM-+zzM`}LYWHF2@c4X6&R|4YW(LzC^sggh4Fd9 zsi)_Lq`frdJA5XurTHe!L)K8ZC@}HQ{)EmW>VDvE5T%BSYYZTnOFWMVXqMp*p)gS93S@kHz)>{pr{_RA%U yguOl1eD~p)0IW6Ed>5V0z*=H0u)DA%5+a=87smJ^rzL@ax5Oh%Otw&*5Pt<5*02}= literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/trip_plans.md b/app/src/main/assets/demo/trip_plans.md new file mode 100644 index 0000000..c056255 --- /dev/null +++ b/app/src/main/assets/demo/trip_plans.md @@ -0,0 +1,11 @@ +# Lakeside trip plans + +Simple sample checklist for John Doe and Jane Doe. + +- [x] Book flights and hotel +- [x] Buy travel insurance +- [ ] Pack medicines and copies of health records +- [ ] Download boarding passes +- [ ] Share itinerary with Alex Doe +- [ ] Confirm Lakeside Inn late check-in +- [ ] Review vaccination record before departure diff --git a/app/src/main/assets/demo/vaccination_record.pdf b/app/src/main/assets/demo/vaccination_record.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc7b153abce5828f696086e57c004cc6ce96a907 GIT binary patch literal 160470 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 Tydr&BLgp&9fPjjwD)s*ZD6pAQ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/visa_letter.pdf b/app/src/main/assets/demo/visa_letter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0e0be369ce8326f6de7d81261ac57f2d4288af4f GIT binary patch literal 120572 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μD#q_s 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 V%XNxNT)QqSO~ucztgS-ze*j^sNDu%3 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/demo/visa_stamp.png b/app/src/main/assets/demo/visa_stamp.png new file mode 100644 index 0000000000000000000000000000000000000000..eb404b9ffa1c117faafe714344003e3d641b007e GIT binary patch literal 18190 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 A#sB~S literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/car.jpg b/app/src/main/assets/tag_stock/car.jpg new file mode 100644 index 0000000000000000000000000000000000000000..279a4121eb041826e4fda5296e388bedb051ab4a GIT binary patch literal 11474 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/health.jpg b/app/src/main/assets/tag_stock/health.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c02ff18433e8855800ac800ae8630c0a33cd48eb GIT binary patch literal 13136 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/hotel.jpg b/app/src/main/assets/tag_stock/hotel.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be9d45ddaec2622bb07502b15a60e2c1aeecd9e4 GIT binary patch literal 15184 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%0A8n*!6H)!JY~txx?tFF!<24Bb5akJ^r>sIC2` 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 klNMklS@~ literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/plans.jpg b/app/src/main/assets/tag_stock/plans.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01ad8829f2fadd3b8d22605bca9bfea269d8e4b7 GIT binary patch literal 13966 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 E1qibg*Z=?k literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/tickets.jpg b/app/src/main/assets/tag_stock/tickets.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef5de588b77c9964436a1aa26efc217c37bb0ff9 GIT binary patch literal 15719 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/trail.jpg b/app/src/main/assets/tag_stock/trail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d9eee37d2c70650ee4d6f544911fd078370ca3f1 GIT binary patch literal 10478 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 literal 0 HcmV?d00001 diff --git a/app/src/main/assets/tag_stock/trip.jpg b/app/src/main/assets/tag_stock/trip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e546091f6106af135667f2b3ed280332ce2e635f GIT binary patch literal 15893 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

Access Denied

Include ?token=$accessToken in your request.

") - } - - return try { - when { - uri == "/" || uri == "/index.html" -> serveIndex() - uri == "/api/documents" -> serveDocumentList() - uri.startsWith("/api/download/") -> serveDownload(uri) - uri == "/api/upload" && method == Method.POST -> handleUpload(session) - uri == "/api/rename" && method == Method.POST -> handleRename(session) - uri == "/api/tags" && method == Method.POST -> handleTagUpdate(session) - uri.startsWith("/tag/") -> serveTagFolder(uri) - else -> newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "Not found") - } - } catch (e: Exception) { - DebugLogger.e(TAG, "Error serving $uri", e) - newFixedLengthResponse(Response.Status.INTERNAL_ERROR, "text/plain", "Error: ${e.message}") - } - } - - private fun serveDownload(uri: String): Response { - val docId = uri.removePrefix("/api/download/").substringBefore("?") - val bytes = runBlocking { fileStorage.retrieve(docId).getOrNull() } - ?: return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "File not found") - val doc = runBlocking { documentRepository.getById(docId) } - val fileName = doc?.originalFileName ?: "document" - val mime = when (doc?.format?.name) { - "PDF" -> "application/pdf"; "JPG" -> "image/jpeg"; "PNG" -> "image/png" - "VIDEO" -> "video/mp4"; "WEBP" -> "image/webp"; "GIF" -> "image/gif" - else -> "application/octet-stream" - } - DebugLogger.i(TAG, "Download: $fileName (${bytes.size} bytes)") - // Stream response - NanoHTTPD handles chunked transfer for large files - val response = newFixedLengthResponse(Response.Status.OK, mime, ByteArrayInputStream(bytes), bytes.size.toLong()) - response.addHeader("Content-Disposition", "attachment; filename=\"$fileName\"") - response.addHeader("Cache-Control", "no-cache") - return response - } - - private fun handleUpload(session: IHTTPSession): Response { - // NanoHTTPD writes large uploads to temp files on disk (not held in RAM) - val files = HashMap() - session.parseBody(files) - val tmpFilePath = files["file"] - ?: return newFixedLengthResponse(Response.Status.BAD_REQUEST, "text/plain", "No file in request") - val tmpFile = java.io.File(tmpFilePath) - if (!tmpFile.exists()) return newFixedLengthResponse(Response.Status.BAD_REQUEST, "text/plain", "Upload failed") - val bytes = tmpFile.readBytes() - val fileName = session.parms["filename"] ?: session.parms["file"] ?: "upload_${System.currentTimeMillis()}" - DebugLogger.i(TAG, "Upload: $fileName (${bytes.size} bytes)") - runBlocking { - val format = com.app.traveldocs.domain.model.DocumentFormat.UNKNOWN - val doc = com.app.traveldocs.domain.model.ImportedDocument(bytes, format, fileName) - com.app.traveldocs.domain.usecase.DocumentImportUseCase::class.java // placeholder - store directly - fileStorage.store("default-member", bytes, format) - } - tmpFile.delete() - return newFixedLengthResponse(Response.Status.OK, "text/html", - "

Uploaded!

$fileName (${bytes.size / 1024} KB)

Back") - } - - private fun handleRename(session: IHTTPSession): Response { - session.parseBody(HashMap()) - val docId = session.parms["id"] ?: return newFixedLengthResponse(Response.Status.BAD_REQUEST, "text/plain", "Missing id") - val newName = session.parms["name"] ?: return newFixedLengthResponse(Response.Status.BAD_REQUEST, "text/plain", "Missing name") - val sanitized = com.app.traveldocs.data.local.InputSanitizer.sanitizeFilename(newName) - DebugLogger.i(TAG, "Rename: $docId -> $sanitized") - runBlocking { - val doc = documentRepository.getById(docId) - if (doc != null) { - val updated = doc.copy(originalFileName = sanitized, updatedAt = java.time.Instant.now()) - documentRepository.delete(docId) - documentRepository.insert(updated) - } - } - return newFixedLengthResponse(Response.Status.OK, "application/json", """{"status":"ok"}""") - } - - private fun handleTagUpdate(session: IHTTPSession): Response { - session.parseBody(HashMap()) - val docId = session.parms["id"] ?: return newFixedLengthResponse(Response.Status.BAD_REQUEST, "text/plain", "Missing id") - val action = session.parms["action"] ?: "add" - val tagName = session.parms["tag"] ?: return newFixedLengthResponse(Response.Status.BAD_REQUEST, "text/plain", "Missing tag") - val sanitized = com.app.traveldocs.data.local.InputSanitizer.sanitizeTag(tagName) - DebugLogger.i(TAG, "Tag $action: $sanitized on $docId") - runBlocking { - if (action == "remove") tagRepository.removeTag(docId, sanitized) - else tagRepository.addTag(docId, sanitized) - } - return newFixedLengthResponse(Response.Status.OK, "application/json", """{"status":"ok"}""") - } - - private fun serveDocumentList(): Response { - val docs = runBlocking { documentRepository.getAll("default-member").first() } - val json = docs.joinToString(",", "[", "]") { doc -> - val tags = doc.tags.filter { !it.name.startsWith("__") }.joinToString(",") { "\"${it.name}\"" } - """{"id":"${doc.id}","name":"${doc.originalFileName ?: "doc"}","format":"${doc.format.name}","tags":[$tags]}""" - } - return newFixedLengthResponse(Response.Status.OK, "application/json", json) - } - - private fun serveIndex(): Response = newFixedLengthResponse(Response.Status.OK, "text/html", buildIndexHtml()) - private fun serveTagFolder(uri: String): Response { - val tag = uri.removePrefix("/tag/").substringBefore("?").replace("%20", " ") - val docs = runBlocking { documentRepository.getAll("default-member").first() } - val filtered = docs.filter { d -> d.tags.any { it.name == tag } } - return newFixedLengthResponse(Response.Status.OK, "text/html", buildTagHtml(tag, filtered)) - } - - fun getServerUrl(): String { - return try { - val wm = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager - val ip = wm.connectionInfo.ipAddress - val s = "${ip and 0xFF}.${ip shr 8 and 0xFF}.${ip shr 16 and 0xFF}.${ip shr 24 and 0xFF}" - "http://$s:${listeningPort}?token=$accessToken" - } catch (e: Exception) { - "http://localhost:${listeningPort}?token=$accessToken" - } - } - - private fun buildIndexHtml(): String { - val docs = runBlocking { documentRepository.getAll("default-member").first() } - val tags = docs.flatMap { it.tags }.map { it.name }.filter { !it.startsWith("__") }.distinct().sorted() - val t = accessToken - val rows = docs.joinToString("") { doc -> - val dtags = doc.tags.filter { !it.name.startsWith("__") }.joinToString("") { "${it.name} x" } - "${doc.originalFileName?:"doc"}${doc.format.name}$dtags +Download " - } - val folders = tags.joinToString("") { "$it
${docs.count{d->d.tags.any{x->x.name==it}}} docs
" } - return """Document Manager - -

Document Manager 🔄

-

${docs.size} documents • Token-protected • Stop from app when done

-

Tags

$folders
-

Documents

-
0 selected
-$rows
NameFormatTagsActions
-

Upload



Supports large files (up to 200MB)

-""" - } - - private fun buildTagHtml(tag: String, docs: List): String { - val t = accessToken - val rows = docs.joinToString("") { doc -> "${doc.originalFileName?:"doc"}${doc.format.name}Download" } - return """$tag - -

← Back

$tag 🔄

${docs.size} documents

-$rows
NameFormatActions
""" - } -} diff --git a/app/src/main/java/com/app/traveldocs/debug/LocationTrackingService.kt b/app/src/main/java/com/app/traveldocs/debug/LocationTrackingService.kt deleted file mode 100644 index 5120ed7..0000000 --- a/app/src/main/java/com/app/traveldocs/debug/LocationTrackingService.kt +++ /dev/null @@ -1,222 +0,0 @@ -package com.app.traveldocs.debug - -import android.app.Notification -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent -import android.app.Service -import android.content.Context -import android.content.Intent -import android.content.SharedPreferences -import android.location.Location -import android.location.LocationManager -import android.os.Build -import android.os.IBinder -import android.os.Looper -import androidx.core.app.NotificationCompat -import com.app.traveldocs.R -import com.app.traveldocs.presentation.MainActivity -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.cancel -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch - -/** - * Foreground service that logs GPS coordinates at a configurable interval. - * Shows a persistent notification so the user is always aware it's running. - * Skips logging if location hasn't changed (< 10m movement). - */ -class LocationTrackingService : Service() { - - companion object { - const val CHANNEL_ID = "location_tracking_channel" - const val NOTIFICATION_ID = 1001 - const val PREFS_NAME = "location_tracking_prefs" - const val KEY_INTERVAL_MS = "interval_ms" - const val DEFAULT_INTERVAL_MS = 60_000L // 1 minute - const val MIN_MOVE_METERS = 10.0f - - const val ACTION_START = "com.app.traveldocs.START_TRACKING" - const val ACTION_STOP = "com.app.traveldocs.STOP_TRACKING" - - fun getInterval(context: Context): Long { - val prefs = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE) - return prefs.getLong(KEY_INTERVAL_MS, DEFAULT_INTERVAL_MS) - } - - fun setInterval(context: Context, intervalMs: Long) { - val prefs = context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE) - prefs.edit().putLong(KEY_INTERVAL_MS, intervalMs).apply() - } - - fun start(context: Context) { - context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().putBoolean("is_tracking", true).apply() - val intent = Intent(context, LocationTrackingService::class.java).apply { - action = ACTION_START - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - context.startForegroundService(intent) - } else { - context.startService(intent) - } - } - - fun stop(context: Context) { - context.getSharedPreferences(PREFS_NAME, MODE_PRIVATE).edit().putBoolean("is_tracking", false).apply() - val intent = Intent(context, LocationTrackingService::class.java).apply { - action = ACTION_STOP - } - context.stopService(intent) - } - } - - private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - private var trackingJob: Job? = null - private var lastLat: Double? = null - private var lastLng: Double? = null - - override fun onBind(intent: Intent?): IBinder? = null - - override fun onCreate() { - super.onCreate() - createNotificationChannel() - DebugLogger.i("LocationService", "Service created") - } - - override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - // Always call startForeground immediately to avoid ForegroundServiceDidNotStartInTimeException - startForeground(NOTIFICATION_ID, buildNotification()) - when (intent?.action) { - ACTION_STOP -> { - DebugLogger.i("LocationService", "Stop requested") - stopSelf() - return START_NOT_STICKY - } - else -> { - startTracking() - } - } - return START_STICKY - } - - override fun onDestroy() { - trackingJob?.cancel() - scope.cancel() - DebugLogger.i("LocationService", "Service destroyed") - super.onDestroy() - } - - private fun startTracking() { - trackingJob?.cancel() - trackingJob = scope.launch { - DebugLogger.i("LocationService", "Tracking started, interval=${getInterval(this@LocationTrackingService)}ms") - while (true) { - val intervalMs = getInterval(this@LocationTrackingService) - delay(intervalMs) - logLocationIfMoved() - } - } - } - - @Suppress("MissingPermission") - private fun logLocationIfMoved() { - try { - val hasPermission = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) == - android.content.pm.PackageManager.PERMISSION_GRANTED - if (!hasPermission) { - DebugLogger.w("LocationService", "No location permission") - return - } - - val lm = getSystemService(Context.LOCATION_SERVICE) as LocationManager - val loc = lm.getLastKnownLocation(LocationManager.FUSED_PROVIDER) - ?: lm.getLastKnownLocation(LocationManager.GPS_PROVIDER) - ?: lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER) - - if (loc == null) { - DebugLogger.d("LocationService", "No location fix available") - return - } - - val prevLat = lastLat - val prevLng = lastLng - - if (prevLat != null && prevLng != null) { - val results = FloatArray(1) - Location.distanceBetween(prevLat, prevLng, loc.latitude, loc.longitude, results) - if (results[0] < MIN_MOVE_METERS) { - return // Skip — hasn't moved enough - } - } - - lastLat = loc.latitude - lastLng = loc.longitude - DebugLogger.i("LocationService", "GPS: lat=" + loc.latitude + ", lng=" + loc.longitude + ", accuracy=" + loc.accuracy + "m") - scope.launch { storeTrackPoint(loc.latitude, loc.longitude, loc.accuracy) } - } catch (e: Exception) { - DebugLogger.e("LocationService", "Error getting location", e) - } - } - - private fun createNotificationChannel() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val channel = NotificationChannel( - CHANNEL_ID, - "Location Tracking", - NotificationManager.IMPORTANCE_LOW - ).apply { - description = "Logs travel route in background" - setShowBadge(false) - } - val nm = getSystemService(NotificationManager::class.java) - nm.createNotificationChannel(channel) - } - } - - private fun buildNotification(): Notification { - val openIntent = Intent(this, MainActivity::class.java) - val pendingOpen = PendingIntent.getActivity( - this, 0, openIntent, PendingIntent.FLAG_IMMUTABLE - ) - - val stopIntent = Intent(this, LocationTrackingService::class.java).apply { - action = ACTION_STOP - } - val pendingStop = PendingIntent.getService( - this, 1, stopIntent, PendingIntent.FLAG_IMMUTABLE - ) - - val intervalSec = getInterval(this) / 1000 - - return NotificationCompat.Builder(this, CHANNEL_ID) - .setContentTitle("Logging travel route") - .setContentText("GPS logged every ${intervalSec}s (only when moving)") - .setSmallIcon(android.R.drawable.ic_menu_mylocation) - .setContentIntent(pendingOpen) - .addAction(android.R.drawable.ic_delete, "Stop", pendingStop) - .setOngoing(true) - .setPriority(NotificationCompat.PRIORITY_LOW) - .build() - } - - // Separate SQLite database for GPS tracks — avoids contention with Room's main DB - private val db by lazy { - val gpsDb = android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(applicationContext.getDatabasePath("gps_tracks.db"), null) - gpsDb.execSQL("CREATE TABLE IF NOT EXISTS gps_tracks (id INTEGER PRIMARY KEY AUTOINCREMENT, latitude REAL NOT NULL, longitude REAL NOT NULL, accuracy REAL NOT NULL, timestamp INTEGER NOT NULL, isMoving INTEGER NOT NULL DEFAULT 0)") - gpsDb - } - - private suspend fun storeTrackPoint(lat: Double, lng: Double, accuracy: Float) { - try { - val entity = com.app.traveldocs.data.local.entity.GpsTrackEntity( - latitude = lat, longitude = lng, accuracy = accuracy, - timestamp = System.currentTimeMillis(), isMoving = true - ) - try { db.execSQL("INSERT INTO gps_tracks (latitude, longitude, accuracy, timestamp, isMoving) VALUES (?, ?, ?, ?, ?)", arrayOf(entity.latitude, entity.longitude, entity.accuracy, entity.timestamp, if (entity.isMoving) 1 else 0)) } catch (_: Exception) {} - } catch (e: Exception) { - DebugLogger.e("LocationService", "Failed to store GPS track", e) - } - }} diff --git a/app/src/main/java/com/app/traveldocs/debug/SystemTelemetry.kt b/app/src/main/java/com/app/traveldocs/debug/SystemTelemetry.kt deleted file mode 100644 index 7c57aa3..0000000 --- a/app/src/main/java/com/app/traveldocs/debug/SystemTelemetry.kt +++ /dev/null @@ -1,252 +0,0 @@ -package com.app.traveldocs.debug - -import android.app.ActivityManager -import android.app.usage.UsageStatsManager -import android.content.Context -import android.location.Location -import android.location.LocationListener -import android.location.LocationManager -import android.net.ConnectivityManager -import android.net.NetworkCapabilities -import android.os.BatteryManager -import android.os.Bundle -import android.os.Handler -import android.os.Looper -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job -import kotlinx.coroutines.SupervisorJob -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale - -/** - * Captures system-level telemetry: resource usage, connectivity, GPS location. - * - * - On launch/resume: logs memory, CPU info, top apps, connectivity, GPS - * - Background: wakes every 60s to check GPS, only logs if location changed - */ -class SystemTelemetry(private val context: Context) { - - private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob()) - private var locationJob: Job? = null - private var lastLoggedLat: Double? = null - private var lastLoggedLng: Double? = null - private val locationManager by lazy { - context.getSystemService(Context.LOCATION_SERVICE) as LocationManager - } - - companion object { - private const val TAG = "Telemetry" - private const val LOCATION_CHANGE_THRESHOLD_METERS = 10.0 - private const val POLL_INTERVAL_MS = 60_000L - } - - /** - * Call on onCreate/onResume. Logs full system snapshot. - */ - fun captureSnapshot(event: String) { - scope.launch { - DebugLogger.i(TAG, "═══ System Snapshot ($event) ═══") - logMemoryAndCpu() - logTopApps() - logConnectivity() - logCurrentLocation() - } - } - - /** - * Start background GPS polling (every 60s, only logs if moved). - */ - fun startLocationPolling() { - stopLocationPolling() - locationJob = scope.launch { - DebugLogger.d(TAG, "GPS polling started (60s interval)") - while (true) { - delay(POLL_INTERVAL_MS) - logLocationIfChanged() - } - } - } - - /** - * Stop background GPS polling. - */ - fun stopLocationPolling() { - locationJob?.cancel() - locationJob = null - } - - private fun logMemoryAndCpu() { - try { - val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - val memInfo = ActivityManager.MemoryInfo() - activityManager.getMemoryInfo(memInfo) - - val totalMb = memInfo.totalMem / (1024 * 1024) - val availMb = memInfo.availMem / (1024 * 1024) - val usedMb = totalMb - availMb - val usedPercent = (usedMb * 100) / totalMb - - DebugLogger.i(TAG, "Memory: ${usedMb}MB / ${totalMb}MB (${usedPercent}% used, avail=${availMb}MB, lowMem=${memInfo.lowMemory})") - - // Battery - val batteryManager = context.getSystemService(Context.BATTERY_SERVICE) as? BatteryManager - val batteryLevel = batteryManager?.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) ?: -1 - val isCharging = batteryManager?.isCharging ?: false - DebugLogger.i(TAG, "Battery: ${batteryLevel}% ${if (isCharging) "(charging)" else "(discharging)"}") - - // Runtime memory for our process - val runtime = Runtime.getRuntime() - val appMaxMb = runtime.maxMemory() / (1024 * 1024) - val appTotalMb = runtime.totalMemory() / (1024 * 1024) - val appFreeMb = runtime.freeMemory() / (1024 * 1024) - val appUsedMb = appTotalMb - appFreeMb - DebugLogger.d(TAG, "App heap: used=${appUsedMb}MB, total=${appTotalMb}MB, max=${appMaxMb}MB") - } catch (e: Exception) { - DebugLogger.e(TAG, "Failed to read memory/CPU info", e) - } - } - - private fun logTopApps() { - try { - val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager - - // getRunningAppProcesses gives us running processes - val processes = activityManager.runningAppProcesses ?: emptyList() - - // Sort by importance (lower = more important/active) - val top5 = processes - .sortedBy { it.importance } - .take(5) - - DebugLogger.i(TAG, "Top 5 active processes:") - top5.forEachIndexed { idx, proc -> - val importanceLabel = when { - proc.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND -> "FOREGROUND" - proc.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE -> "VISIBLE" - proc.importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE -> "SERVICE" - else -> "BACKGROUND" - } - DebugLogger.d(TAG, " ${idx + 1}. ${proc.processName} [$importanceLabel] pid=${proc.pid}") - } - } catch (e: Exception) { - DebugLogger.e(TAG, "Failed to get top apps", e) - } - } - - private fun logConnectivity() { - try { - val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager - val network = cm.activeNetwork - if (network == null) { - DebugLogger.w(TAG, "Connectivity: NO ACTIVE NETWORK (offline)") - return - } - - val caps = cm.getNetworkCapabilities(network) - if (caps == null) { - DebugLogger.w(TAG, "Connectivity: network present but no capabilities") - return - } - - val type = when { - caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "WiFi" - caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "Cellular" - caps.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> "Ethernet" - caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN) -> "VPN" - else -> "Other" - } - - val hasInternet = caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) - val validated = caps.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) - val downMbps = caps.linkDownstreamBandwidthKbps / 1000 - val upMbps = caps.linkUpstreamBandwidthKbps / 1000 - - DebugLogger.i(TAG, "Connectivity: $type | internet=$hasInternet | validated=$validated | down=${downMbps}Mbps | up=${upMbps}Mbps") - } catch (e: Exception) { - DebugLogger.e(TAG, "Failed to read connectivity", e) - } - } - - @Suppress("MissingPermission") - private fun logCurrentLocation() { - try { - if (!hasLocationPermission()) { - DebugLogger.w(TAG, "GPS: Location permission not granted — skipping") - return - } - - val providers = locationManager.getProviders(true) - DebugLogger.d(TAG, "GPS: Available providers: $providers") - - // Try to get last known location from best available provider - val location = getLastKnownLocation() - if (location != null) { - lastLoggedLat = location.latitude - lastLoggedLng = location.longitude - DebugLogger.i(TAG, "GPS: lat=${location.latitude}, lng=${location.longitude}, accuracy=${location.accuracy}m, provider=${location.provider}, age=${getLocationAgeMs(location)}ms") - } else { - DebugLogger.w(TAG, "GPS: No last known location available") - } - } catch (e: SecurityException) { - DebugLogger.w(TAG, "GPS: Permission denied", e) - } catch (e: Exception) { - DebugLogger.e(TAG, "GPS: Failed to read location", e) - } - } - - @Suppress("MissingPermission") - private fun logLocationIfChanged() { - try { - if (!hasLocationPermission()) return - - val location = getLastKnownLocation() ?: return - - val prevLat = lastLoggedLat - val prevLng = lastLoggedLng - - if (prevLat != null && prevLng != null) { - val distance = FloatArray(1) - Location.distanceBetween(prevLat, prevLng, location.latitude, location.longitude, distance) - if (distance[0] < LOCATION_CHANGE_THRESHOLD_METERS) { - // Location hasn't changed enough — skip logging - return - } - } - - lastLoggedLat = location.latitude - lastLoggedLng = location.longitude - DebugLogger.i(TAG, "GPS (periodic): lat=${location.latitude}, lng=${location.longitude}, accuracy=${location.accuracy}m") - } catch (e: Exception) { - // Silently skip on errors during background polling - } - } - - @Suppress("MissingPermission") - private fun getLastKnownLocation(): Location? { - val providers = listOf(LocationManager.FUSED_PROVIDER, LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER) - for (provider in providers) { - try { - val loc = locationManager.getLastKnownLocation(provider) - if (loc != null) return loc - } catch (_: Exception) { - // Try next provider - } - } - return null - } - - private fun hasLocationPermission(): Boolean { - val fine = context.checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) - val coarse = context.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) - return fine == android.content.pm.PackageManager.PERMISSION_GRANTED || - coarse == android.content.pm.PackageManager.PERMISSION_GRANTED - } - - private fun getLocationAgeMs(location: Location): Long { - return System.currentTimeMillis() - location.time - } -} diff --git a/app/src/main/java/com/app/traveldocs/debug/TrackingSettingsPanel.kt b/app/src/main/java/com/app/traveldocs/debug/TrackingSettingsPanel.kt deleted file mode 100644 index 51e8fd4..0000000 --- a/app/src/main/java/com/app/traveldocs/debug/TrackingSettingsPanel.kt +++ /dev/null @@ -1,127 +0,0 @@ -package com.app.traveldocs.debug - -import android.content.Context -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.FilterChip -import androidx.compose.material3.FilterChipDefaults -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableLongStateOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -data class IntervalOption(val label: String, val ms: Long) - -val intervalOptions = listOf( - IntervalOption("30s", 30_000L), - IntervalOption("1 min", 60_000L), - IntervalOption("5 min", 300_000L), - IntervalOption("15 min", 900_000L), - IntervalOption("30 min", 1_800_000L), -) - -@OptIn(androidx.compose.material3.ExperimentalMaterial3Api::class) -@Composable -fun TrackingSettingsPanel() { - val context = LocalContext.current - var isTracking by remember { mutableStateOf(isServiceRunning(context)) } - var selectedInterval by remember { mutableLongStateOf(LocationTrackingService.getInterval(context)) } - - Card( - modifier = Modifier.fillMaxWidth(), - shape = RoundedCornerShape(12.dp), - colors = CardDefaults.cardColors(containerColor = Color.White), - elevation = CardDefaults.cardElevation(defaultElevation = 2.dp) - ) { - Column(modifier = Modifier.padding(16.dp)) { - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically - ) { - Column { - Text("Background GPS Tracking", fontSize = 14.sp, fontWeight = FontWeight.SemiBold) - Text( - if (isTracking) "Active — logging when moving" else "Stopped", - fontSize = 11.sp, - color = if (isTracking) Color(0xFF4CAF50) else Color.Gray - ) - } - Switch( - checked = isTracking, - onCheckedChange = { enabled -> - isTracking = enabled - if (enabled) { - LocationTrackingService.start(context) - DebugLogger.i("Settings", "GPS tracking started") - } else { - LocationTrackingService.stop(context) - DebugLogger.i("Settings", "GPS tracking stopped") - } - } - ) - } - - Spacer(Modifier.height(12.dp)) - Text("Log interval:", fontSize = 12.sp, color = Color.Gray) - Spacer(Modifier.height(6.dp)) - - Row( - modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(6.dp) - ) { - intervalOptions.forEach { option -> - FilterChip( - selected = selectedInterval == option.ms, - onClick = { - selectedInterval = option.ms - LocationTrackingService.setInterval(context, option.ms) - DebugLogger.d("Settings", "GPS interval changed to ${option.label}") - if (isTracking) { - // Restart service to pick up new interval - LocationTrackingService.stop(context) - LocationTrackingService.start(context) - } - }, - label = { Text(option.label, fontSize = 11.sp) }, - colors = FilterChipDefaults.filterChipColors( - selectedContainerColor = Color(0xFF1565C0), - selectedLabelColor = Color.White - ) - ) - } - } - } - } -} - -private fun isServiceRunning(context: Context): Boolean { - val prefs = context.getSharedPreferences(LocationTrackingService.PREFS_NAME, Context.MODE_PRIVATE) - // Simple heuristic — if we set tracking on, assume it's running - // A more robust check would use ActivityManager but it's restricted on modern Android - return prefs.getBoolean("is_tracking", false) -} diff --git a/app/src/main/java/com/app/traveldocs/domain/model/DocumentFormat.kt b/app/src/main/java/com/app/traveldocs/domain/model/DocumentFormat.kt deleted file mode 100644 index 5a66ef4..0000000 --- a/app/src/main/java/com/app/traveldocs/domain/model/DocumentFormat.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.app.traveldocs.domain.model - -/** - * File formats we know how to handle. - * - * The core set (PDF, JPG, PNG, VIDEO) is always available. - * Extended formats (WEBP, HEIC, BMP, GIF, DICOM) are behind the "Extended Image Formats" - * experimental feature flag — mostly because HEIC needs API 28+ and DICOM is niche. - */ -enum class DocumentFormat { - PDF, - JPG, - PNG, - VIDEO, - - // Extended formats (experimental) - WEBP, - HEIC, // iOS photos — needs API 28+ - BMP, // Legacy scanner output - GIF, // Rarely useful for docs, but trivial to support - DICOM, // Medical imaging — custom parser, no third-party deps - AUDIO, // MP3, M4A, WAV — playable media - UNKNOWN, // Unsupported format — stored as-is, tagged __UNSUPPORTED -} diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/AutoTagGenerator.kt b/app/src/main/java/com/app/traveldocs/domain/repository/AutoTagGenerator.kt deleted file mode 100644 index 3eab3a5..0000000 --- a/app/src/main/java/com/app/traveldocs/domain/repository/AutoTagGenerator.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.app.traveldocs.domain.repository - -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.ExtractedValue -import com.app.traveldocs.domain.model.MetadataField - -interface AutoTagGenerator { - fun generateTags(documentType: DocumentType, metadata: Map): List -} diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentChecklistGenerator.kt b/app/src/main/java/com/app/traveldocs/domain/repository/DocumentChecklistGenerator.kt deleted file mode 100644 index 1d8903e..0000000 --- a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentChecklistGenerator.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.app.traveldocs.domain.repository - -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.MissingDocument -import com.app.traveldocs.domain.model.TravelDocumentChecklist -import com.app.traveldocs.domain.model.TravelParameters - -interface DocumentChecklistGenerator { - fun generateChecklist(params: TravelParameters): TravelDocumentChecklist - fun detectMissing(checklist: TravelDocumentChecklist, existingDocuments: List): List -} diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/NaturalLanguageParser.kt b/app/src/main/java/com/app/traveldocs/domain/repository/NaturalLanguageParser.kt deleted file mode 100644 index a290cec..0000000 --- a/app/src/main/java/com/app/traveldocs/domain/repository/NaturalLanguageParser.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.app.traveldocs.domain.repository - -import com.app.traveldocs.domain.model.ParseResult - -interface NaturalLanguageParser { - fun parse(query: String): ParseResult -} diff --git a/app/src/main/java/com/app/traveldocs/media/AudioPlaybackService.kt b/app/src/main/java/com/app/traveldocs/media/AudioPlaybackService.kt deleted file mode 100644 index 801ed04..0000000 --- a/app/src/main/java/com/app/traveldocs/media/AudioPlaybackService.kt +++ /dev/null @@ -1,228 +0,0 @@ -package com.app.traveldocs.media - -import android.content.Intent -import android.media.MediaPlayer -import android.net.Uri -import android.os.Bundle -import android.support.v4.media.MediaBrowserCompat -import android.support.v4.media.MediaDescriptionCompat -import android.support.v4.media.MediaMetadataCompat -import android.support.v4.media.session.MediaSessionCompat -import android.support.v4.media.session.PlaybackStateCompat -import androidx.media.MediaBrowserServiceCompat -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.repository.DocumentFileStorage -import com.app.traveldocs.domain.repository.DocumentRepository -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.runBlocking -import java.io.File - -/** - * MediaBrowserService for Android Auto and system media controls. - * - * Exposes audio documents (MP3, M4A, WAV) organized by tags as a browsable media tree. - * Android Auto connects to this service to show audio content and playback controls - * on the car's head unit. - * - * Media tree structure: - * ROOT - * ├── All Audio (flat list) - * └── By Tag - * ├── tag1 (audio files with this tag) - * └── tag2 (audio files with this tag) - */ -class AudioPlaybackService : MediaBrowserServiceCompat() { - - private lateinit var documentRepository: DocumentRepository - private lateinit var fileStorage: DocumentFileStorage - - private lateinit var mediaSession: MediaSessionCompat - private var mediaPlayer: MediaPlayer? = null - private var currentDocId: String? = null - private var playlist: List = emptyList() - private var playlistIndex = 0 - - companion object { - private const val TAG = "AudioService" - private const val ROOT_ID = "root" - private const val ALL_AUDIO_ID = "all_audio" - private const val BY_TAG_ID = "by_tag" - } - - @dagger.hilt.EntryPoint - @dagger.hilt.InstallIn(dagger.hilt.components.SingletonComponent::class) - interface ServiceEntryPoint { - fun documentRepository(): DocumentRepository - fun fileStorage(): DocumentFileStorage - } - - override fun onCreate() { - super.onCreate() - val entryPoint = dagger.hilt.android.EntryPointAccessors.fromApplication(applicationContext, ServiceEntryPoint::class.java) - documentRepository = entryPoint.documentRepository() - fileStorage = entryPoint.fileStorage() - mediaSession = MediaSessionCompat(this, "DocumentManagerAudio").apply { - setCallback(mediaSessionCallback) - isActive = true - } - sessionToken = mediaSession.sessionToken - DebugLogger.i(TAG, "AudioPlaybackService created") - } - - override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot { - return BrowserRoot(ROOT_ID, null) - } - - override fun onLoadChildren(parentId: String, result: Result>) { - val items = mutableListOf() - val audioDocs = getAudioDocuments() - - when (parentId) { - ROOT_ID -> { - items.add(createBrowsableItem(ALL_AUDIO_ID, "All Audio", "${audioDocs.size} tracks")) - items.add(createBrowsableItem(BY_TAG_ID, "By Tag", "Organized by tags")) - } - ALL_AUDIO_ID -> { - audioDocs.forEach { doc -> - items.add(createPlayableItem(doc)) - } - } - BY_TAG_ID -> { - val tags = audioDocs.flatMap { it.tags }.map { it.name }.filter { !it.startsWith("__") }.distinct().sorted() - tags.forEach { tag -> - val count = audioDocs.count { d -> d.tags.any { it.name == tag } } - items.add(createBrowsableItem("tag_$tag", tag, "$count tracks")) - } - } - else -> { - if (parentId.startsWith("tag_")) { - val tag = parentId.removePrefix("tag_") - audioDocs.filter { d -> d.tags.any { it.name == tag } }.forEach { doc -> - items.add(createPlayableItem(doc)) - } - } - } - } - result.sendResult(items) - } - - private fun getAudioDocuments(): List { - return runBlocking { - // Only show audio if the experimental feature is enabled - if (!com.app.traveldocs.data.local.FeatureFlags.isAudioPlaybackEnabled(applicationContext)) return@runBlocking emptyList() - documentRepository.getAll("default-member").first() - .filter { it.format == DocumentFormat.AUDIO } - } - } - - private fun createBrowsableItem(id: String, title: String, subtitle: String): MediaBrowserCompat.MediaItem { - val desc = MediaDescriptionCompat.Builder() - .setMediaId(id) - .setTitle(title) - .setSubtitle(subtitle) - .build() - return MediaBrowserCompat.MediaItem(desc, MediaBrowserCompat.MediaItem.FLAG_BROWSABLE) - } - - private fun createPlayableItem(doc: Document): MediaBrowserCompat.MediaItem { - val desc = MediaDescriptionCompat.Builder() - .setMediaId(doc.id) - .setTitle(doc.originalFileName ?: "Audio") - .setSubtitle(doc.tags.filter { !it.name.startsWith("__") }.joinToString(", ") { it.name }) - .build() - return MediaBrowserCompat.MediaItem(desc, MediaBrowserCompat.MediaItem.FLAG_PLAYABLE) - } - - private val mediaSessionCallback = object : MediaSessionCompat.Callback() { - override fun onPlayFromMediaId(mediaId: String, extras: Bundle?) { - DebugLogger.i(TAG, "Play: $mediaId") - playDocument(mediaId) - } - - override fun onPlay() { - mediaPlayer?.start() - updatePlaybackState(PlaybackStateCompat.STATE_PLAYING) - } - - override fun onPause() { - mediaPlayer?.pause() - updatePlaybackState(PlaybackStateCompat.STATE_PAUSED) - } - - override fun onStop() { - mediaPlayer?.stop() - mediaPlayer?.release() - mediaPlayer = null - updatePlaybackState(PlaybackStateCompat.STATE_STOPPED) - } - - override fun onSkipToNext() { - if (playlistIndex < playlist.size - 1) { - playlistIndex++ - playDocument(playlist[playlistIndex].id) - } - } - - override fun onSkipToPrevious() { - if (playlistIndex > 0) { - playlistIndex-- - playDocument(playlist[playlistIndex].id) - } - } - } - - private fun playDocument(docId: String) { - try { - mediaPlayer?.release() - val bytes = runBlocking { fileStorage.retrieve(docId).getOrNull() } ?: return - val doc = runBlocking { documentRepository.getById(docId) } - - // Write to temp file for MediaPlayer - val tmpFile = File(cacheDir, "audio_playback.tmp") - tmpFile.writeBytes(bytes) - - mediaPlayer = MediaPlayer().apply { - setDataSource(tmpFile.absolutePath) - prepare() - start() - setOnCompletionListener { mediaSessionCallback.onSkipToNext() } - } - - currentDocId = docId - updatePlaybackState(PlaybackStateCompat.STATE_PLAYING) - - // Update metadata for lock screen / Android Auto display - val metadata = MediaMetadataCompat.Builder() - .putString(MediaMetadataCompat.METADATA_KEY_MEDIA_ID, docId) - .putString(MediaMetadataCompat.METADATA_KEY_TITLE, doc?.originalFileName ?: "Audio") - .putLong(MediaMetadataCompat.METADATA_KEY_DURATION, mediaPlayer!!.duration.toLong()) - .build() - mediaSession.setMetadata(metadata) - - DebugLogger.i(TAG, "Playing: ${doc?.originalFileName} (${bytes.size / 1024}KB)") - } catch (e: Exception) { - DebugLogger.e(TAG, "Playback failed", e) - } - } - - private fun updatePlaybackState(state: Int) { - val position = mediaPlayer?.currentPosition?.toLong() ?: 0L - val stateBuilder = PlaybackStateCompat.Builder() - .setActions( - PlaybackStateCompat.ACTION_PLAY or PlaybackStateCompat.ACTION_PAUSE or - PlaybackStateCompat.ACTION_STOP or PlaybackStateCompat.ACTION_SKIP_TO_NEXT or - PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS - ) - .setState(state, position, 1f) - mediaSession.setPlaybackState(stateBuilder.build()) - } - - override fun onDestroy() { - mediaPlayer?.release() - mediaSession.release() - DebugLogger.i(TAG, "AudioPlaybackService destroyed") - super.onDestroy() - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/MainActivity.kt b/app/src/main/java/com/app/traveldocs/presentation/MainActivity.kt deleted file mode 100644 index 23326de..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/MainActivity.kt +++ /dev/null @@ -1,588 +0,0 @@ -package com.app.traveldocs.presentation - -import java.io.File -import android.Manifest -import android.content.Context -import android.content.pm.PackageManager -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.items -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Add -import androidx.compose.material.icons.filled.Delete -import androidx.compose.material.icons.filled.Description -import androidx.compose.material.icons.filled.FlightTakeoff -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.Folder -import androidx.compose.material.icons.filled.Lock -import androidx.compose.material.icons.filled.Folder -import androidx.compose.material.icons.filled.LockOpen -import androidx.compose.material.icons.filled.HealthAndSafety -import androidx.compose.material.icons.filled.Hotel -import androidx.compose.material.icons.filled.AccountBox -import androidx.compose.material.icons.filled.AirplanemodeActive -import androidx.compose.material.icons.filled.CreditCard -import androidx.compose.material.icons.filled.InsertDriveFile -import androidx.compose.material.icons.filled.LocalHospital -import androidx.compose.material.icons.filled.Public -import androidx.compose.material.icons.filled.Sell -import androidx.compose.material.icons.filled.QuestionMark -import androidx.compose.material.icons.filled.Refresh -import androidx.compose.material.icons.filled.RestartAlt -import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.filled.Settings -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableIntStateOf -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.core.content.ContextCompat -import androidx.hilt.navigation.compose.hiltViewModel -import com.app.traveldocs.debug.DebugLogScreen -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.debug.SystemTelemetry -import com.app.traveldocs.debug.TempFileCleanup -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.presentation.diagnostics.DiagnosticsScreen -import com.app.traveldocs.presentation.documents.DocumentListScreen -import com.app.traveldocs.presentation.documents.DocumentListViewModel -import com.app.traveldocs.presentation.documents.DocumentViewerScreen -import com.app.traveldocs.presentation.documents.ImportScreen -import com.app.traveldocs.presentation.search.SearchScreen -import com.app.traveldocs.presentation.settings.SettingsScreen -import com.app.traveldocs.presentation.tags.TagManagementScreen -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material.icons.filled.CheckCircle -import com.app.traveldocs.presentation.documents.ImportViewModel -import com.app.traveldocs.BuildConfig -import dagger.hilt.android.AndroidEntryPoint - -@AndroidEntryPoint -class MainActivity : androidx.fragment.app.FragmentActivity() { - - private lateinit var telemetry: SystemTelemetry - - private val locationPermissionRequest = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { perms -> - if (perms.values.any { it }) { telemetry.captureSnapshot("permission_granted"); telemetry.startLocationPolling() } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - telemetry = SystemTelemetry(applicationContext) - DebugLogger.i("MainActivity", "onCreate") - com.app.traveldocs.debug.UsageTelemetry.resetSession() - telemetry.captureSnapshot("onCreate") - if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { - locationPermissionRequest.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) - } else { telemetry.startLocationPolling() } - - setContent { - val eulaPrefs = remember { getSharedPreferences("eula_prefs", MODE_PRIVATE) } - val splashPrefs = remember { getSharedPreferences("splash_prefs", MODE_PRIVATE) } - val disclaimerPrefs = remember { getSharedPreferences("disclaimer_prefs", MODE_PRIVATE) } - // Check if launched via share intent (another app shared a doc to us) - val sharedUri = remember { - val action = intent?.action - if (action == android.content.Intent.ACTION_SEND) { - intent?.getParcelableExtra(android.content.Intent.EXTRA_STREAM) - } else if (action == android.content.Intent.ACTION_VIEW) { - intent?.data - } else null - } - - val initialScreen = when { - !eulaPrefs.getBoolean("eula_accepted", false) -> "eula" - !splashPrefs.getBoolean("skip_splash", false) -> "splash" - !disclaimerPrefs.getBoolean("disclaimer_accepted", false) -> "disclaimer" - else -> "pin" - } - var screen by remember { mutableStateOf(initialScreen) } - var showDebugLogs by remember { mutableStateOf(false) } - var selectedDoc by remember { mutableStateOf(null) } - var currentDocList by remember { mutableStateOf>(emptyList()) } - // Dynamic dark/light theme - reads from SharedPreferences, updates immediately - val darkMode = remember { mutableStateOf(getSharedPreferences("app_settings", MODE_PRIVATE).getBoolean("dark_mode", false)) } - val colorScheme = if (darkMode.value) androidx.compose.material3.darkColorScheme() else androidx.compose.material3.lightColorScheme() - MaterialTheme(colorScheme = colorScheme) { - when { - showDebugLogs -> DebugLogScreen(onClose = { showDebugLogs = false }) - screen == "eula" -> com.app.traveldocs.presentation.onboarding.EulaScreen( - onAccepted = { - val prefs = getSharedPreferences("eula_prefs", MODE_PRIVATE) - val timestamp = System.currentTimeMillis() - val location = try { - val lm = getSystemService(LOCATION_SERVICE) as android.location.LocationManager - @Suppress("MissingPermission") - val loc = lm.getLastKnownLocation(android.location.LocationManager.FUSED_PROVIDER) - ?: lm.getLastKnownLocation(android.location.LocationManager.GPS_PROVIDER) - if (loc != null) "${loc.latitude}, ${loc.longitude}" else "Not available" - } catch (_: Exception) { "Not available" } - prefs.edit() - .putBoolean("eula_accepted", true) - .putLong("accepted_timestamp", timestamp) - .putString("accepted_location", location) - .apply() - com.app.traveldocs.debug.DebugLogger.i("EULA", "Accepted at $timestamp, location=$location") - screen = if (!splashPrefs.getBoolean("skip_splash", false)) "splash" - else if (!disclaimerPrefs.getBoolean("disclaimer_accepted", false)) "disclaimer" - else "pin" - }, - onDeclined = { - com.app.traveldocs.debug.DebugLogger.w("EULA", "Declined — closing app") - finishAffinity() - } - ) - screen == "splash" -> com.app.traveldocs.presentation.onboarding.SplashScreen(onContinue = { skipInFuture -> - if (skipInFuture) { getSharedPreferences("splash_prefs", MODE_PRIVATE).edit().putBoolean("skip_splash", true).apply() } - screen = if (!disclaimerPrefs.getBoolean("disclaimer_accepted", false)) "disclaimer" - else "pin" - }) - screen == "disclaimer" -> com.app.traveldocs.presentation.onboarding.DisclaimerScreen(onAccepted = { telemetryConsent -> - getSharedPreferences("disclaimer_prefs", MODE_PRIVATE).edit().putBoolean("disclaimer_accepted", true).putLong("accepted_timestamp", System.currentTimeMillis()).putBoolean("telemetry_consented", telemetryConsent).apply() - com.app.traveldocs.debug.UsageTelemetry.setConsent(telemetryConsent) - screen = "consent" - }) - - screen == "pin" -> { - val fa = this@MainActivity as androidx.fragment.app.FragmentActivity - com.app.traveldocs.presentation.auth.BiometricAuthScreen( - activity = fa, - onAuthenticated = { screen = if (sharedUri != null) "import_shared" else "main" }, - onSkipped = { screen = if (sharedUri != null) "import_shared" else "main" } - ) - } - screen == "import_shared" -> { - // Received a doc from another app — auto-import it - val importVm: com.app.traveldocs.presentation.documents.ImportViewModel = hiltViewModel() - LaunchedEffect(sharedUri) { - if (sharedUri != null) { - com.app.traveldocs.debug.DebugLogger.i("ShareTarget", "Auto-importing shared doc: $sharedUri") - importVm.importFile(sharedUri) - } - } - val sState by importVm.state.collectAsState() - Column(modifier = Modifier.fillMaxSize().padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { - when { - sState.isImporting -> { CircularProgressIndicator(Modifier.size(64.dp)); Spacer(Modifier.height(16.dp)); Text("Importing shared document...") } - sState.importedDocument != null -> { - Icon(Icons.Filled.CheckCircle, null, tint = Color(0xFF4CAF50), modifier = Modifier.size(64.dp)) - Spacer(Modifier.height(16.dp)); Text("Imported!", fontSize = 20.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(24.dp)); Button(onClick = { importVm.clearState(); screen = "main" }) { Text("Done") } - } - sState.error != null -> { - Text("\u274C", fontSize = 48.sp) - Spacer(Modifier.height(16.dp)); Text("Import Failed", color = Color(0xFFF44336)) - Text(sState.error ?: "", fontSize = 13.sp, color = Color.Gray) - Spacer(Modifier.height(24.dp)); Button(onClick = { screen = "main" }) { Text("Go to Home") } - } - else -> { CircularProgressIndicator(); Text("Preparing...") } - } - } - } - screen == "import" -> ImportScreen(onDone = { screen = "main" }) - screen == "documents" -> DocumentListScreen(onBack = { screen = "main" }, onDocumentClick = { doc -> selectedDoc = doc; screen = "viewer" }, onSetDocList = { currentDocList = it }) - screen == "viewer" && selectedDoc != null -> { - val currentIdx = currentDocList.indexOfFirst { it.id == selectedDoc!!.id } - DocumentViewerScreen( - document = selectedDoc!!, - onBack = { screen = "documents" }, - onPrev = if (currentIdx > 0) { { selectedDoc = currentDocList[currentIdx - 1] } } else null, - onNext = if (currentIdx < currentDocList.size - 1) { { selectedDoc = currentDocList[currentIdx + 1] } } else null - ) - } - screen == "search" -> SearchScreen(onBack = { screen = "main" }, onDocumentClick = { doc -> selectedDoc = doc; screen = "viewer" }) - screen == "tags" -> TagManagementScreen(onBack = { screen = "main" }) - screen == "settings" -> SettingsScreen(onBack = { screen = "main" }) - screen == "about" -> com.app.traveldocs.presentation.about.AboutScreen(onBack = { screen = "main" }) - screen == "eula_view" -> com.app.traveldocs.presentation.onboarding.EulaViewScreen(onBack = { screen = "main" }) - screen == "review" -> com.app.traveldocs.presentation.review.ReviewScreen(onBack = { screen = "main" }) - screen == "webshare" -> com.app.traveldocs.presentation.webshare.WebShareScreen(onBack = { screen = "main" }) - screen == "feedback" -> { - // Launch GitHub Issues in browser for feedback - val intent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse("https://github.com/sethusrinivasan/document-manager/issues")) - intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK) - try { this@MainActivity.startActivity(intent) } catch (_: Exception) {} - screen = "main" - } - screen == "backup" -> com.app.traveldocs.presentation.backup.BackupOnlyScreen(onBack = { screen = "main" }) - screen == "restore" -> com.app.traveldocs.presentation.backup.RestoreOnlyScreen(onBack = { screen = "main" }) - screen == "diagnostics" -> DiagnosticsScreen(onBack = { screen = "main" }, onViewLogs = { showDebugLogs = true }) - else -> MainScreen( - onImport = { com.app.traveldocs.debug.UsageTelemetry.action("Main", "tap_import"); screen = "import" }, - onAllDocs = { com.app.traveldocs.debug.UsageTelemetry.action("Main", "tap_documents"); screen = "documents" }, - onSearch = { com.app.traveldocs.debug.UsageTelemetry.action("Main", "tap_search"); screen = "search" }, - onTags = { screen = "tags" }, - onSettings = { screen = "settings" }, - onDiagnostics = { screen = "diagnostics" }, - onBackup = { screen = "backup" }, - onRestore = { screen = "restore" }, - onAbout = { screen = "about" }, - onFeedback = { screen = "feedback" }, - onReview = { screen = "review" }, - onWebShare = { screen = "webshare" }, - onReset = { resetApp() }, - onDocClick = { doc -> selectedDoc = doc; screen = "viewer" }, - ) - } - } - } - } - - override fun onResume() { super.onResume(); telemetry.captureSnapshot("onResume"); telemetry.startLocationPolling(); Thread { TempFileCleanup.cleanSharedDocs(applicationContext) }.start() } - override fun onPause() { super.onPause(); com.app.traveldocs.debug.UsageTelemetry.emitSessionSummary() } - override fun onDestroy() { super.onDestroy(); telemetry.stopLocationPolling() } - - private fun resetApp(): String { - DebugLogger.w("App", "!!! FACTORY RESET triggered by user") - val report = StringBuilder() - - // Checkpoint WAL before any operations - val dbPath = getDatabasePath("traveldocs.db") - try { - if (dbPath.exists()) { - val flushDb = android.database.sqlite.SQLiteDatabase.openDatabase(dbPath.path, null, android.database.sqlite.SQLiteDatabase.OPEN_READWRITE) - flushDb.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)", null).close() - flushDb.close() - report.appendLine("WAL checkpoint: done") - } - } catch (e: Exception) { report.appendLine("WAL checkpoint: skipped (${e.message})") } - - // Archive old database - if (dbPath.exists()) { - val archiveDir = java.io.File(filesDir, "db_archive") - archiveDir.mkdirs() - for (i in 10 downTo 2) { - val older = java.io.File(archiveDir, "traveldocs.db.${String.format("%03d", i - 1)}") - val newer = java.io.File(archiveDir, "traveldocs.db.${String.format("%03d", i)}") - if (older.exists()) older.renameTo(newer) - } - val archive = java.io.File(archiveDir, "traveldocs.db.001") - dbPath.copyTo(archive, overwrite = true) - report.appendLine("DB archived: ${archive.name} (${archive.length()/1024}KB)") - } - - // Delete database + journals - deleteDatabase("traveldocs.db") - java.io.File(dbPath.path + "-wal").delete() - java.io.File(dbPath.path + "-shm").delete() - report.appendLine("Database deleted: traveldocs.db + WAL/SHM") - - // Delete GPS database - val gpsDb = getDatabasePath("gps_tracks.db") - if (gpsDb.exists()) { gpsDb.delete(); report.appendLine("GPS database deleted") } - - // Clear preferences - val prefsToWipe = listOf("traveldocs_stats", "encryption_consent", "disclaimer_prefs", - "splash_prefs", "eula_prefs", "location_tracking_prefs", "feature_flags", - "app_settings", "tag_colors", "secure_doc_pins", "security_alert_prefs") - prefsToWipe.forEach { getSharedPreferences(it, MODE_PRIVATE).edit().clear().commit() } - report.appendLine("Preferences cleared: ${prefsToWipe.size} stores") - - // Delete document files - val docsDir = java.io.File(filesDir, "docs") - val docCount = if (docsDir.exists()) docsDir.walkTopDown().filter { it.isFile }.count() else 0 - docsDir.deleteRecursively() - report.appendLine("Document files deleted: $docCount files") - - // Delete debug logs - val logsDir = java.io.File(filesDir, "debug_logs") - logsDir.deleteRecursively() - report.appendLine("Debug logs deleted") - - // Delete crash report - java.io.File(filesDir, "last_crash_report.txt").delete() - report.appendLine("Crash report deleted") - - // Delete cache - cacheDir.deleteRecursively() - report.appendLine("Cache cleared") - - report.appendLine("") - report.appendLine("Reset complete. App needs restart to initialize fresh.") - return report.toString() - } -} - - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun MainScreen( - onImport: () -> Unit, onAllDocs: () -> Unit, onSearch: () -> Unit, - onTags: () -> Unit, onSettings: () -> Unit, onDiagnostics: () -> Unit, onBackup: () -> Unit, onRestore: () -> Unit, onAbout: () -> Unit, onFeedback: () -> Unit, onReview: () -> Unit, onWebShare: () -> Unit, - onDocClick: (Document) -> Unit, onReset: () -> Unit -) { - val viewModel: DocumentListViewModel = hiltViewModel() - val context = androidx.compose.ui.platform.LocalContext.current - val documents by viewModel.documents.collectAsState() - var isRefreshing by remember { mutableStateOf(false) } - val refreshScope = rememberCoroutineScope() - var showGearMenu by remember { mutableStateOf(false) } - var showResetDialog by remember { mutableStateOf(false) } - - var resetStep by remember { mutableIntStateOf(0) } - - if (showResetDialog) { - AlertDialog( - onDismissRequest = { showResetDialog = false; resetStep = 0 }, - icon = { Icon(Icons.Filled.RestartAlt, null, tint = Color(0xFFF44336)) }, - title = { Text(if (resetStep < 2) "Reset App?" else "ARE YOU SURE?") }, - text = { Column { - if (resetStep == 3) { - Text("Reset complete. Details:", fontWeight = FontWeight.SemiBold, fontSize = 14.sp) - Spacer(Modifier.height(8.dp)) - Text("", fontSize = 11.sp, fontFamily = FontFamily.Monospace, color = Color.Gray) - Spacer(Modifier.height(12.dp)) - Text("Tap 'Restart App' to start fresh.", fontSize = 13.sp) - } else if (resetStep < 2) { - Text("This will PERMANENTLY DELETE:", fontWeight = FontWeight.Bold, fontSize = 14.sp) - Spacer(Modifier.height(8.dp)) - Text("• All imported documents (encrypted files)", fontSize = 13.sp) - Text("• All tags and metadata", fontSize = 13.sp) - Text("• All settings and preferences", fontSize = 13.sp) - Text("• EULA acceptance (will show again)", fontSize = 13.sp) - Text("• Debug logs and telemetry", fontSize = 13.sp) - Text("• PIN-protected documents (UNRECOVERABLE)", fontSize = 13.sp, color = Color(0xFFF44336)) - Spacer(Modifier.height(12.dp)) - Text("This CANNOT be undone. The app will restart as freshly installed.", fontWeight = FontWeight.Bold, color = Color(0xFFF44336), fontSize = 13.sp) - } else { - Text("Last chance. Tap 'Delete Everything' to proceed.", fontSize = 14.sp, color = Color(0xFFF44336)) - Spacer(Modifier.height(8.dp)) - Text("All data will be permanently erased.", fontSize = 13.sp) - } - } }, - confirmButton = { - if (resetStep < 2) { - TextButton(onClick = { resetStep = 2 }) { Text("I understand, continue", color = Color(0xFFF44336)) } - } else if (resetStep == 2) { - TextButton(onClick = { onReset(); resetStep = 3 }) { Text("DELETE EVERYTHING", color = Color(0xFFF44336), fontWeight = FontWeight.Bold) } - } else { - TextButton(onClick = { android.os.Process.killProcess(android.os.Process.myPid()) }) { Text("Restart App") } - } - }, - dismissButton = { TextButton(onClick = { showResetDialog = false; resetStep = 0 }) { Text("Cancel") } } - ) - } - - Scaffold( - topBar = { - TopAppBar( - title = { val customTitle = remember { context.getSharedPreferences("app_settings", 0).getString("home_title", "My Private Documents") ?: "My Private Documents" }; Text(customTitle) }, - actions = { - IconButton(onClick = { isRefreshing = true; viewModel.forceRefresh(); refreshScope.launch { kotlinx.coroutines.delay(800); isRefreshing = false } }) { Icon(Icons.Filled.Refresh, "Refresh") } - Box { - IconButton(onClick = { showGearMenu = true }) { Icon(Icons.Filled.Settings, "More") } - DropdownMenu(expanded = showGearMenu, onDismissRequest = { showGearMenu = false }) { - DropdownMenuItem(text = { Text("About") }, onClick = { showGearMenu = false; onAbout() }) - DropdownMenuItem(text = { Text("Feedback") }, onClick = { showGearMenu = false; onFeedback() }) - if (com.app.traveldocs.data.local.FeatureFlags.isExperimentalEnabled(context) && com.app.traveldocs.data.local.FeatureFlags.isBackupRestoreEnabled(context)) DropdownMenuItem(text = { Text("Backup (Preview)") }, onClick = { showGearMenu = false; onBackup() }) - if (com.app.traveldocs.data.local.FeatureFlags.isExperimentalEnabled(context)) DropdownMenuItem(text = { Text("Diagnostics") }, onClick = { showGearMenu = false; onDiagnostics() }) - if (com.app.traveldocs.data.local.FeatureFlags.isExperimentalEnabled(context) && com.app.traveldocs.data.local.FeatureFlags.isBackupRestoreEnabled(context)) DropdownMenuItem(text = { Text("Restore (Preview)") }, onClick = { showGearMenu = false; onRestore() }) - DropdownMenuItem(text = { Text("Review & Classify") }, onClick = { showGearMenu = false; onReview() }) - if (com.app.traveldocs.data.local.FeatureFlags.isExperimentalEnabled(context) && com.app.traveldocs.data.local.FeatureFlags.isWifiShareEnabled(context)) DropdownMenuItem(text = { Text("WiFi Share") }, onClick = { showGearMenu = false; onWebShare() }) - DropdownMenuItem(text = { Text("Settings") }, onClick = { showGearMenu = false; onSettings() }) - DropdownMenuItem(text = { Text("Tags") }, onClick = { showGearMenu = false; onTags() }) - DropdownMenuItem(text = { Text("Reset App", color = Color(0xFFF44336)) }, onClick = { showGearMenu = false; showResetDialog = true }) - } - } } - ) - } - ) { padding -> - Column(modifier = Modifier.fillMaxSize().padding(padding).padding(horizontal = 16.dp)) { - // Pull to refresh indicator - if (isRefreshing) { androidx.compose.material3.LinearProgressIndicator(modifier = Modifier.fillMaxWidth().padding(bottom = 4.dp)) } - androidx.compose.material3.TextButton(onClick = { isRefreshing = true; refreshScope.launch { delay(1000); isRefreshing = false } }, modifier = Modifier.fillMaxWidth().height(4.dp)) {} // Action buttons row - Row(modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)) { - Button(onClick = onImport, modifier = Modifier.weight(1f), colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF1565C0))) { - Icon(Icons.Filled.Add, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Import", fontSize = 13.sp) - } - OutlinedButton(onClick = onAllDocs, modifier = Modifier.weight(1f)) { - Icon(Icons.Filled.Folder, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("All Docs", fontSize = 13.sp) - } - OutlinedButton(onClick = onSearch, modifier = Modifier.weight(1f)) { - Icon(Icons.Filled.Search, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Search", fontSize = 13.sp) - } - } - - // Document count - - // Folder view by tags - // Filter out the internal __PIN_PROTECTED tag from visible folders - val allTags = documents.flatMap { it.tags }.map { it.name }.filter { it != "__PIN_PROTECTED" }.distinct().sorted() - val untaggedDocs = documents.filter { it.tags.isEmpty() || it.tags.all { t -> t.name == "__PIN_PROTECTED" } } - val protectedDocs = documents.filter { doc -> doc.tags.any { it.name == "__PIN_PROTECTED" } } - var selectedTag by remember { mutableStateOf(null) } - - if (selectedTag != null) { - // Show documents in selected folder - val folderDocs = when (selectedTag) { - "__untagged__" -> untaggedDocs - "__protected__" -> protectedDocs - else -> documents.filter { doc -> doc.tags.any { it.name == selectedTag } } - } - val folderTitle = when (selectedTag) { - "__untagged__" -> "Untagged" - "__protected__" -> "Protected" - else -> selectedTag!! - } - Row(Modifier.fillMaxWidth().padding(bottom = 8.dp), verticalAlignment = Alignment.CenterVertically) { - IconButton(onClick = { selectedTag = null }) { Icon(Icons.Filled.ArrowBack, "Back to folders") } - Text(folderTitle, fontWeight = FontWeight.Bold, fontSize = 16.sp) - Spacer(Modifier.weight(1f)) - Text("${folderDocs.size} docs", fontSize = 12.sp, color = Color.Gray) - } - LazyColumn { - items(folderDocs.take(50)) { doc -> - DocCard(doc = doc, onClick = { onDocClick(doc) }) - Spacer(Modifier.height(6.dp)) - } - } - } else { - // Show folder grid - Text("Organized by tags", fontWeight = FontWeight.Bold, fontSize = 16.sp, modifier = Modifier.padding(bottom = 8.dp)) - val columns = 3 - val folders = (if (protectedDocs.isNotEmpty()) listOf("__protected__") else emptyList()) + allTags + (if (untaggedDocs.isNotEmpty()) listOf("__untagged__") else emptyList()) - if (folders.isEmpty()) { - Column(Modifier.fillMaxWidth().padding(vertical = 40.dp), horizontalAlignment = Alignment.CenterHorizontally) { - Icon(Icons.Filled.Description, null, Modifier.size(64.dp), tint = Color.LightGray) - Spacer(Modifier.height(12.dp)) - Text("No documents yet", fontSize = 16.sp, color = Color.Gray) - Text("Tap Import to add your first document", fontSize = 13.sp, color = Color.LightGray) - } - } else { - LazyColumn { - items(folders.chunked(columns).size) { rowIdx -> - val rowFolders = folders.chunked(columns)[rowIdx] - Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { - rowFolders.forEach { tag -> - val label = when (tag) { "__untagged__" -> "Untagged"; "__protected__" -> "Protected"; else -> tag } - val count = when (tag) { "__untagged__" -> untaggedDocs.size; "__protected__" -> protectedDocs.size; else -> documents.count { d -> d.tags.any { it.name == tag } } } - val isProtected = tag == "__protected__" - val isUntagged = tag == "__untagged__" - Card( - Modifier.weight(1f).clickable { selectedTag = tag }, - shape = RoundedCornerShape(12.dp), - elevation = CardDefaults.cardElevation(1.dp), - colors = if (isProtected) CardDefaults.cardColors(containerColor = Color(0xFFFFF3E0)) else CardDefaults.cardColors() - ) { - Column(Modifier.padding(12.dp), horizontalAlignment = Alignment.CenterHorizontally) { - val folderIcon = when { - isProtected -> Icons.Filled.Lock - isUntagged -> Icons.Filled.Folder - else -> Icons.Filled.Folder - } - val folderTint = when { - isProtected -> Color(0xFFE65100) - isUntagged -> Color.Gray - else -> Color(0xFF1565C0) - } - Icon(folderIcon, label, tint = folderTint, modifier = Modifier.size(32.dp)) - Spacer(Modifier.height(4.dp)) - Text(label, fontSize = 12.sp, fontWeight = FontWeight.Medium, maxLines = 1) - Text("$count", fontSize = 11.sp, color = Color.Gray) - } - } - } - repeat(columns - rowFolders.size) { Spacer(Modifier.weight(1f)) } - } - Spacer(Modifier.height(8.dp)) - } - } - } - } } - } -} - -@Composable -private fun DocCard(doc: Document, onClick: () -> Unit) { - Card(modifier = Modifier.fillMaxWidth().clickable(onClick = onClick), shape = RoundedCornerShape(10.dp), elevation = CardDefaults.cardElevation(1.dp)) { - Row(modifier = Modifier.fillMaxWidth().padding(12.dp), verticalAlignment = Alignment.CenterVertically) { - Icon(iconFor(doc.type), doc.type.name, tint = colorFor(doc.type), modifier = Modifier.size(36.dp)) - Spacer(Modifier.width(12.dp)) - Column(Modifier.weight(1f)) { - Text(doc.originalFileName ?: "Document", fontWeight = FontWeight.Medium, fontSize = 14.sp, maxLines = 1) - Text(doc.type.name, fontSize = 12.sp, color = Color.Gray) - if (doc.tags.isNotEmpty()) Text(doc.tags.joinToString(", ") { it.name }, fontSize = 11.sp, color = Color(0xFF1565C0), maxLines = 1) - } - Text("${((doc.extractionConfidence ?: 0f) * 100).toInt()}%", fontSize = 11.sp, color = Color.Gray) - } - } -} - -private fun iconFor(type: DocumentType): ImageVector = when (type) { - DocumentType.PASSPORT -> Icons.Filled.AccountBox - DocumentType.VISA -> Icons.Filled.CreditCard - DocumentType.TICKET -> Icons.Filled.AirplanemodeActive - DocumentType.HOTEL_BOOKING -> Icons.Filled.Hotel - DocumentType.HEALTH_INSURANCE -> Icons.Filled.LocalHospital - DocumentType.UNKNOWN -> Icons.Filled.InsertDriveFile -} - -private fun colorFor(type: DocumentType): Color = when (type) { - DocumentType.PASSPORT -> Color(0xFF1565C0) - DocumentType.VISA -> Color(0xFF4CAF50) - DocumentType.TICKET -> Color(0xFFFF9800) - DocumentType.HOTEL_BOOKING -> Color(0xFF9C27B0) - DocumentType.HEALTH_INSURANCE -> Color(0xFFF44336) - DocumentType.UNKNOWN -> Color.Gray -} - -private fun tagIcon(tag: String): androidx.compose.ui.graphics.vector.ImageVector { - return when (tag.lowercase()) { - "passport" -> androidx.compose.material.icons.Icons.Filled.AccountBox - "visa" -> androidx.compose.material.icons.Icons.Filled.CreditCard - "ticket", "flight" -> androidx.compose.material.icons.Icons.Filled.AirplanemodeActive - "accommodation", "hotel" -> androidx.compose.material.icons.Icons.Filled.Hotel - "health", "insurance" -> androidx.compose.material.icons.Icons.Filled.LocalHospital - "travel", "trip" -> androidx.compose.material.icons.Icons.Filled.FlightTakeoff - "family" -> androidx.compose.material.icons.Icons.Filled.Public - "business", "work" -> androidx.compose.material.icons.Icons.Filled.Description - else -> androidx.compose.material.icons.Icons.Filled.Sell - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/about/AboutScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/about/AboutScreen.kt deleted file mode 100644 index cc2fd3f..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/about/AboutScreen.kt +++ /dev/null @@ -1,143 +0,0 @@ -package com.app.traveldocs.presentation.about - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.unit.sp - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun AboutScreen(onBack: () -> Unit) { - Scaffold(topBar = { TopAppBar(title = { Text("About") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> - Column(Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(16.dp)) { - Text("Document Manager", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = Color(0xFF1565C0)) - Text("Version 1.0", fontSize = 14.sp, color = Color.Gray) - Spacer(Modifier.height(16.dp)) - - Text("A secure, offline-first Android app for families to store, organize, and manage travel documents with OCR-based metadata extraction.", fontSize = 13.sp) - Spacer(Modifier.height(20.dp)) - - SectionTitle("Security") - InfoRow("File Encryption", "AES-256-GCM (Android KeyStore)") - InfoRow("Authentication", "Device Biometrics (fingerprint/face/PIN)") - InfoRow("Backup", "Encrypted ZIP (no plaintext leaves device)") - Spacer(Modifier.height(16.dp)) - - SectionTitle("Bill of Materials") - InfoRow("UI Framework", "Jetpack Compose + Material 3") - InfoRow("Language", "Kotlin 1.9.22") - InfoRow("DI", "Hilt (Dagger) 2.50") - InfoRow("Database", "Room 2.6.1") - InfoRow("OCR Engine", "ML Kit Text Recognition 16.0.0") - InfoRow("Document Scanner", "ML Kit Document Scanner 16.0.0-beta1") - InfoRow("Crypto", "BouncyCastle 1.77 (Argon2id, HKDF)") - InfoRow("Biometric", "AndroidX Biometric 1.1.0") - InfoRow("Drive API", "Google API Services Drive v3") - InfoRow("Build System", "Gradle 8.5, AGP 8.2.2, KSP 1.9.22") - InfoRow("Testing", "JUnit 5, Kotest 5.8.0, MockK 1.13.9") - Spacer(Modifier.height(16.dp)) - - SectionTitle("Acknowledgments") - Text("This app uses the following open-source libraries, all under Apache 2.0 or compatible licenses:", fontSize = 12.sp, color = Color.Gray) - Spacer(Modifier.height(6.dp)) - AckRow("Jetpack Compose", "Google", "Apache 2.0") - AckRow("ML Kit", "Google", "Free, no API key") - AckRow("BouncyCastle", "Legion of the Bouncy Castle", "MIT-like") - AckRow("Room", "Google (AndroidX)", "Apache 2.0") - AckRow("Hilt/Dagger", "Google", "Apache 2.0") - AckRow("Kotest", "Kotest Team", "Apache 2.0") - AckRow("MockK", "MockK Contributors", "Apache 2.0") - AckRow("Material Icons", "Google Fonts", "Apache 2.0") - Spacer(Modifier.height(16.dp)) - - SectionTitle("License") - Text("Apache License 2.0", fontSize = 13.sp, fontWeight = FontWeight.Medium) - Spacer(Modifier.height(4.dp)) - Text("Copyright 2026 Document Manager Contributors. Licensed under the Apache License, Version 2.0. You may obtain a copy at http://www.apache.org/licenses/LICENSE-2.0", fontSize = 11.sp, color = Color.Gray) - Spacer(Modifier.height(8.dp)) - val ctx = LocalContext.current - OutlinedButton(onClick = { val intent = android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse("https://github.com/sethusrinivasan/document-manager/blob/main/LICENSE")); ctx.startActivity(intent) }, modifier = Modifier.fillMaxWidth()) { Text("View Full License Agreement", fontSize = 13.sp) } - Spacer(Modifier.height(16.dp)) - - SectionTitle("Permissions Required") - Text("This app requests the following permissions. All are optional and requested only when the feature is used:", fontSize = 12.sp, color = Color.Gray) - Spacer(Modifier.height(8.dp)) - PermRow("Camera", "Scan documents using phone camera (Take Photo)") - PermRow("Location (Fine/Coarse)", "Tag documents with GPS coordinates on import; optional background GPS tracking") - PermRow("Internet", "Cloud backup (Google Drive, S3); Import from URL; WiFi sharing") - PermRow("Notifications", "GPS tracking foreground service indicator; crash report notification") - PermRow("Foreground Service", "Background GPS location logging (when user enables it in Settings)") - Spacer(Modifier.height(4.dp)) - Text("Denying any permission does not break core functionality. Documents can still be imported, viewed, searched, and shared without any permissions.", fontSize = 11.sp, color = Color.Gray, fontStyle = androidx.compose.ui.text.font.FontStyle.Italic) - Spacer(Modifier.height(16.dp)) - - SectionTitle("Android Auto (Experimental)") - Text("This app supports Android Auto for audio playback (experimental, enable in Settings). When connected to a car head unit:", fontSize = 13.sp) - Spacer(Modifier.height(6.dp)) - InfoRow("Browsing", "Audio files organized by tags appear as folders") - InfoRow("Playback", "Play, pause, skip next/previous via car controls") - InfoRow("Display", "Track name and tags shown on head unit screen") - InfoRow("Requirement", "Import MP3/audio files and they auto-tag as playable media") - Spacer(Modifier.height(8.dp)) - Text("Audio files are decrypted on-the-fly for playback. Only files tagged as audio appear in Android Auto.", fontSize = 11.sp, color = Color.Gray) - Spacer(Modifier.height(24.dp)) - } - } -} - -@Composable -private fun SectionTitle(text: String) { - Text(text, fontWeight = FontWeight.Bold, fontSize = 15.sp) - Spacer(Modifier.height(6.dp)) -} - -@Composable -private fun InfoRow(label: String, value: String) { - Card(Modifier.fillMaxWidth().padding(vertical = 2.dp), colors = CardDefaults.cardColors(containerColor = Color(0xFFF5F5F5))) { - Column(Modifier.padding(10.dp)) { - Text(label, fontSize = 12.sp, color = Color.Gray) - Text(value, fontSize = 13.sp, fontWeight = FontWeight.Medium) - } - } -} - -@Composable -private fun AckRow(name: String, author: String, license: String) { - Text("• $name — $author ($license)", fontSize = 12.sp, color = Color(0xFF424242), modifier = Modifier.padding(vertical = 1.dp)) -} - - -@Composable -private fun PermRow(permission: String, purpose: String) { - Card(Modifier.fillMaxWidth().padding(vertical = 2.dp), colors = CardDefaults.cardColors(containerColor = Color(0xFFFFF8E1))) { - Row(Modifier.padding(10.dp)) { - Text(permission, fontWeight = FontWeight.Medium, fontSize = 12.sp, modifier = Modifier.width(120.dp)) - Text(purpose, fontSize = 12.sp, color = Color(0xFF616161)) - } - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/auth/PinEntryScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/auth/PinEntryScreen.kt deleted file mode 100644 index c0c2c46..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/auth/PinEntryScreen.kt +++ /dev/null @@ -1,72 +0,0 @@ -package com.app.traveldocs.presentation.auth - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Lock -import androidx.compose.material3.Button -import androidx.compose.material3.Icon -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -@Composable -fun PinEntryScreen(onPinSubmit: (String) -> Unit, error: String? = null, isLocked: Boolean = false, lockSeconds: Int = 0) { - var pin by remember { mutableStateOf("") } - - Column( - modifier = Modifier.fillMaxSize().padding(32.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center - ) { - Icon(Icons.Filled.Lock, null, modifier = Modifier.size(64.dp), tint = Color(0xFF1565C0)) - Spacer(Modifier.height(24.dp)) - Text("Enter PIN", fontSize = 22.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(8.dp)) - Text("Unlock your documents", fontSize = 14.sp, color = Color.Gray) - Spacer(Modifier.height(32.dp)) - - if (isLocked) { - Text("Account locked", color = Color.Red, fontWeight = FontWeight.Bold) - Text("Try again in ${lockSeconds}s", color = Color.Gray, fontSize = 13.sp) - Spacer(Modifier.height(16.dp)) - } - - OutlinedTextField( - value = pin, - onValueChange = { if (it.length <= 8) pin = it.filter { c -> c.isDigit() } }, - label = { Text("PIN") }, - visualTransformation = PasswordVisualTransformation(), - singleLine = true, - enabled = !isLocked, - modifier = Modifier.fillMaxWidth().padding(horizontal = 48.dp) - ) - - if (error != null) { - Spacer(Modifier.height(8.dp)) - Text(error, color = Color.Red, fontSize = 13.sp) - } - - Spacer(Modifier.height(24.dp)) - Button(onClick = { onPinSubmit(pin); pin = "" }, enabled = pin.length >= 4 && !isLocked, modifier = Modifier.fillMaxWidth().padding(horizontal = 48.dp)) { - Text("Unlock") - } - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/backup/BackupScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/backup/BackupScreen.kt deleted file mode 100644 index 2f2d691..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/backup/BackupScreen.kt +++ /dev/null @@ -1,410 +0,0 @@ -package com.app.traveldocs.presentation.backup - -import android.app.Activity -import android.content.Context -import android.net.Uri -import androidx.activity.compose.rememberLauncherForActivityResult -import androidx.activity.result.contract.ActivityResultContracts -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.CheckCircle -import androidx.compose.material.icons.filled.Cloud -import androidx.compose.material.icons.filled.Error -import androidx.compose.material.icons.filled.Folder -import androidx.compose.material.icons.filled.RestoreFromTrash -import androidx.compose.material.icons.filled.Storage -import androidx.compose.material3.AlertDialog -import androidx.compose.material3.Button -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TextButton -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.PasswordVisualTransformation -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import androidx.documentfile.provider.DocumentFile -import com.app.traveldocs.data.backup.BackupManager -import com.app.traveldocs.data.backup.BackupRestore -import com.app.traveldocs.data.backup.S3BackupUploader -import com.app.traveldocs.data.backup.S3Config -import com.app.traveldocs.data.drive.GoogleDriveServiceProvider -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.debug.UsageTelemetry -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.android.gms.auth.api.signin.GoogleSignInOptions -import com.google.android.gms.common.api.Scope -import com.google.api.client.http.FileContent -import com.google.api.services.drive.DriveScopes -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import com.google.api.services.drive.model.File as DriveFile - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun BackupScreen(onBack: () -> Unit, mode: String = "backup") { - val context = LocalContext.current - val scope = rememberCoroutineScope() - val backupManager = remember { BackupManager() } - var screenState by remember { mutableStateOf(if (mode == "restore") "restore_pick" else "choose") } - var resultMessage by remember { mutableStateOf("") } - var resultIsError by remember { mutableStateOf(false) } - var showS3Dialog by remember { mutableStateOf(false) } - var showPinDialog by remember { mutableStateOf(false) } - var backupPin by remember { mutableStateOf("") } - var pendingBackupUri by remember { mutableStateOf(null) } - var pendingRestoreUri by remember { mutableStateOf(null) } - var showRestorePinDialog by remember { mutableStateOf(false) } - var restorePin by remember { mutableStateOf("") } - val folderPicker = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri: Uri? -> - if (uri != null) { - pendingBackupUri = uri; showPinDialog = true } - } - - val restorePicker = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri: Uri? -> - if (uri != null) { - pendingRestoreUri = uri - showRestorePinDialog = true - } - } - - // Restore PIN dialog - shown before restore to ask for backup password - if (showRestorePinDialog && pendingRestoreUri != null) { - androidx.compose.material3.AlertDialog( - onDismissRequest = { showRestorePinDialog = false; pendingRestoreUri = null }, - title = { androidx.compose.material3.Text("Backup Password") }, - text = { Column { - androidx.compose.material3.Text("Enter the backup password to restore.", fontSize = 13.sp, color = Color.Gray) - Spacer(Modifier.height(4.dp)) - androidx.compose.material3.Text("All backups are password-protected. This is required.", fontSize = 12.sp, color = Color(0xFFF44336)) - Spacer(Modifier.height(12.dp)) - androidx.compose.material3.OutlinedTextField(value = restorePin, onValueChange = { restorePin = it }, label = { androidx.compose.material3.Text("Backup Password (required)") }, singleLine = true, modifier = Modifier.fillMaxWidth(), - visualTransformation = if (restorePin.isNotEmpty()) androidx.compose.ui.text.input.PasswordVisualTransformation() else androidx.compose.ui.text.input.VisualTransformation.None) - } }, - confirmButton = { androidx.compose.material3.TextButton(onClick = { - showRestorePinDialog = false - val pin = restorePin - val uri = pendingRestoreUri!! - restorePin = "" - pendingRestoreUri = null - screenState = "running" - scope.launch { doRestore(context, uri, pin) { msg, err -> resultMessage = msg; resultIsError = err; screenState = "done" } } - }, enabled = restorePin.isNotBlank()) { androidx.compose.material3.Text("Restore") } }, - dismissButton = { androidx.compose.material3.TextButton(onClick = { showRestorePinDialog = false; pendingRestoreUri = null; restorePin = "" }) { androidx.compose.material3.Text("Cancel") } } - ) - } - - val driveSignIn = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - screenState = "running" - scope.launch { driveBackup(context, backupManager) { msg, err -> resultMessage = msg; resultIsError = err; screenState = "done" } } - } else { resultMessage = "Google Sign-In cancelled"; resultIsError = true; screenState = "done" } - } - - - // Backup PIN dialog - if (showPinDialog) { - var pinInput by remember { mutableStateOf("") } - AlertDialog(onDismissRequest = { showPinDialog = false }, title = { Text("Set Backup PIN") }, text = { - Column { - Text("This PIN protects your backup. You will need it to restore on any device.", fontSize = 12.sp, color = Color.Gray) - Spacer(Modifier.height(8.dp)) - OutlinedTextField(value = pinInput, onValueChange = { if (it.length <= 8) pinInput = it.filter { c -> c.isDigit() } }, label = { Text("PIN (4-8 digits)") }, singleLine = true, modifier = Modifier.fillMaxWidth(), visualTransformation = PasswordVisualTransformation()) - } - }, confirmButton = { TextButton(onClick = { - backupPin = pinInput; showPinDialog = false; screenState = "running" - val uri = pendingBackupUri - if (uri != null) scope.launch { localBackup(context, backupManager, uri, backupPin) { msg, err -> resultMessage = msg; resultIsError = err; screenState = "done" } } - }, enabled = pinInput.length >= 4) { Text("Create Backup") } }, dismissButton = { TextButton(onClick = { showPinDialog = false }) { Text("Cancel") } }) - } // S3 config dialog - if (showS3Dialog) { - var isEmulator by remember { mutableStateOf(true) } - var usePresigned by remember { mutableStateOf(false) } - var presignedUrl by remember { mutableStateOf("") } - var endpoint by remember { mutableStateOf("http://10.0.0.126:9000") } - var bucket by remember { mutableStateOf("test-backup-bucket") } - var accessKey by remember { mutableStateOf("testkey") } - var secretKey by remember { mutableStateOf("testsecret") } - var region by remember { mutableStateOf("us-east-1") } - AlertDialog(onDismissRequest = { showS3Dialog = false }, title = { Text("S3 Configuration") }, text = { - Column { - Text("Target", fontSize = 12.sp, fontWeight = FontWeight.SemiBold) - Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - androidx.compose.material3.RadioButton(selected = isEmulator, onClick = { - isEmulator = true - endpoint = "http://10.0.0.126:9000"; bucket = "test-backup-bucket"; accessKey = "testkey"; secretKey = "testsecret"; region = "us-east-1" - }) - Text("Local Emulator", fontSize = 13.sp, modifier = Modifier.weight(1f)) - androidx.compose.material3.RadioButton(selected = !isEmulator, onClick = { - isEmulator = false - endpoint = "https://s3.amazonaws.com"; bucket = ""; accessKey = ""; secretKey = "" - }) - Text("AWS S3", fontSize = 13.sp) - } - if (isEmulator) { Text("Auto-configured for emulator at 10.0.0.126:9000", fontSize = 10.sp, color = Color(0xFF4CAF50)) } - Spacer(Modifier.height(8.dp)) - Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Text("Use Presigned URL", modifier = Modifier.weight(1f), fontSize = 13.sp) - androidx.compose.material3.Switch(checked = usePresigned, onCheckedChange = { usePresigned = it }) - } - Spacer(Modifier.height(6.dp)) - if (usePresigned) { - Text("Paste a presigned PUT URL.", fontSize = 11.sp, color = Color.Gray) - OutlinedTextField(value = presignedUrl, onValueChange = { presignedUrl = it }, label = { Text("Presigned URL") }, singleLine = false, maxLines = 3, modifier = Modifier.fillMaxWidth()) - } else { - OutlinedTextField(value = endpoint, onValueChange = { endpoint = it }, label = { Text("Endpoint") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - Spacer(Modifier.height(4.dp)) - OutlinedTextField(value = bucket, onValueChange = { bucket = it }, label = { Text("Bucket") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - Spacer(Modifier.height(4.dp)) - OutlinedTextField(value = region, onValueChange = { region = it }, label = { Text("Region") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - Spacer(Modifier.height(4.dp)) - OutlinedTextField(value = accessKey, onValueChange = { accessKey = it }, label = { Text("Access Key") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - Spacer(Modifier.height(4.dp)) - OutlinedTextField(value = secretKey, onValueChange = { secretKey = it }, label = { Text("Secret Key") }, singleLine = true, modifier = Modifier.fillMaxWidth(), visualTransformation = PasswordVisualTransformation()) - } - } - }, confirmButton = { TextButton(onClick = { - showS3Dialog = false; screenState = "running" - if (usePresigned) { - scope.launch { presignedUpload(context, backupManager, presignedUrl.trim()) { msg, err -> resultMessage = msg; resultIsError = err; screenState = "done" } } - } else { - val cfg = S3Config(endpoint.trim(), bucket.trim(), accessKey.trim(), secretKey.trim(), region.trim()) - scope.launch { s3Backup(context, backupManager, cfg) { msg, err -> resultMessage = msg; resultIsError = err; screenState = "done" } } - } - }) { Text("Upload") } }, dismissButton = { TextButton(onClick = { showS3Dialog = false }) { Text("Cancel") } }) - } - Scaffold(topBar = { TopAppBar(title = { Text(if (mode == "restore") "Restore" else "Backup") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> - Column(Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(16.dp)) { - when (screenState) { - "choose" -> { - Text("Backup", fontSize = 18.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(6.dp)) - Text("Encrypted files packaged into ZIP. No plaintext leaves device.", fontSize = 12.sp, color = Color.Gray) - Spacer(Modifier.height(12.dp)) - OptionCard(Icons.Filled.Folder, "Local Folder", "Save to phone storage", Color(0xFF4CAF50)) { folderPicker.launch(null) } - Spacer(Modifier.height(8.dp)) - if (com.app.traveldocs.data.local.FeatureFlags.isGoogleDriveEnabled(context)) OptionCard(Icons.Filled.Cloud, "Google Drive", "Sign in and upload to Drive", Color(0xFF1565C0)) { - val account = GoogleSignIn.getLastSignedInAccount(context) - if (account != null) { screenState = "running"; scope.launch { driveBackup(context, backupManager) { msg, err -> resultMessage = msg; resultIsError = err; screenState = "done" } } } - else { - val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().requestScopes(Scope(DriveScopes.DRIVE_FILE)).build() - driveSignIn.launch(GoogleSignIn.getClient(context, gso).signInIntent) - } - } - Spacer(Modifier.height(8.dp)) - if (com.app.traveldocs.data.local.FeatureFlags.isS3Enabled(context)) OptionCard(Icons.Filled.Storage, "S3 Compatible", "AWS S3, MinIO, Backblaze B2", Color(0xFFFF9800)) { showS3Dialog = true } - Spacer(Modifier.height(24.dp)) - Text("Restore", fontSize = 18.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(6.dp)) - Text("Select a backup ZIP to restore encrypted documents.", fontSize = 12.sp, color = Color.Gray) - Spacer(Modifier.height(12.dp)) - OptionCard(Icons.Filled.RestoreFromTrash, "Restore from Backup", "Pick a backup ZIP file", Color(0xFF795548)) { restorePicker.launch("application/zip") } - } - "running" -> Column(Modifier.fillMaxWidth().padding(vertical = 48.dp), horizontalAlignment = Alignment.CenterHorizontally) { CircularProgressIndicator(Modifier.size(48.dp)); Spacer(Modifier.height(16.dp)); Text("Working...") } - "done" -> Column(Modifier.fillMaxWidth().padding(vertical = 32.dp), horizontalAlignment = Alignment.CenterHorizontally) { - Icon(if (resultIsError) Icons.Filled.Error else Icons.Filled.CheckCircle, null, Modifier.size(64.dp), tint = if (resultIsError) Color(0xFFF44336) else Color(0xFF4CAF50)) - Spacer(Modifier.height(16.dp)); Text(if (resultIsError) "Failed" else "Done", fontSize = 18.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(8.dp)); Text(resultMessage, fontSize = 13.sp, color = Color.Gray) - Spacer(Modifier.height(24.dp)); Button(onClick = { screenState = "choose"; resultIsError = false }) { Text("OK") } - } - } - } - } -} - -private suspend fun localBackup(context: Context, mgr: BackupManager, uri: Uri, pin: String, done: (String, Boolean) -> Unit) = withContext(Dispatchers.IO) { - try { - UsageTelemetry.funnelStart("backup_local") - DebugLogger.i("Backup", "=== LOCAL BACKUP STARTED ===") - DebugLogger.i("Backup", "Target folder URI: $uri") - DebugLogger.i("Backup", "PIN protected: ${pin.isNotEmpty()}") - - val r = mgr.createBackupZip(context, if (pin.isNotEmpty()) pin else null) - DebugLogger.i("Backup", "ZIP created: ${r.fileCount} files, ${r.totalBytes/1024}KB") - - val folder = DocumentFile.fromTreeUri(context, uri) - val fileName = mgr.suggestedFileName() - val out = folder?.createFile("application/zip", fileName) - if (out != null) { - context.contentResolver.openOutputStream(out.uri)?.use { os -> r.zipFile.inputStream().use { it.copyTo(os) } } - r.zipFile.delete() - UsageTelemetry.funnelComplete("backup_local") - - val report = buildString { - appendLine("=== Backup Report ===") - appendLine("File: $fileName") - appendLine("Documents: ${r.fileCount}") - appendLine("Total size: ${r.totalBytes / 1024}KB") - appendLine("Protected: ${if (pin.isNotEmpty()) "Yes (PIN-encrypted ZIP)" else "No"}") - appendLine("Location: ${folder.name}/") - appendLine("Completed: ${java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", java.util.Locale.US).format(java.util.Date())}") - } - DebugLogger.i("Backup", report) - done(report, false) - } else { - DebugLogger.e("Backup", "Failed to create file in target folder") - done("Failed to create file in folder", true) - } - } catch (e: Exception) { - DebugLogger.e("Backup", "Backup failed", e) - done("Backup error: ${e.message}", true) - } -} - -private suspend fun driveBackup(context: Context, mgr: BackupManager, done: (String, Boolean) -> Unit) = withContext(Dispatchers.IO) { - try { - UsageTelemetry.funnelStart("backup_drive") - val provider = GoogleDriveServiceProvider(context) - val service = provider.getDriveService() - if (service == null) { done("Not signed in to Google Drive", true); return@withContext } - val r = mgr.createBackupZip(context) - val metadata = DriveFile().apply { name = mgr.suggestedFileName(); mimeType = "application/zip" } - val content = FileContent("application/zip", r.zipFile) - val uploaded = service.files().create(metadata, content).setFields("id,name").execute() - r.zipFile.delete() - DebugLogger.i("DriveBackup", "Uploaded: ${uploaded.name} (id=${uploaded.id})") - UsageTelemetry.funnelComplete("backup_drive") - done("Uploaded to Drive: ${uploaded.name}", false) - } catch (e: Exception) { DebugLogger.e("DriveBackup", "Failed", e); done("Drive error: ${e.message}", true) } -} - -private suspend fun s3Backup(context: Context, mgr: BackupManager, config: S3Config, done: (String, Boolean) -> Unit) = withContext(Dispatchers.IO) { - try { - UsageTelemetry.funnelStart("backup_s3") - val r = mgr.createBackupZip(context) - val result = S3BackupUploader.upload(r.zipFile, mgr.suggestedFileName(), config) - r.zipFile.delete() - result.onSuccess { UsageTelemetry.funnelComplete("backup_s3"); done(it, false) } - result.onFailure { done("S3 error: ${it.message}", true) } - } catch (e: Exception) { done("S3 error: ${e.message}", true) } -} - -private suspend fun doRestore(context: Context, uri: Uri, password: String?, done: (String, Boolean) -> Unit) = withContext(Dispatchers.IO) { - try { - DebugLogger.i("Restore", "=== RESTORE STARTED ===") - DebugLogger.i("Restore", "Source URI: $uri") - DebugLogger.i("Restore", "Password provided: ${password != null}") - - val bytes = context.contentResolver.openInputStream(uri)?.use { it.readBytes() } - if (bytes == null) { DebugLogger.e("Restore", "Cannot read backup file from URI"); done("Cannot read backup file", true); return@withContext } - DebugLogger.i("Restore", "Read ${bytes.size / 1024}KB from source") - - val tempZip = java.io.File(context.cacheDir, "restore_temp.zip") - tempZip.writeBytes(bytes) - - // Step 1: Inspect manifest BEFORE restoring - DebugLogger.i("Restore", "--- Step 1: Inspecting backup ---") - val inspection = BackupRestore.inspectBackup(context, tempZip, password) - if (!inspection.valid) { - tempZip.delete() - DebugLogger.e("Restore", "Inspection failed: ${inspection.errorMessage}") - done("Invalid backup: ${inspection.errorMessage}", true) - return@withContext - } - DebugLogger.i("Restore", "Inspection OK: schema=${inspection.schemaVersion}, files=${inspection.fileCount}, size=${inspection.totalSizeBytes/1024}KB, pinProtected=${inspection.pinProtectedCount}") - - // Step 2: Execute restore - DebugLogger.i("Restore", "--- Step 2: Restoring files ---") - val result = BackupRestore.restoreFromZip(context, tempZip, password) - tempZip.delete() - - // Step 3: Report - DebugLogger.i("Restore", "--- Step 3: Report ---") - val report = buildString { - appendLine("=== Restore Report ===") - appendLine("Backup: schema v${inspection.schemaVersion}, from ${inspection.timestamp}") - appendLine("Expected: ${inspection.fileCount} documents (${inspection.totalSizeBytes/1024}KB)") - appendLine("PIN-protected docs: ${inspection.pinProtectedCount}") - appendLine("") - appendLine("Processed: ${result.filesProcessed}") - appendLine("Restored: ${result.filesRestored}") - appendLine("Failed: ${result.filesFailedVerification}") - appendLine("Status: ${if (result.success) "SUCCESS" else "FAILED"}") - if (result.filesRestored < result.filesProcessed) { - appendLine("") - appendLine("WARNING: ${result.filesProcessed - result.filesRestored} of ${result.filesProcessed} document files not restored") - } - appendLine("") - appendLine("Tap Refresh on home page to see restored documents.") - } - DebugLogger.i("Restore", report) - - if (result.success) { - done(report + "\n\nApp will restart to load restored data...", false) - // Must restart: Room's Hilt singleton holds a stale DB connection. - // No way to swap DB file under a live Room connection without restart. - android.os.Handler(android.os.Looper.getMainLooper()).postDelayed({ - DebugLogger.i("Restore", "Restarting app to load restored database") - android.os.Process.killProcess(android.os.Process.myPid()) - }, 3000) - } else { - done("Restore failed: ${result.message}", true) - } - } catch (e: Exception) { - DebugLogger.e("Restore", "Restore exception: ${e.message}", e) - done("Restore error: ${e.message}", true) - } -} - -private suspend fun presignedUpload(context: android.content.Context, mgr: com.app.traveldocs.data.backup.BackupManager, presignedUrl: String, done: (String, Boolean) -> Unit) = kotlinx.coroutines.withContext(kotlinx.coroutines.Dispatchers.IO) { - try { - com.app.traveldocs.debug.DebugLogger.i("S3Presigned", "Uploading to presigned URL") - com.app.traveldocs.debug.UsageTelemetry.funnelStart("backup_s3_presigned") - val r = mgr.createBackupZip(context) - val bytes = r.zipFile.readBytes() - val conn = java.net.URL(presignedUrl).openConnection() as java.net.HttpURLConnection - conn.requestMethod = "PUT" - conn.setRequestProperty("Content-Type", "application/zip") - conn.setRequestProperty("Content-Length", bytes.size.toString()) - conn.doOutput = true - conn.outputStream.use { it.write(bytes) } - val code = conn.responseCode - r.zipFile.delete() - if (code in 200..299) { - com.app.traveldocs.debug.UsageTelemetry.funnelComplete("backup_s3_presigned") - done("Uploaded via presigned URL (HTTP $code)", false) - } else { done("Upload failed: HTTP $code", true) } - } catch (e: Exception) { done("Error: ${e.message}", true) } -} - -@Composable -private fun OptionCard(icon: androidx.compose.ui.graphics.vector.ImageVector, title: String, subtitle: String, iconColor: androidx.compose.ui.graphics.Color, onClick: () -> Unit) { - androidx.compose.material3.Card(androidx.compose.ui.Modifier.fillMaxWidth().clickable(onClick = onClick), shape = RoundedCornerShape(12.dp), elevation = CardDefaults.cardElevation(2.dp)) { - Row(androidx.compose.ui.Modifier.fillMaxWidth().padding(16.dp), verticalAlignment = Alignment.CenterVertically) { - Icon(icon, title, tint = iconColor, modifier = androidx.compose.ui.Modifier.size(32.dp)); Spacer(androidx.compose.ui.Modifier.width(14.dp)) - Column { Text(title, fontWeight = FontWeight.SemiBold, fontSize = 15.sp); Text(subtitle, fontSize = 12.sp, color = Color.Gray) } - } - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/UrlImportScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/documents/UrlImportScreen.kt deleted file mode 100644 index cacddf6..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/UrlImportScreen.kt +++ /dev/null @@ -1,198 +0,0 @@ -package com.app.traveldocs.presentation.documents - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.CheckCircle -import androidx.compose.material.icons.filled.Error -import androidx.compose.material3.Button -import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.LinearProgressIndicator -import androidx.compose.material3.OutlinedButton -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text -import androidx.compose.material3.Icon -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.DocumentFormat -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext -import java.net.HttpURLConnection -import java.net.URL - -/** - * Import a document from an HTTP/HTTPS URL. - * - * User pastes a URL, we download it in the background, detect the format - * from the URL extension or content-type header, and feed it into the - * standard import pipeline. - * - * This is gated behind the experimental features flag. - */ -@Composable -fun UrlImportSection( - importViewModel: ImportViewModel, - onDone: () -> Unit, - onBack: () -> Unit -) { - var url by remember { mutableStateOf("https://github.com/robyoung/dicom-test-files/blob/master/data/pydicom/693_J2KI.dcm") } - var downloading by remember { mutableStateOf(false) } - var error by remember { mutableStateOf(null) } - var success by remember { mutableStateOf(false) } - val scope = rememberCoroutineScope() - - Column( - modifier = Modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - if (success) { - Spacer(Modifier.height(40.dp)) - Icon(Icons.Filled.CheckCircle, null, tint = Color(0xFF4CAF50), modifier = Modifier.size(64.dp)) - Spacer(Modifier.height(16.dp)) - Text("Downloaded & Imported!", fontSize = 18.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(24.dp)) - Button(onClick = onDone, modifier = Modifier.fillMaxWidth()) { Text("Done") } - } else { - Text("Import from URL", fontSize = 18.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(8.dp)) - Text("Paste a direct link to a file (PDF, image, DICOM, etc.)", fontSize = 13.sp, color = Color.Gray) - Spacer(Modifier.height(16.dp)) - - OutlinedTextField( - value = url, - onValueChange = { url = it; error = null }, - label = { Text("File URL") }, - placeholder = { Text("https://example.com/document.pdf") }, - singleLine = true, - modifier = Modifier.fillMaxWidth() - ) - - if (error != null) { - Spacer(Modifier.height(8.dp)) - Text(error!!, color = Color(0xFFF44336), fontSize = 13.sp) - } - - Spacer(Modifier.height(16.dp)) - - if (downloading) { - LinearProgressIndicator(modifier = Modifier.fillMaxWidth()) - Spacer(Modifier.height(8.dp)) - Text("Downloading...", fontSize = 13.sp, color = Color.Gray) - } else { - Button( - onClick = { - if (url.isBlank() || (!url.startsWith("http://") && !url.startsWith("https://"))) { - error = "Enter a valid HTTP or HTTPS URL" - return@Button - } - downloading = true - error = null - scope.launch { - val result = downloadAndImport(url.trim(), importViewModel) - downloading = false - if (result == null) { - success = true - } else { - error = result - } - } - }, - enabled = url.isNotBlank(), - modifier = Modifier.fillMaxWidth() - ) { Text("Download & Import") } - } - - Spacer(Modifier.height(12.dp)) - OutlinedButton(onClick = onBack, modifier = Modifier.fillMaxWidth()) { Text("Back") } - } - } -} - -/** - * Downloads a file from a URL and imports it. - * Returns null on success, or an error message string on failure. - */ -private suspend fun downloadAndImport(urlStr: String, importViewModel: ImportViewModel): String? { - return withContext(Dispatchers.IO) { - try { - DebugLogger.i("UrlImport", "Downloading: $urlStr") - - // Handle GitHub blob URLs — convert to raw - val actualUrl = if (urlStr.contains("github.com") && urlStr.contains("/blob/")) { - urlStr.replace("github.com", "raw.githubusercontent.com").replace("/blob/", "/") - } else { - urlStr - } - - val connection = URL(actualUrl).openConnection() as HttpURLConnection - connection.connectTimeout = 30000 - connection.readTimeout = 60000 - connection.instanceFollowRedirects = true - connection.connect() - - val responseCode = connection.responseCode - if (responseCode != 200) { - return@withContext "Server returned HTTP $responseCode" - } - - val bytes = connection.inputStream.use { it.readBytes() } - if (bytes.isEmpty()) { - return@withContext "Downloaded file is empty" - } - - DebugLogger.i("UrlImport", "Downloaded ${bytes.size} bytes") - - // Determine format from URL extension or content-type - val contentType = connection.contentType ?: "" - val fileName = actualUrl.substringAfterLast('/').substringBefore('?').ifEmpty { "download" } - val format = detectFormat(fileName, contentType) - - connection.disconnect() - - // Import via the standard pipeline (on main thread for ViewModel access) - withContext(Dispatchers.Main) { - importViewModel.importFromBytes(bytes, format, fileName) - } - - DebugLogger.i("UrlImport", "Import triggered for: $fileName ($format)") - null // success - } catch (e: Exception) { - DebugLogger.e("UrlImport", "Download failed", e) - "Download failed: ${e.message}" - } - } -} - -private fun detectFormat(fileName: String, contentType: String): DocumentFormat { - val ext = fileName.substringAfterLast('.', "").lowercase() - return when { - ext == "pdf" || contentType.contains("pdf") -> DocumentFormat.PDF - ext == "png" || contentType.contains("png") -> DocumentFormat.PNG - ext in listOf("jpg", "jpeg") || contentType.contains("jpeg") -> DocumentFormat.JPG - ext == "webp" || contentType.contains("webp") -> DocumentFormat.WEBP - ext in listOf("heic", "heif") -> DocumentFormat.HEIC - ext == "bmp" -> DocumentFormat.BMP - ext == "gif" || contentType.contains("gif") -> DocumentFormat.GIF - ext == "dcm" || ext == "dicom" || contentType.contains("dicom") -> DocumentFormat.DICOM - contentType.contains("video") -> DocumentFormat.VIDEO - ext in listOf("mp3", "m4a", "wav", "ogg", "flac") || contentType.contains("audio") -> DocumentFormat.AUDIO - else -> DocumentFormat.UNKNOWN // unsupported format, import as generic file - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/feedback/FeedbackScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/feedback/FeedbackScreen.kt deleted file mode 100644 index 922b7d4..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/feedback/FeedbackScreen.kt +++ /dev/null @@ -1,162 +0,0 @@ -package com.app.traveldocs.presentation.feedback - -import android.content.Context -import android.content.Intent -import android.os.Build -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.Button -import androidx.compose.material3.Checkbox -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.app.traveldocs.debug.DebugLogger - -/** - * In-app feedback form. - * - * User types their feedback, optionally includes device info, then taps Send. - * This opens the system email client with the feedback pre-filled — nothing is - * sent silently. The user sees exactly what will be sent and must hit Send in - * their email app to actually transmit it. - * - * No data leaves the device without the user's explicit action in their email client. - */ -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun FeedbackScreen(onBack: () -> Unit) { - val context = LocalContext.current - var feedbackText by remember { mutableStateOf("") } - var includeDeviceInfo by remember { mutableStateOf(true) } - var sent by remember { mutableStateOf(false) } - - Scaffold( - topBar = { - TopAppBar( - title = { Text("Send Feedback") }, - navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } } - ) - } - ) { padding -> - Column( - modifier = Modifier.fillMaxSize().padding(padding).padding(16.dp) - ) { - if (sent) { - Spacer(Modifier.height(32.dp)) - Text("Thank you!", fontSize = 20.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(8.dp)) - Text( - "Your email app should have opened with the feedback. " + - "Please hit Send in your email app to deliver it to the developer.", - fontSize = 14.sp, color = Color.Gray - ) - Spacer(Modifier.height(24.dp)) - Button(onClick = onBack, modifier = Modifier.fillMaxWidth()) { Text("Done") } - } else { - Text( - "We'd love to hear from you", - fontSize = 18.sp, fontWeight = FontWeight.SemiBold - ) - Spacer(Modifier.height(4.dp)) - Text( - "Bug reports, feature ideas, or general feedback — all welcome. " + - "This will open your email app so you can review before sending.", - fontSize = 13.sp, color = Color.Gray - ) - - Spacer(Modifier.height(16.dp)) - - OutlinedTextField( - value = feedbackText, - onValueChange = { feedbackText = it }, - label = { Text("Your feedback") }, - placeholder = { Text("Describe the issue or suggestion...") }, - modifier = Modifier.fillMaxWidth().height(200.dp), - maxLines = 12 - ) - - Spacer(Modifier.height(12.dp)) - - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox(checked = includeDeviceInfo, onCheckedChange = { includeDeviceInfo = it }) - Text("Include device info (model, Android version, app version)", fontSize = 13.sp) - } - - Spacer(Modifier.height(8.dp)) - Text( - "Nothing is sent automatically. Your email app will open so you can review the message before sending.", - fontSize = 11.sp, color = Color.Gray - ) - - Spacer(Modifier.height(16.dp)) - - Button( - onClick = { - sendFeedbackEmail(context, feedbackText, includeDeviceInfo) - sent = true - }, - enabled = feedbackText.isNotBlank(), - modifier = Modifier.fillMaxWidth() - ) { - Text("Open Email to Send") - } - } - } - } -} - -private fun sendFeedbackEmail(context: Context, feedback: String, includeDevice: Boolean) { - val deviceInfo = if (includeDevice) { - buildString { - appendLine("\n\n--- Device Info ---") - appendLine("Device: ${Build.MANUFACTURER} ${Build.MODEL}") - appendLine("Android: ${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})") - appendLine("App: Document Manager") - try { - val pInfo = context.packageManager.getPackageInfo(context.packageName, 0) - appendLine("Version: ${pInfo.versionName} (${pInfo.longVersionCode})") - } catch (_: Exception) {} - } - } else "" - - val body = feedback + deviceInfo - - val emailIntent = Intent(Intent.ACTION_SEND).apply { - type = "message/rfc822" - putExtra(Intent.EXTRA_EMAIL, arrayOf("developer@documentmanager.app")) - putExtra(Intent.EXTRA_SUBJECT, "Document Manager — User Feedback") - putExtra(Intent.EXTRA_TEXT, body) - } - - try { - context.startActivity(Intent.createChooser(emailIntent, "Send feedback via").apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - }) - DebugLogger.i("Feedback", "Email intent launched (${feedback.length} chars)") - } catch (e: Exception) { - DebugLogger.e("Feedback", "Failed to launch email", e) - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/onboarding/ConsentScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/onboarding/ConsentScreen.kt deleted file mode 100644 index d82137f..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/onboarding/ConsentScreen.kt +++ /dev/null @@ -1,100 +0,0 @@ -package com.app.traveldocs.presentation.onboarding - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Button -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.Checkbox -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -@Composable -fun ConsentScreen(onConsented: (pin: String, phone: String, email: String) -> Unit) { - var pin by remember { mutableStateOf("") } - var pinConfirm by remember { mutableStateOf("") } - var phone by remember { mutableStateOf("") } - var email by remember { mutableStateOf("") } - var termsAccepted by remember { mutableStateOf(false) } - var pinWarningAcked by remember { mutableStateOf(false) } - - val pinValid = pin.length in 4..8 && pin == pinConfirm - val canProceed = pinValid && termsAccepted && pinWarningAcked - - Column( - modifier = Modifier.fillMaxSize().verticalScroll(rememberScrollState()).padding(24.dp) - ) { - Spacer(Modifier.height(32.dp)) - Text("Welcome", fontSize = 26.sp, fontWeight = FontWeight.Bold, color = Color(0xFF1565C0)) - Text("Document Manager", fontSize = 16.sp, color = Color.Gray) - Spacer(Modifier.height(24.dp)) - - Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = Color(0xFFE3F2FD))) { - Column(modifier = Modifier.padding(16.dp)) { - Text("Your documents will be encrypted with AES-256 and protected by a PIN.", fontSize = 13.sp) - Spacer(Modifier.height(8.dp)) - Text("All data stays on this device. No cloud, no servers.", fontSize = 13.sp) - } - } - - Spacer(Modifier.height(20.dp)) - Text("Create your PIN", fontWeight = FontWeight.SemiBold, fontSize = 15.sp) - Spacer(Modifier.height(8.dp)) - OutlinedTextField(value = pin, onValueChange = { if (it.length <= 8) pin = it.filter { c -> c.isDigit() } }, label = { Text("PIN (4-8 digits)") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - Spacer(Modifier.height(8.dp)) - OutlinedTextField(value = pinConfirm, onValueChange = { if (it.length <= 8) pinConfirm = it.filter { c -> c.isDigit() } }, label = { Text("Confirm PIN") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - if (pin.isNotEmpty() && pinConfirm.isNotEmpty() && pin != pinConfirm) { - Text("PINs do not match", color = Color.Red, fontSize = 12.sp) - } - - Spacer(Modifier.height(20.dp)) - Text("Recovery contacts (for security alerts)", fontWeight = FontWeight.SemiBold, fontSize = 15.sp) - Spacer(Modifier.height(8.dp)) - com.app.traveldocs.presentation.common.PhoneInputWithCountryCode(fullPhone = phone, onPhoneChange = { phone = it }, label = "Phone number") - Spacer(Modifier.height(8.dp)) - OutlinedTextField(value = email, onValueChange = { email = it }, label = { Text("Email address") }, singleLine = true, modifier = Modifier.fillMaxWidth()) - - Spacer(Modifier.height(20.dp)) - Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = Color(0xFFFFF3E0))) { - Column(modifier = Modifier.padding(12.dp)) { - Text("WARNING", fontWeight = FontWeight.Bold, color = Color(0xFFE65100), fontSize = 13.sp) - Spacer(Modifier.height(4.dp)) - Text("If you forget your PIN, your documents CANNOT be recovered. There is no reset option. Please write down your PIN and store it securely.", fontSize = 12.sp, color = Color(0xFFBF360C)) - } - } - - Spacer(Modifier.height(12.dp)) - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox(checked = pinWarningAcked, onCheckedChange = { pinWarningAcked = it }) - Text("I understand my PIN cannot be recovered", fontSize = 13.sp) - } - Row(verticalAlignment = Alignment.CenterVertically) { - Checkbox(checked = termsAccepted, onCheckedChange = { termsAccepted = it }) - Text("I agree to use encrypted storage", fontSize = 13.sp) - } - - Spacer(Modifier.height(20.dp)) - Button(onClick = { onConsented(pin, phone, email) }, enabled = canProceed, modifier = Modifier.fillMaxWidth()) { - Text("Set Up & Continue") - } - Spacer(Modifier.height(40.dp)) - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/onboarding/SplashScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/onboarding/SplashScreen.kt deleted file mode 100644 index ccebe5e..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/onboarding/SplashScreen.kt +++ /dev/null @@ -1,122 +0,0 @@ -package com.app.traveldocs.presentation.onboarding - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Description -import androidx.compose.material.icons.filled.Lock -import androidx.compose.material.icons.filled.CloudOff -import androidx.compose.material.icons.filled.LocationOn -import androidx.compose.material3.Button -import androidx.compose.material3.Checkbox -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp - -@Composable -fun SplashScreen(onContinue: (skipInFuture: Boolean) -> Unit) { - var skipInFuture by remember { mutableStateOf(false) } - - Box( - modifier = Modifier.fillMaxSize().background(Color(0xFF1565C0)), - contentAlignment = Alignment.Center - ) { - Column( - modifier = Modifier.fillMaxWidth().padding(32.dp), - horizontalAlignment = Alignment.CenterHorizontally - ) { - Icon( - Icons.Filled.Description, null, - tint = Color.White, - modifier = Modifier.size(72.dp) - ) - Spacer(Modifier.height(16.dp)) - Text( - "Document Manager", - fontSize = 28.sp, - fontWeight = FontWeight.Bold, - color = Color.White - ) - Spacer(Modifier.height(8.dp)) - Text( - "Your documents. Your device. Your control.", - fontSize = 14.sp, - color = Color.White.copy(alpha = 0.85f), - textAlign = TextAlign.Center - ) - - Spacer(Modifier.height(40.dp)) - - // Key principles - SplashPoint(Icons.Filled.Lock, "Private & Encrypted", "AES-256 encryption. Biometric lock.") - Spacer(Modifier.height(16.dp)) - SplashPoint(Icons.Filled.CloudOff, "No Data Collected", "Nothing uploaded. No servers. No tracking.") - Spacer(Modifier.height(16.dp)) - SplashPoint(Icons.Filled.LocationOn, "GPS Only With Consent", "Location logging is off by default.") - - Spacer(Modifier.height(40.dp)) - - // Skip checkbox - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = Modifier.fillMaxWidth() - ) { - Checkbox( - checked = skipInFuture, - onCheckedChange = { skipInFuture = it } - ) - Text( - "Don\u2019t show this again", - color = Color.White.copy(alpha = 0.9f), - fontSize = 14.sp - ) - } - - Spacer(Modifier.height(16.dp)) - - Button( - onClick = { onContinue(skipInFuture) }, - modifier = Modifier.fillMaxWidth().height(48.dp) - ) { - Text("Get Started", fontSize = 16.sp) - } - } - } -} - -@Composable -private fun SplashPoint(icon: ImageVector, title: String, subtitle: String) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Start - ) { - Icon(icon, null, tint = Color.White.copy(alpha = 0.9f), modifier = Modifier.size(28.dp)) - Column(modifier = Modifier.padding(start = 12.dp)) { - Text(title, color = Color.White, fontWeight = FontWeight.SemiBold, fontSize = 15.sp) - Text(subtitle, color = Color.White.copy(alpha = 0.7f), fontSize = 12.sp) - } - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/settings/SettingsScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/settings/SettingsScreen.kt deleted file mode 100644 index 1a02ef2..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/settings/SettingsScreen.kt +++ /dev/null @@ -1,193 +0,0 @@ -package com.app.traveldocs.presentation.settings - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.Button -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.OutlinedTextField -import androidx.compose.material3.OutlinedTextFieldDefaults -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.app.traveldocs.data.local.FeatureFlags - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun SettingsScreen(onBack: () -> Unit) { - val context = LocalContext.current - var experimental by remember { mutableStateOf(FeatureFlags.isExperimentalEnabled(context)) } - var driveEnabled by remember { mutableStateOf(FeatureFlags.isGoogleDriveEnabled(context)) } - var s3Enabled by remember { mutableStateOf(FeatureFlags.isS3Enabled(context)) } - var backupEnabled by remember { mutableStateOf(FeatureFlags.isBackupRestoreEnabled(context)) } - var gpsEnabled by remember { mutableStateOf(FeatureFlags.isGpsTrackingEnabled(context)) } - var extFormatsEnabled by remember { mutableStateOf(FeatureFlags.isExtendedFormatsEnabled(context)) } - - Scaffold(topBar = { TopAppBar(title = { Text("Settings") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> - Column(modifier = Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(16.dp)) { - Text("Experimental Features", fontWeight = FontWeight.Bold, fontSize = 16.sp) - Spacer(Modifier.height(4.dp)) - Text("Enable features that are in development. May be unstable.", fontSize = 12.sp) - Spacer(Modifier.height(12.dp)) - Card(modifier = Modifier.fillMaxWidth()) { - Column(modifier = Modifier.padding(16.dp)) { - ToggleRow("Enable Experimental Features", experimental) { experimental = it; FeatureFlags.setExperimental(context, it) } - if (experimental) { - Spacer(Modifier.height(12.dp)) - ToggleRow("Google Drive Support", driveEnabled) { driveEnabled = it; FeatureFlags.setGoogleDrive(context, it) } - Spacer(Modifier.height(8.dp)) - ToggleRow("S3 Compatible Storage", s3Enabled) { s3Enabled = it; FeatureFlags.setS3(context, it) } - ToggleRow("Backup & Restore (Preview)", backupEnabled) { backupEnabled = it; FeatureFlags.setBackupRestore(context, it) } - Spacer(Modifier.height(8.dp)) - Spacer(Modifier.height(8.dp)) - var wifiShareEnabled by remember { mutableStateOf(FeatureFlags.isWifiShareEnabled(context)) } - ToggleRow("WiFi Document Sharing (Preview)", wifiShareEnabled) { wifiShareEnabled = it; FeatureFlags.setWifiShare(context, it) } - Spacer(Modifier.height(8.dp)) - var audioEnabled by remember { mutableStateOf(FeatureFlags.isAudioPlaybackEnabled(context)) } - ToggleRow("Audio Playback & Android Auto (Preview)", audioEnabled) { audioEnabled = it; FeatureFlags.setAudioPlayback(context, it) } - Spacer(Modifier.height(8.dp)) - ToggleRow("Background GPS Tracking (Preview)", gpsEnabled) { gpsEnabled = it; FeatureFlags.setGpsTracking(context, it) } - Spacer(Modifier.height(8.dp)) - ToggleRow("Extended Image Formats", extFormatsEnabled) { extFormatsEnabled = it; FeatureFlags.setExtendedFormats(context, it) } - if (extFormatsEnabled) { - Spacer(Modifier.height(4.dp)) - var webpOn by remember { mutableStateOf(FeatureFlags.isFormatEnabled(context, "webp")) } - var heicOn by remember { mutableStateOf(FeatureFlags.isFormatEnabled(context, "heic")) } - var bmpOn by remember { mutableStateOf(FeatureFlags.isFormatEnabled(context, "bmp")) } - var gifOn by remember { mutableStateOf(FeatureFlags.isFormatEnabled(context, "gif")) } - var dicomOn by remember { mutableStateOf(FeatureFlags.isFormatEnabled(context, "dicom")) } - SubToggleRow("WebP", webpOn) { webpOn = it; FeatureFlags.setFormatEnabled(context, "webp", it) } - SubToggleRow("HEIC / HEIF (iOS photos)", heicOn) { heicOn = it; FeatureFlags.setFormatEnabled(context, "heic", it) } - SubToggleRow("BMP (legacy scans)", bmpOn) { bmpOn = it; FeatureFlags.setFormatEnabled(context, "bmp", it) } - SubToggleRow("GIF", gifOn) { gifOn = it; FeatureFlags.setFormatEnabled(context, "gif", it) } - SubToggleRow("DICOM (medical imaging)", dicomOn) { dicomOn = it; FeatureFlags.setFormatEnabled(context, "dicom", it) } - } - } - } - } - Spacer(Modifier.height(16.dp)) - Text("Personalization", fontWeight = FontWeight.Bold, fontSize = 16.sp) - Spacer(Modifier.height(8.dp)) - Card(modifier = Modifier.fillMaxWidth()) { - Column(modifier = Modifier.padding(16.dp)) { - Text("Home Page Title", fontSize = 14.sp) - Spacer(Modifier.height(4.dp)) - var homeTitle by remember { mutableStateOf(context.getSharedPreferences("app_settings", 0).getString("home_title", "My Private Documents") ?: "My Private Documents") } - OutlinedTextField( - value = homeTitle, - onValueChange = { homeTitle = it }, - label = { Text("Title") }, - singleLine = true, - modifier = Modifier.fillMaxWidth() - ) - Spacer(Modifier.height(8.dp)) - Button(onClick = { context.getSharedPreferences("app_settings", 0).edit().putString("home_title", homeTitle).apply() }, modifier = Modifier.fillMaxWidth()) { Text("Save") } - } - } - - Spacer(Modifier.height(16.dp)) - Text("Privacy", fontWeight = FontWeight.Bold, fontSize = 16.sp) - Spacer(Modifier.height(8.dp)) - Card(modifier = Modifier.fillMaxWidth()) { - Column(modifier = Modifier.padding(16.dp)) { - var telemetryEnabled by remember { mutableStateOf(context.getSharedPreferences("app_settings", 0).getBoolean("telemetry_enabled", false)) } - ToggleRow("Collect usage telemetry (local)", telemetryEnabled) { - telemetryEnabled = it - context.getSharedPreferences("app_settings", 0).edit().putBoolean("telemetry_enabled", it).apply() - com.app.traveldocs.debug.UsageTelemetry.setConsent(it) - } - Spacer(Modifier.height(4.dp)) - Text("When enabled, anonymous usage stats are stored locally on your device. Nothing is sent automatically.", fontSize = 11.sp, color = Color.Gray) - if (telemetryEnabled) { - Spacer(Modifier.height(8.dp)) - Button(onClick = { shareTelemetry(context) }, modifier = Modifier.fillMaxWidth()) { Text("Send Telemetry via Email", fontSize = 13.sp) } - Text("Opens your email app with telemetry attached. You decide who receives it.", fontSize = 10.sp, color = Color.Gray) - } - } - } - - Spacer(Modifier.height(16.dp)) - Text("Appearance", fontWeight = FontWeight.Bold, fontSize = 16.sp) - Spacer(Modifier.height(8.dp)) - Card(modifier = Modifier.fillMaxWidth()) { - Column(modifier = Modifier.padding(16.dp)) { - var darkMode by remember { mutableStateOf(context.getSharedPreferences("app_settings", 0).getBoolean("dark_mode", false)) } - ToggleRow("Dark Theme", darkMode) { - darkMode = it - context.getSharedPreferences("app_settings", 0).edit().putBoolean("dark_mode", it).apply() - // Recreate activity to apply theme immediately - (context as? android.app.Activity)?.recreate() - } - Spacer(Modifier.height(4.dp)) - Text("Theme changes apply immediately.", fontSize = 11.sp, color = Color.Gray) - } - } - } - } -} - -@Composable -private fun ToggleRow(label: String, checked: Boolean, onChanged: (Boolean) -> Unit) { - Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { - Text(label, modifier = Modifier.weight(1f), fontSize = 14.sp) - Switch(checked = checked, onCheckedChange = onChanged) - } -} - -@Composable -private fun SubToggleRow(label: String, checked: Boolean, onChanged: (Boolean) -> Unit) { - Row(modifier = Modifier.fillMaxWidth().padding(start = 24.dp), verticalAlignment = Alignment.CenterVertically) { - Text(label, modifier = Modifier.weight(1f), fontSize = 13.sp) - Switch(checked = checked, onCheckedChange = onChanged) - } -} - - -private fun shareTelemetry(context: android.content.Context) { - try { - // Package telemetry summary into a text file - val summary = com.app.traveldocs.debug.UsageTelemetry.getLocalSummary() - val cacheDir = java.io.File(context.cacheDir, "shared_docs") - cacheDir.mkdirs() - val file = java.io.File(cacheDir, "telemetry_report.txt") - file.writeText(summary) - val uri = androidx.core.content.FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file) - val intent = android.content.Intent(android.content.Intent.ACTION_SEND).apply { - type = "text/plain" - putExtra(android.content.Intent.EXTRA_STREAM, uri) - putExtra(android.content.Intent.EXTRA_SUBJECT, "Document Manager - Usage Telemetry Report") - putExtra(android.content.Intent.EXTRA_TEXT, "Attached: anonymous usage telemetry from Document Manager app.") - addFlags(android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION) - } - val resInfoList = context.packageManager.queryIntentActivities(intent, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY) - for (ri in resInfoList) { context.grantUriPermission(ri.activityInfo.packageName, uri, android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION) } - context.startActivity(android.content.Intent.createChooser(intent, "Send telemetry via").addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK)) - } catch (e: Exception) { - com.app.traveldocs.debug.DebugLogger.e("Settings", "Failed to share telemetry", e) - } -} diff --git a/app/src/main/java/com/app/traveldocs/presentation/webshare/WebShareScreen.kt b/app/src/main/java/com/app/traveldocs/presentation/webshare/WebShareScreen.kt deleted file mode 100644 index 8068c6a..0000000 --- a/app/src/main/java/com/app/traveldocs/presentation/webshare/WebShareScreen.kt +++ /dev/null @@ -1,145 +0,0 @@ -package com.app.traveldocs.presentation.webshare - -import android.content.Context -import android.net.wifi.WifiManager -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.Wifi -import androidx.compose.material.icons.filled.WifiOff -import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.Card -import androidx.compose.material3.CardDefaults -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton -import androidx.compose.foundation.layout.Row -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.text.font.FontFamily -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import com.app.traveldocs.data.webserver.DocumentWebServer -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.repository.DocumentFileStorage -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.TagRepository - -@dagger.hilt.EntryPoint -@dagger.hilt.InstallIn(dagger.hilt.components.SingletonComponent::class) -interface WebShareEntryPoint { - fun documentRepository(): DocumentRepository - fun fileStorage(): DocumentFileStorage - fun tagRepository(): TagRepository -} - -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun WebShareScreen(onBack: () -> Unit) { - val context = LocalContext.current - // Access repositories via Hilt EntryPoint (no ViewModel needed for this screen) - val entryPoint = remember { dagger.hilt.android.EntryPointAccessors.fromApplication(context.applicationContext, WebShareEntryPoint::class.java) } - val documentRepository = remember { entryPoint.documentRepository() } - val fileStorage = remember { entryPoint.fileStorage() } - val tagRepository = remember { entryPoint.tagRepository() } - var serverRunning by remember { mutableStateOf(false) } - var serverUrl by remember { mutableStateOf("") } - var server by remember { mutableStateOf(null) } - - DisposableEffect(Unit) { - onDispose { server?.stop(); DebugLogger.i("WebShare", "Server stopped (screen disposed)") } - } - - Scaffold(topBar = { TopAppBar(title = { Text("Share via WiFi") }, navigationIcon = { IconButton(onClick = { server?.stop(); onBack() }) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> - Column(Modifier.fillMaxSize().padding(padding).padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally) { - if (serverRunning) { - Card(Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = Color(0xFFE8F5E9)), shape = RoundedCornerShape(12.dp)) { - Column(Modifier.padding(20.dp), horizontalAlignment = Alignment.CenterHorizontally) { - Icon(Icons.Filled.Wifi, null, tint = Color(0xFF4CAF50), modifier = Modifier.size(48.dp)) - Spacer(Modifier.height(12.dp)) - Text("Sharing Active", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = Color(0xFF2E7D32)) - Spacer(Modifier.height(8.dp)) - Text("Open this URL in any browser on your WiFi:", fontSize = 13.sp, color = Color.Gray, textAlign = TextAlign.Center) - Spacer(Modifier.height(12.dp)) - Text(serverUrl, fontSize = 16.sp, fontWeight = FontWeight.Bold, fontFamily = FontFamily.Monospace, color = Color(0xFF1565C0)) - Spacer(Modifier.height(8.dp)) - Text("Access token is embedded in the URL. Only share with trusted devices.", fontSize = 11.sp, color = Color(0xFFE65100)) - } - } - Spacer(Modifier.height(16.dp)) - Text("From the web browser you can:", fontSize = 14.sp) - Spacer(Modifier.height(4.dp)) - listOf("Browse by tags", "Download files (decrypted)", "Upload new files", "Rename documents", "Add/remove tags").forEach { Text("• $it", fontSize = 13.sp, color = Color.Gray) } - Spacer(Modifier.height(24.dp)) - Button(onClick = { server?.stop(); serverRunning = false; DebugLogger.i("WebShare", "Stopped by user") }, colors = ButtonDefaults.buttonColors(containerColor = Color(0xFFF44336)), modifier = Modifier.fillMaxWidth().height(48.dp)) { - Icon(Icons.Filled.WifiOff, null, Modifier.size(20.dp)); Spacer(Modifier.width(8.dp)); Text("Stop Sharing", fontSize = 16.sp) - } - Spacer(Modifier.height(4.dp)) - Text("Stop to secure your documents.", fontSize = 11.sp, color = Color(0xFFF44336)) - } else { - Spacer(Modifier.height(40.dp)) - Icon(Icons.Filled.Wifi, null, tint = Color.Gray, modifier = Modifier.size(64.dp)) - Spacer(Modifier.height(16.dp)) - Text("WiFi Document Sharing", fontSize = 20.sp, fontWeight = FontWeight.Bold) - Spacer(Modifier.height(8.dp)) - Text("Start a local web server. Any device on your WiFi can browse and manage your documents.", fontSize = 14.sp, color = Color.Gray, textAlign = TextAlign.Center) - Spacer(Modifier.height(12.dp)) - Card(Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = Color(0xFFFFF3E0))) { - Text("⚠️ While active, anyone on your WiFi can access documents (decrypted). Use only on trusted networks.", fontSize = 12.sp, color = Color(0xFFE65100), modifier = Modifier.padding(12.dp)) - } - Spacer(Modifier.height(20.dp)) - val wifiIp = getWifiIp(context) - if (wifiIp != null) { - Text("WiFi IP: $wifiIp", fontSize = 13.sp, color = Color.Gray) - Spacer(Modifier.height(16.dp)) - Button(onClick = { - val s = DocumentWebServer(context, documentRepository, fileStorage, tagRepository) - s.start() - server = s - serverUrl = s.getServerUrl() - serverRunning = true - DebugLogger.i("WebShare", "Started at $serverUrl") - }, modifier = Modifier.fillMaxWidth().height(48.dp)) { - Icon(Icons.Filled.Wifi, null, Modifier.size(20.dp)); Spacer(Modifier.width(8.dp)); Text("Start Sharing", fontSize = 16.sp) - } - } else { - Text("Not connected to WiFi.", fontSize = 14.sp, color = Color(0xFFF44336), textAlign = TextAlign.Center) - } - } - } - } -} - -private fun getWifiIp(context: Context): String? { - return try { - val wm = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager - val ip = wm.connectionInfo.ipAddress - if (ip == 0) return null - "${ip and 0xFF}.${ip shr 8 and 0xFF}.${ip shr 16 and 0xFF}.${ip shr 24 and 0xFF}" - } catch (e: Exception) { - com.app.traveldocs.debug.DebugLogger.e("WebShare", "Failed to get WiFi IP", e) - null - } -} diff --git a/app/src/main/res/drawable-nodpi/ic_launcher_foreground.png b/app/src/main/res/drawable-nodpi/ic_launcher_foreground.png new file mode 100644 index 0000000000000000000000000000000000000000..d05dce87cccb0c050144005a96d36ff0b766b470 GIT binary patch literal 521522 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 |k(H;3@`6)RcLP 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%0D=2 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℘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�?L{B8OW`gPgk2WJ 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

  • COCWf0cAAc8P>btb%3;&=FzbE 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

  • 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 + try { + val decrypted = decryptFile(context, encFile) + if (decrypted != null) { + val relativePath = encFile.relativeTo(docsDir).path.replace(".enc", "") + val fileId = encFile.nameWithoutExtension + val outFile = File(tempDir, "docs/$relativePath") + outFile.parentFile?.mkdirs() + outFile.writeBytes(decrypted) + + fileCount++ + totalBytes += decrypted.size + val hash = java.security.MessageDigest.getInstance("SHA-256") + .digest(decrypted).joinToString("") { "%02x".format(it) } + fileManifest.put(JSONObject().apply { + put("path", "docs/$relativePath") + put("size", decrypted.size) + put("sha256", hash) + put("originalFileId", fileId) + }) + } + } catch (e: Exception) { + DebugLogger.e("Backup", "Failed to decrypt ${encFile.name}", e) + } + } + } + + val destDb = File(tempDir, "database/traveldocs.db") + RoomDbFiles.snapshot(context, destDb) + val dbCheck = RoomDbFiles.inspect(destDb) + DebugLogger.i("Backup", "DB snapshot: docs=${dbCheck.documentCount} tables=${dbCheck.tables} v=${dbCheck.userVersion}") + fileCount++ + totalBytes += destDb.length() + + if (includeTrailGpx) { + try { + val gpx = exportTrailGpx(context) + val trailFile = File(tempDir, "trail/my_trail.gpx") + trailFile.parentFile?.mkdirs() + trailFile.writeText(gpx) + fileCount++ + totalBytes += trailFile.length() + fileManifest.put(JSONObject().apply { + put("path", "trail/my_trail.gpx") + put("size", trailFile.length()) + put("sha256", java.security.MessageDigest.getInstance("SHA-256") + .digest(gpx.toByteArray()).joinToString("") { "%02x".format(it) }) + }) + DebugLogger.i("Backup", "Included My Trail as trail/my_trail.gpx") + } catch (e: Exception) { + DebugLogger.w("Backup", "Could not export trail GPX: ${e.message}") + } + } + + // 3. Write manifest with schema and file hashes + val manifest = JSONObject().apply { + put("schemaVersion", 2) + put("timestamp", timestamp) + put("appVersion", BuildConfig.VERSION_NAME) + put("fileCount", fileCount) + put("totalSizeBytes", totalBytes) + put("encrypted", protect) + put("transportable", true) + put("files", fileManifest) + } + File(tempDir, "manifest.json").writeText(manifest.toString(2)) + + val zipFile = if (protect) ZipFile(zipPath, pin.toCharArray()) else ZipFile(zipPath) + val params = ZipParameters().apply { + compressionMethod = CompressionMethod.DEFLATE + compressionLevel = CompressionLevel.NORMAL + if (protect) { + isEncryptFiles = true + encryptionMethod = EncryptionMethod.AES + aesKeyStrength = AesKeyStrength.KEY_STRENGTH_256 + } + } + tempDir.walkTopDown().filter { it.isFile }.forEach { file -> + val entryName = file.relativeTo(tempDir).path + params.fileNameInZip = entryName + zipFile.addFile(file, params) + } + + // 5. Cleanup staging + tempDir.deleteRecursively() + + DebugLogger.i("Backup", "Backup created: ${zipPath.name}, $fileCount files, ${totalBytes / 1024}KB, password=${protect}") + return BackupResult(zipPath, fileCount, totalBytes) + } + + private fun exportTrailGpx(context: Context): String { + val places = mutableListOf() + val dbFile = context.getDatabasePath("traveldocs.db") + if (dbFile.exists()) { + val db = android.database.sqlite.SQLiteDatabase.openDatabase( + dbFile.path, null, android.database.sqlite.SQLiteDatabase.OPEN_READONLY + ) + try { + db.rawQuery( + "SELECT latitude, longitude, timestamp, batteryPercent FROM gps_tracks ORDER BY timestamp ASC", + null + ).use { cursor -> + val lat = cursor.getColumnIndex("latitude") + val lon = cursor.getColumnIndex("longitude") + val time = cursor.getColumnIndex("timestamp") + val bat = cursor.getColumnIndex("batteryPercent") + while (cursor.moveToNext()) { + places += com.app.paperstow.domain.safety.SafetyPlace( + latitude = cursor.getDouble(lat), + longitude = cursor.getDouble(lon), + timestamp = cursor.getLong(time), + batteryPercent = if (bat >= 0) cursor.getInt(bat) else -1 + ) + } + } + } finally { + db.close() + } + } + return com.app.paperstow.domain.safety.GpxTrail.toGpx(places) + } + + /** + * Decrypt a .enc file using the same key from Android KeyStore. + */ + private fun decryptFile(context: Context, encFile: File): ByteArray? { + return try { + val encData = encFile.readBytes() + if (encData.size <= 12) return null + val iv = encData.copyOfRange(0, 12) + val ciphertext = encData.copyOfRange(12, encData.size) + + val keyStore = java.security.KeyStore.getInstance("AndroidKeyStore") + keyStore.load(null) + val key = (keyStore.getEntry("travel_docs_file_encryption_key", null) as java.security.KeyStore.SecretKeyEntry).secretKey + + val cipher = Cipher.getInstance("AES/GCM/NoPadding") + cipher.init(Cipher.DECRYPT_MODE, key, GCMParameterSpec(128, iv)) + cipher.doFinal(ciphertext) + } catch (e: Exception) { + DebugLogger.e("Backup", "Decrypt failed: ${encFile.name}", e) + null + } + } + + fun suggestedFolderName(): String = "Paperstow_Backup" + + fun suggestedFileName(): String { + val ts = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) + return "paperstow_backup_$ts.zip" + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/backup/BackupRestore.kt b/app/src/main/java/com/app/paperstow/data/backup/BackupRestore.kt similarity index 67% rename from app/src/main/java/com/app/traveldocs/data/backup/BackupRestore.kt rename to app/src/main/java/com/app/paperstow/data/backup/BackupRestore.kt index e678b26..9e01bdc 100644 --- a/app/src/main/java/com/app/traveldocs/data/backup/BackupRestore.kt +++ b/app/src/main/java/com/app/paperstow/data/backup/BackupRestore.kt @@ -1,7 +1,7 @@ -package com.app.traveldocs.data.backup +package com.app.paperstow.data.backup import android.content.Context -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger import net.lingala.zip4j.ZipFile import org.json.JSONObject import org.json.JSONArray @@ -24,7 +24,6 @@ object BackupRestore { val fileCount: Int, val totalSizeBytes: Long, val isPasswordProtected: Boolean, - val pinProtectedCount: Int, val files: List, val errorMessage: String? = null ) @@ -32,8 +31,7 @@ object BackupRestore { data class FileEntry( val path: String, val size: Long, - val sha256: String, - val hasPinProtection: Boolean + val sha256: String ) data class RestoreResult( @@ -52,11 +50,12 @@ object BackupRestore { DebugLogger.i("Restore", "Inspecting backup: ${zipFile.name} (${zipFile.length() / 1024}KB)") val extractDir = File(context.cacheDir, "inspect_${System.currentTimeMillis()}") extractDir.mkdirs() + val pin = password?.trim()?.takeIf { it.isNotEmpty() } try { - val zip = if (password != null) ZipFile(zipFile, password.toCharArray()) else ZipFile(zipFile) - if (zip.isEncrypted && password == null) { - return BackupInspection(false, 0, "", 0, 0, true, 0, emptyList(), "Backup is password-protected. Please provide the PIN.") + val zip = if (pin != null) ZipFile(zipFile, pin.toCharArray()) else ZipFile(zipFile) + if (zip.isEncrypted && pin == null) { + return BackupInspection(false, 0, "", 0, 0, true, emptyList(), "Backup is password-protected. Please provide the password.") } // Extract only manifest for inspection zip.extractAll(extractDir.absolutePath) @@ -64,7 +63,7 @@ object BackupRestore { val manifestFile = File(extractDir, "manifest.json") if (!manifestFile.exists()) { extractDir.deleteRecursively() - return BackupInspection(false, 0, "", 0, 0, false, 0, emptyList(), "No manifest.json found in backup. Invalid backup file.") + return BackupInspection(false, 0, "", 0, 0, false, emptyList(), "No manifest.json found in backup. Invalid backup file.") } val manifest = JSONObject(manifestFile.readText()) @@ -76,27 +75,33 @@ object BackupRestore { val filesArray = manifest.optJSONArray("files") ?: JSONArray() val files = mutableListOf() - var pinCount = 0 for (i in 0 until filesArray.length()) { val f = filesArray.getJSONObject(i) - val hasPin = f.optBoolean("hasPinProtection", false) - if (hasPin) pinCount++ files.add(FileEntry( path = f.getString("path"), size = f.optLong("size", 0), - sha256 = f.optString("sha256", ""), - hasPinProtection = hasPin + sha256 = f.optString("sha256", "") )) } + val backupDb = File(extractDir, "database/traveldocs.db") + val dbCheck = if (backupDb.exists()) RoomDbFiles.inspect(backupDb) else null extractDir.deleteRecursively() - DebugLogger.i("Restore", "Inspection: $fileCount files, ${totalSize/1024}KB, $pinCount PIN-protected") - return BackupInspection(true, schema, timestamp, fileCount, totalSize, encrypted, pinCount, files) + if (dbCheck == null) { + return BackupInspection(false, schema, timestamp, fileCount, totalSize, encrypted, files, + "Backup has no database/traveldocs.db") + } + if (!dbCheck.hasDocumentsTable) { + return BackupInspection(false, schema, timestamp, fileCount, totalSize, encrypted, files, + "Backup database is empty or corrupt (no documents table). ${dbCheck.error ?: "tables=${dbCheck.tables}"}") + } + DebugLogger.i("Restore", "Inspection: $fileCount files, ${totalSize/1024}KB, docs=${dbCheck.documentCount}") + return BackupInspection(true, schema, timestamp, fileCount, totalSize, encrypted, files) } catch (e: Exception) { extractDir.deleteRecursively() DebugLogger.e("Restore", "Inspection failed", e) - return BackupInspection(false, 0, "", 0, 0, false, 0, emptyList(), "Failed to read backup: ${e.message}") + return BackupInspection(false, 0, "", 0, 0, false, emptyList(), "Failed to read backup: ${e.message}") } } @@ -115,8 +120,9 @@ object BackupRestore { try { // 1. Extract - val zip = if (password != null) ZipFile(zipFile, password.toCharArray()) else ZipFile(zipFile) - if (zip.isEncrypted && password == null) { + val pin = password?.trim()?.takeIf { it.isNotEmpty() } + val zip = if (pin != null) ZipFile(zipFile, pin.toCharArray()) else ZipFile(zipFile) + if (zip.isEncrypted && pin == null) { return RestoreResult(false, 0, 0, 0, "Password required.", "Restore failed: backup is password-protected.") } zip.extractAll(extractDir.absolutePath) @@ -128,30 +134,66 @@ object BackupRestore { val expectedFiles = mutableMapOf() for (i in 0 until filesArray.length()) { val f = filesArray.getJSONObject(i) - val entry = FileEntry(f.getString("path"), f.optLong("size", 0), f.optString("sha256", ""), f.optBoolean("hasPinProtection", false)) + val entry = FileEntry(f.getString("path"), f.optLong("size", 0), f.optString("sha256", "")) expectedFiles[entry.path] = entry } reportLines.add("Manifest: schema=${manifest?.optInt("schemaVersion", 1)}, files=${expectedFiles.size}") reportLines.add("") - // 3. Close and restore database val backupDb = File(extractDir, "database/traveldocs.db") - if (backupDb.exists()) { - val targetDb = context.getDatabasePath("traveldocs.db") - val walFile = File(targetDb.path + "-wal") - val shmFile = File(targetDb.path + "-shm") - try { - val db = androidx.room.Room.databaseBuilder(context, com.app.traveldocs.data.local.TravelDocsDatabase::class.java, "traveldocs.db").build() - db.close() - } catch (_: Exception) {} - walFile.delete() - shmFile.delete() - targetDb.parentFile?.mkdirs() - backupDb.copyTo(targetDb, overwrite = true) - reportLines.add("Database: restored (${targetDb.length()/1024}KB)") - } else { + val backupCheck = if (backupDb.exists()) RoomDbFiles.inspect(backupDb) else null + if (backupCheck == null) { + extractDir.deleteRecursively() reportLines.add("Database: NOT found in backup") + return RestoreResult(false, 0, 0, 0, "Backup has no database.", reportLines.joinToString("\n")) + } + reportLines.add("Backup DB: ${backupDb.length()} bytes, tables=${backupCheck.tables}, docs=${backupCheck.documentCount}, v=${backupCheck.userVersion}") + if (!backupCheck.hasDocumentsTable) { + extractDir.deleteRecursively() + reportLines.add("ERROR: documents table not in backup DB — live library was not changed") + DebugLogger.e("Restore", "Backup DB missing documents table: ${backupCheck.error ?: backupCheck.tables}") + return RestoreResult( + false, 0, 0, 0, + "Backup database is empty or corrupt (no documents table). Restore did not change this phone.", + reportLines.joinToString("\n") + ) + } + + val targetDb = RoomDbFiles.liveFile(context) + val rollback = File(context.cacheDir, "restore_rollback_${System.currentTimeMillis()}.db") + fun rollbackLiveDb() { + if (!rollback.exists()) return + rollback.copyTo(targetDb, overwrite = true) + RoomDbFiles.deleteSidecars(targetDb) + reportLines.add("Rolled back to the previous database") + } + + RoomDbFiles.closeLiveDatabase(context) + if (targetDb.exists()) { + try { + targetDb.copyTo(rollback, overwrite = true) + } catch (e: Exception) { + DebugLogger.w("Restore", "Could not snapshot live DB for rollback: ${e.message}") + } } + RoomDbFiles.deleteSidecars(targetDb) + targetDb.parentFile?.mkdirs() + backupDb.copyTo(targetDb, overwrite = true) + RoomDbFiles.deleteSidecars(targetDb) + + val liveCheck = RoomDbFiles.inspect(targetDb) + reportLines.add("Live DB after copy: tables=${liveCheck.tables}, docs=${liveCheck.documentCount}") + if (!liveCheck.hasDocumentsTable) { + rollbackLiveDb() + extractDir.deleteRecursively() + rollback.delete() + return RestoreResult( + false, 0, 0, 0, + "Restore failed: documents table missing after copy. Previous library was put back.", + reportLines.joinToString("\n") + ) + } + reportLines.add("Database: restored (${targetDb.length() / 1024}KB, ${liveCheck.documentCount} documents)") // 4. Restore document files with verification var filesProcessed = 0 @@ -194,8 +236,7 @@ object BackupRestore { if (encrypted != null) { targetFile.writeBytes(encrypted) filesRestored++ - val status = if (expectedEntry?.hasPinProtection == true) "OK (PIN-protected)" else "OK" - reportLines.add(" $status: $relativePath (${fileBytes.size/1024}KB)") + reportLines.add(" OK: $relativePath (${fileBytes.size/1024}KB)") } else { reportLines.add(" FAIL (encryption): $relativePath") } @@ -225,8 +266,18 @@ object BackupRestore { extractDir.deleteRecursively() - val msg = "Restored $filesRestored of $filesProcessed documents" + - (if (filesFailedVerification > 0) " ($filesFailedVerification failed verification)" else "") + val docsMissingOnDisk = filesProcessed > 0 && filesRestored == 0 + val failed = filesFailedVerification > 0 || docsMissingOnDisk + if (failed) { + rollbackLiveDb() + rollback.delete() + val msg = "Restore failed: $filesRestored of $filesProcessed files written" + + (if (filesFailedVerification > 0) ", $filesFailedVerification failed verification" else "") + DebugLogger.e("Restore", msg) + return RestoreResult(false, filesProcessed, filesRestored, filesFailedVerification, msg, reportLines.joinToString("\n")) + } + rollback.delete() + val msg = "Restored $filesRestored of $filesProcessed documents" DebugLogger.i("Restore", msg) return RestoreResult(true, filesProcessed, filesRestored, filesFailedVerification, msg, reportLines.joinToString("\n")) diff --git a/app/src/main/java/com/app/paperstow/data/backup/RoomDbFiles.kt b/app/src/main/java/com/app/paperstow/data/backup/RoomDbFiles.kt new file mode 100644 index 0000000..b71de26 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/backup/RoomDbFiles.kt @@ -0,0 +1,124 @@ +package com.app.paperstow.data.backup + +import android.content.Context +import android.database.sqlite.SQLiteDatabase +import com.app.paperstow.data.local.TravelDocsDatabase +import com.app.paperstow.debug.DebugLogger +import dagger.hilt.EntryPoint +import dagger.hilt.InstallIn +import dagger.hilt.android.EntryPointAccessors +import dagger.hilt.components.SingletonComponent +import java.io.File + +/** + * Safe snapshot / swap of the Room file. Copying traveldocs.db while Room still + * has WAL open is what produced backups (and restores) with no documents table. + */ +object RoomDbFiles { + + data class Inspection( + val validSqlite: Boolean, + val hasDocumentsTable: Boolean, + val documentCount: Int, + val userVersion: Int, + val tables: List, + val error: String? = null + ) + + @EntryPoint + @InstallIn(SingletonComponent::class) + interface DatabaseEntryPoint { + fun database(): TravelDocsDatabase + } + + fun liveFile(context: Context): File = context.getDatabasePath("traveldocs.db") + + fun closeLiveDatabase(context: Context) { + try { + val db = EntryPointAccessors.fromApplication(context, DatabaseEntryPoint::class.java).database() + if (db.isOpen) { + db.close() + DebugLogger.i("DB", "Closed live Room database") + } + } catch (e: Exception) { + DebugLogger.w("DB", "Could not close live Room database: ${e.message}") + } + } + + fun snapshot(context: Context, dest: File) { + dest.parentFile?.mkdirs() + if (dest.exists()) dest.delete() + val live = liveFile(context) + if (!live.exists()) { + throw IllegalStateException("No live database to back up") + } + val source = SQLiteDatabase.openDatabase(live.path, null, SQLiteDatabase.OPEN_READWRITE) + try { + try { + val escaped = dest.absolutePath.replace("'", "''") + source.execSQL("VACUUM INTO '$escaped'") + } catch (e: Exception) { + DebugLogger.w("DB", "VACUUM INTO failed (${e.message}); checkpoint + copy") + source.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)", null).close() + live.copyTo(dest, overwrite = true) + return + } + } finally { + if (source.isOpen) source.close() + } + val check = inspect(dest) + if (!check.hasDocumentsTable) { + throw IllegalStateException( + "Snapshot is missing the documents table (tables=${check.tables})" + ) + } + } + + fun inspect(file: File): Inspection { + if (!file.exists() || file.length() < 100) { + return Inspection(false, false, 0, 0, emptyList(), "Database file is missing or too small (${file.length()} bytes)") + } + val header = ByteArray(16) + file.inputStream().use { input -> + var read = 0 + while (read < header.size) { + val n = input.read(header, read, header.size - read) + if (n < 0) break + read += n + } + } + val magic = String(header, Charsets.US_ASCII) + if (!magic.startsWith("SQLite format 3")) { + return Inspection(false, false, 0, 0, emptyList(), "Not a SQLite file") + } + return try { + val db = SQLiteDatabase.openDatabase(file.path, null, SQLiteDatabase.OPEN_READONLY) + try { + val tables = mutableListOf() + db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name", null).use { cursor -> + while (cursor.moveToNext()) tables += cursor.getString(0) + } + val hasDocuments = tables.contains("documents") + val count = if (hasDocuments) { + db.rawQuery("SELECT COUNT(*) FROM documents", null).use { cursor -> + if (cursor.moveToFirst()) cursor.getInt(0) else 0 + } + } else 0 + val version = db.rawQuery("PRAGMA user_version", null).use { cursor -> + if (cursor.moveToFirst()) cursor.getInt(0) else 0 + } + Inspection(true, hasDocuments, count, version, tables) + } finally { + db.close() + } + } catch (e: Exception) { + Inspection(false, false, 0, 0, emptyList(), e.message) + } + } + + fun deleteSidecars(dbFile: File) { + File(dbFile.path + "-wal").delete() + File(dbFile.path + "-shm").delete() + File(dbFile.path + "-journal").delete() + } +} diff --git a/app/src/main/java/com/app/paperstow/data/demo/DemoCatalog.kt b/app/src/main/java/com/app/paperstow/data/demo/DemoCatalog.kt new file mode 100644 index 0000000..c893ed5 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/demo/DemoCatalog.kt @@ -0,0 +1,38 @@ +package com.app.paperstow.data.demo + +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentType + +const val DEMO_SYSTEM_TAG = "__DEMO" +const val DEMO_FOLDER_TAG = "Sample trip" + +data class DemoAsset( + val assetName: String, + val fileName: String, + val format: DocumentFormat, + val type: DocumentType, + val tags: List +) + +object DemoCatalog { + val items: List = listOf( + DemoAsset("john_doe_passport.pdf", "John_Doe_Passport.pdf", DocumentFormat.PDF, DocumentType.PASSPORT, listOf("Passport")), + DemoAsset("john_doe_photo.png", "John_Doe_Photo.png", DocumentFormat.PNG, DocumentType.PASSPORT, listOf("Passport")), + DemoAsset("jane_doe_photo.png", "Jane_Doe_Photo.png", DocumentFormat.PNG, DocumentType.PASSPORT, listOf("Passport")), + DemoAsset("visa_letter.pdf", "Jane_Doe_Visa_Letter.pdf", DocumentFormat.PDF, DocumentType.VISA, listOf("Visa")), + DemoAsset("visa_stamp.png", "Visa_Entry_Stamp.png", DocumentFormat.PNG, DocumentType.VISA, listOf("Visa")), + DemoAsset("boarding_pass.pdf", "Boarding_Pass_PS101.pdf", DocumentFormat.PDF, DocumentType.TICKET, listOf("Tickets")), + DemoAsset("boarding_pass_mobile.jpg", "Boarding_Pass_Mobile.jpg", DocumentFormat.JPG, DocumentType.TICKET, listOf("Tickets")), + DemoAsset("hotel_confirmation.pdf", "Lakeside_Inn.pdf", DocumentFormat.PDF, DocumentType.HOTEL_BOOKING, listOf("Hotel")), + DemoAsset("hotel_key_packet.gif", "Hotel_Key_Packet.gif", DocumentFormat.GIF, DocumentType.HOTEL_BOOKING, listOf("Hotel")), + DemoAsset("travel_insurance.pdf", "Travel_Insurance.pdf", DocumentFormat.PDF, DocumentType.HEALTH_INSURANCE, listOf("Insurance")), + DemoAsset("vaccination_record.pdf", "John_Doe_Vaccination.pdf", DocumentFormat.PDF, DocumentType.HEALTH_INSURANCE, listOf("Health")), + DemoAsset("blood_test_report.pdf", "Jane_Doe_Blood_Test.pdf", DocumentFormat.PDF, DocumentType.HEALTH_INSURANCE, listOf("Health")), + DemoAsset("jane_vaccine_card.bmp", "Jane_Doe_Vaccine_Card.bmp", DocumentFormat.BMP, DocumentType.HEALTH_INSURANCE, listOf("Health")), + DemoAsset("emergency_contacts.txt", "Emergency_Contacts.txt", DocumentFormat.TEXT, DocumentType.UNKNOWN, listOf("Notes")), + DemoAsset("packing_list.txt", "Packing_List.txt", DocumentFormat.TEXT, DocumentType.UNKNOWN, listOf("Notes")), + DemoAsset("flight_itinerary.txt", "Flight_Itinerary.txt", DocumentFormat.TEXT, DocumentType.UNKNOWN, listOf("Notes", "Tickets")), + DemoAsset("trip_plans.md", "Trip_Plans.md", DocumentFormat.MARKDOWN, DocumentType.UNKNOWN, listOf("Plans")), + DemoAsset("sample_trail.gpx", "Sample_Trail.gpx", DocumentFormat.GPX, DocumentType.UNKNOWN, listOf("Trail")) + ) +} diff --git a/app/src/main/java/com/app/paperstow/data/demo/DemoDataRepository.kt b/app/src/main/java/com/app/paperstow/data/demo/DemoDataRepository.kt new file mode 100644 index 0000000..d000022 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/demo/DemoDataRepository.kt @@ -0,0 +1,67 @@ +package com.app.paperstow.data.demo + +import android.content.Context +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.first +import java.time.Instant +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class DemoDataRepository @Inject constructor( + @ApplicationContext private val context: Context, + private val fileStorage: DocumentFileStorage, + private val documentRepository: DocumentRepository +) { + suspend fun demoDocuments(): List = + documentRepository.getAll("default-member").first() + .filter { doc -> doc.tags.any { it.name == DEMO_SYSTEM_TAG } } + + suspend fun isLoaded(): Boolean = demoDocuments().isNotEmpty() + + suspend fun importSampleTrip(): Result = runCatching { + if (isLoaded()) return@runCatching demoDocuments().size + var count = 0 + val now = Instant.now() + DemoCatalog.items.forEach { item -> + val bytes = context.assets.open("demo/${item.assetName}").use { it.readBytes() } + val fileId = fileStorage.store("default-member", bytes, item.format).getOrThrow() + val tags = (listOf(DEMO_SYSTEM_TAG, DEMO_FOLDER_TAG) + item.tags).distinct().map { + Tag(name = it, isAutoGenerated = it == DEMO_SYSTEM_TAG) + } + documentRepository.insert( + Document( + id = fileId, + memberId = "default-member", + type = item.type, + format = item.format, + originalFileName = item.fileName, + metadata = emptyMap(), + tags = tags, + createdAt = now, + updatedAt = now, + extractionConfidence = 1f, + requiresManualReview = false + ) + ).getOrThrow() + count++ + } + DebugLogger.i("Demo", "Imported $count sample documents") + count + } + + suspend fun removeSampleTrip(): Result = runCatching { + val docs = demoDocuments() + docs.forEach { doc -> + fileStorage.secureDelete(doc.id) + documentRepository.delete(doc.id).getOrThrow() + } + DebugLogger.i("Demo", "Removed ${docs.size} sample documents") + docs.size + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/dicom/DicomParser.kt b/app/src/main/java/com/app/paperstow/data/dicom/DicomParser.kt similarity index 99% rename from app/src/main/java/com/app/traveldocs/data/dicom/DicomParser.kt rename to app/src/main/java/com/app/paperstow/data/dicom/DicomParser.kt index 582009b..28a7630 100644 --- a/app/src/main/java/com/app/traveldocs/data/dicom/DicomParser.kt +++ b/app/src/main/java/com/app/paperstow/data/dicom/DicomParser.kt @@ -1,7 +1,7 @@ -package com.app.traveldocs.data.dicom +package com.app.paperstow.data.dicom import android.graphics.Bitmap -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger import java.nio.ByteBuffer import java.nio.ByteOrder diff --git a/app/src/main/java/com/app/traveldocs/data/drive/.gitkeep b/app/src/main/java/com/app/paperstow/data/drive/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/data/drive/.gitkeep rename to app/src/main/java/com/app/paperstow/data/drive/.gitkeep diff --git a/app/src/main/java/com/app/paperstow/data/feedback/FeedbackDraftStore.kt b/app/src/main/java/com/app/paperstow/data/feedback/FeedbackDraftStore.kt new file mode 100644 index 0000000..275dc81 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/feedback/FeedbackDraftStore.kt @@ -0,0 +1,156 @@ +package com.app.paperstow.data.feedback + +import android.content.Context +import dagger.hilt.android.qualifiers.ApplicationContext +import org.json.JSONArray +import org.json.JSONObject +import java.util.UUID +import javax.inject.Inject +import javax.inject.Singleton + +data class FeedbackDraft( + val id: String, + val liked: String, + val disliked: String, + val createdAt: Long, + val updatedAt: Long +) { + fun isBlank(): Boolean = liked.isBlank() && disliked.isBlank() + + fun preview(): String { + val likedBit = liked.trim().take(40) + val dislikedBit = disliked.trim().take(40) + return when { + likedBit.isNotEmpty() && dislikedBit.isNotEmpty() -> "Liked: $likedBit" + likedBit.isNotEmpty() -> likedBit + dislikedBit.isNotEmpty() -> "Not liked: $dislikedBit" + else -> "Empty draft" + } + } + + fun asNoteBody(): String = buildString { + appendLine("What I liked") + appendLine(liked.trim().ifBlank { "(none)" }) + appendLine() + appendLine("What I did not like") + appendLine(disliked.trim().ifBlank { "(none)" }) + } +} + +@Singleton +class FeedbackDraftStore @Inject constructor( + @ApplicationContext context: Context +) { + private val prefs = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) + + fun currentId(): String? = prefs.getString(KEY_CURRENT, null) + + fun draftsNewestFirst(): List = + readAll().sortedByDescending { it.updatedAt }.take(MAX_DRAFTS) + + fun get(id: String): FeedbackDraft? = readAll().firstOrNull { it.id == id } + + fun currentOrNew(): FeedbackDraft { + val id = currentId() + if (id != null) get(id)?.let { return it } + val draft = FeedbackDraft( + id = UUID.randomUUID().toString(), + liked = "", + disliked = "", + createdAt = System.currentTimeMillis(), + updatedAt = System.currentTimeMillis() + ) + upsert(draft, makeCurrent = true) + return draft + } + + fun startNew(): FeedbackDraft { + val existing = currentOrNew() + if (existing.isBlank()) return existing + val draft = FeedbackDraft( + id = UUID.randomUUID().toString(), + liked = "", + disliked = "", + createdAt = System.currentTimeMillis(), + updatedAt = System.currentTimeMillis() + ) + upsert(draft, makeCurrent = true) + return draft + } + + fun saveCurrent(liked: String, disliked: String): FeedbackDraft { + val now = System.currentTimeMillis() + val previous = currentOrNew() + val draft = previous.copy(liked = liked, disliked = disliked, updatedAt = now) + if (draft.isBlank()) { + upsert(draft, makeCurrent = true) + return draft + } + upsert(draft, makeCurrent = true) + return draft + } + + fun setCurrent(id: String) { + if (get(id) != null) prefs.edit().putString(KEY_CURRENT, id).apply() + } + + fun delete(id: String) { + val remaining = readAll().filter { it.id != id } + writeAll(remaining) + if (currentId() == id) { + val next = remaining.maxByOrNull { it.updatedAt } + prefs.edit().putString(KEY_CURRENT, next?.id).apply() + } + } + + private fun upsert(draft: FeedbackDraft, makeCurrent: Boolean) { + val others = readAll().filter { it.id != draft.id } + val merged = (listOf(draft) + others).sortedByDescending { it.updatedAt }.take(MAX_DRAFTS) + writeAll(merged) + if (makeCurrent) prefs.edit().putString(KEY_CURRENT, draft.id).apply() + } + + private fun readAll(): List { + val raw = prefs.getString(KEY_DRAFTS, null) ?: return emptyList() + return runCatching { + val array = JSONArray(raw) + buildList { + for (i in 0 until array.length()) { + val obj = array.getJSONObject(i) + add( + FeedbackDraft( + id = obj.getString("id"), + liked = obj.optString("liked"), + disliked = obj.optString("disliked"), + createdAt = obj.optLong("createdAt"), + updatedAt = obj.optLong("updatedAt") + ) + ) + } + } + }.getOrDefault(emptyList()) + } + + private fun writeAll(drafts: List) { + val array = JSONArray() + drafts.forEach { draft -> + array.put( + JSONObject().apply { + put("id", draft.id) + put("liked", draft.liked) + put("disliked", draft.disliked) + put("createdAt", draft.createdAt) + put("updatedAt", draft.updatedAt) + } + ) + } + prefs.edit().putString(KEY_DRAFTS, array.toString()).apply() + } + + companion object { + private const val PREFS = "feedback_drafts" + private const val KEY_DRAFTS = "drafts" + private const val KEY_CURRENT = "current_id" + private const val MAX_DRAFTS = 20 + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/importer/DocumentFormatValidator.kt b/app/src/main/java/com/app/paperstow/data/importer/DocumentFormatValidator.kt similarity index 61% rename from app/src/main/java/com/app/traveldocs/data/importer/DocumentFormatValidator.kt rename to app/src/main/java/com/app/paperstow/data/importer/DocumentFormatValidator.kt index 8d0f35b..c297be8 100644 --- a/app/src/main/java/com/app/traveldocs/data/importer/DocumentFormatValidator.kt +++ b/app/src/main/java/com/app/paperstow/data/importer/DocumentFormatValidator.kt @@ -1,6 +1,6 @@ -package com.app.traveldocs.data.importer +package com.app.paperstow.data.importer -import com.app.traveldocs.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentFormat import javax.inject.Inject import javax.inject.Singleton @@ -31,16 +31,46 @@ class DocumentFormatValidator @Inject constructor() { */ fun validateAndDetectFormat(bytes: ByteArray, mimeType: String?): DocumentFormat? { if (bytes.isEmpty()) return null + val detected = detect(bytes, mimeType, null) + return if (detected == DocumentFormat.UNKNOWN) null else detected + } - // First, try to detect format from magic bytes - val detectedFormat = detectFromMagicBytes(bytes) - - // If we detected a format from magic bytes, use it - if (detectedFormat != null) return detectedFormat + /** + * Resolve format from magic bytes, then MIME / file-name hints (HEIC, plain text). + */ + fun detect(bytes: ByteArray, mimeType: String?, fileName: String?): DocumentFormat { + if (bytes.isNotEmpty()) { + detectFromMagicBytes(bytes)?.let { return it } + } + val mime = mimeType?.lowercase().orEmpty() + val name = fileName?.lowercase().orEmpty() + return when { + mime.contains("heic") || mime.contains("heif") || + name.endsWith(".heic") || name.endsWith(".heif") -> DocumentFormat.HEIC + mime.contains("markdown") || name.endsWith(".md") || name.endsWith(".markdown") -> + DocumentFormat.MARKDOWN + mime.contains("gpx") || name.endsWith(".gpx") || + com.app.paperstow.domain.safety.GpxTrail.looksLikeGpx(bytes) -> DocumentFormat.GPX + mime == "text/plain" || mime.startsWith("text/") || name.endsWith(".txt") -> DocumentFormat.TEXT + else -> DocumentFormat.UNKNOWN + } + } - // If magic bytes don't match any known format, try MIME type as fallback - // but still require magic bytes to match for security - return null + fun isSupportedForImport(mime: String?, fileName: String?): Boolean { + val mime = mime?.lowercase().orEmpty() + val name = fileName?.lowercase().orEmpty() + if (mime.contains("video") || mime.contains("audio") || mime.contains("dicom")) return false + return mime.contains("pdf") || + mime.contains("jpeg") || mime.contains("jpg") || + mime.contains("png") || mime.contains("webp") || + mime.contains("heic") || mime.contains("heif") || + mime.contains("bmp") || mime.contains("gif") || + mime == "text/plain" || mime.startsWith("text/") || + name.endsWith(".pdf") || name.endsWith(".jpg") || name.endsWith(".jpeg") || + name.endsWith(".png") || name.endsWith(".webp") || name.endsWith(".heic") || + name.endsWith(".heif") || name.endsWith(".bmp") || name.endsWith(".gif") || + name.endsWith(".txt") || name.endsWith(".md") || name.endsWith(".markdown") || + name.endsWith(".gpx") } /** @@ -74,14 +104,17 @@ class DocumentFormatValidator @Inject constructor() { DocumentFormat.PDF -> isPdf(bytes) DocumentFormat.JPG -> isJpeg(bytes) DocumentFormat.PNG -> isPng(bytes) + DocumentFormat.TEXT -> bytes.isNotEmpty() + DocumentFormat.MARKDOWN -> bytes.isNotEmpty() + DocumentFormat.GPX -> com.app.paperstow.domain.safety.GpxTrail.looksLikeGpx(bytes) DocumentFormat.VIDEO -> true DocumentFormat.WEBP -> isWebP(bytes) - DocumentFormat.HEIC -> true // HEIC detection is complex; trust MIME type + DocumentFormat.HEIC -> true DocumentFormat.BMP -> isBmp(bytes) DocumentFormat.GIF -> isGif(bytes) DocumentFormat.DICOM -> isDicom(bytes) - DocumentFormat.AUDIO -> true // Audio formats validated by MIME - DocumentFormat.UNKNOWN -> true // Accept anything + DocumentFormat.AUDIO -> true + DocumentFormat.UNKNOWN -> true } } diff --git a/app/src/main/java/com/app/traveldocs/data/importer/FileDocumentImporter.kt b/app/src/main/java/com/app/paperstow/data/importer/FileDocumentImporter.kt similarity index 96% rename from app/src/main/java/com/app/traveldocs/data/importer/FileDocumentImporter.kt rename to app/src/main/java/com/app/paperstow/data/importer/FileDocumentImporter.kt index d0a200d..8f1380d 100644 --- a/app/src/main/java/com/app/traveldocs/data/importer/FileDocumentImporter.kt +++ b/app/src/main/java/com/app/paperstow/data/importer/FileDocumentImporter.kt @@ -1,12 +1,12 @@ -package com.app.traveldocs.data.importer +package com.app.paperstow.data.importer import android.content.ContentResolver import android.content.Context import android.net.Uri import android.provider.OpenableColumns -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.ImportedDocument -import com.app.traveldocs.domain.repository.DocumentImporter +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.ImportedDocument +import com.app.paperstow.domain.repository.DocumentImporter import dagger.hilt.android.qualifiers.ApplicationContext import java.io.IOException import javax.inject.Inject diff --git a/app/src/main/java/com/app/traveldocs/data/local/ConsentPreferences.kt b/app/src/main/java/com/app/paperstow/data/local/ConsentPreferences.kt similarity index 84% rename from app/src/main/java/com/app/traveldocs/data/local/ConsentPreferences.kt rename to app/src/main/java/com/app/paperstow/data/local/ConsentPreferences.kt index 7d52fd7..4d773ad 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/ConsentPreferences.kt +++ b/app/src/main/java/com/app/paperstow/data/local/ConsentPreferences.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local import android.content.Context import android.content.SharedPreferences @@ -13,7 +13,6 @@ class ConsentPreferences @Inject constructor(@dagger.hilt.android.qualifiers.App private const val KEY_HAS_CONSENTED = "has_consented" private const val KEY_REGION = "selected_region" private const val KEY_ENCRYPTION_ENABLED = "encryption_enabled" - private const val KEY_PIN_WARNING_ACKNOWLEDGED = "pin_warning_acked" // Countries where personal-use encryption is generally permitted val ENCRYPTION_PERMITTED_REGIONS = listOf( @@ -39,18 +38,16 @@ class ConsentPreferences @Inject constructor(@dagger.hilt.android.qualifiers.App val hasConsented: Boolean get() = prefs.getBoolean(KEY_HAS_CONSENTED, false) val selectedRegion: String get() = prefs.getString(KEY_REGION, "") ?: "" val encryptionEnabled: Boolean get() = prefs.getBoolean(KEY_ENCRYPTION_ENABLED, false) - val pinWarningAcknowledged: Boolean get() = prefs.getBoolean(KEY_PIN_WARNING_ACKNOWLEDGED, false) fun isEncryptionPermittedForRegion(region: String): Boolean { return region in ENCRYPTION_PERMITTED_REGIONS } - fun saveConsent(region: String, encryptionEnabled: Boolean, pinWarningAcked: Boolean) { + fun saveConsent(region: String, encryptionEnabled: Boolean) { prefs.edit() .putBoolean(KEY_HAS_CONSENTED, true) .putString(KEY_REGION, region) .putBoolean(KEY_ENCRYPTION_ENABLED, encryptionEnabled) - .putBoolean(KEY_PIN_WARNING_ACKNOWLEDGED, pinWarningAcked) .apply() } } diff --git a/app/src/main/java/com/app/traveldocs/data/local/DatabaseRecovery.kt b/app/src/main/java/com/app/paperstow/data/local/DatabaseRecovery.kt similarity index 96% rename from app/src/main/java/com/app/traveldocs/data/local/DatabaseRecovery.kt rename to app/src/main/java/com/app/paperstow/data/local/DatabaseRecovery.kt index 7431332..9bfd725 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/DatabaseRecovery.kt +++ b/app/src/main/java/com/app/paperstow/data/local/DatabaseRecovery.kt @@ -1,7 +1,7 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local import android.content.Context -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger import java.io.File import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/com/app/traveldocs/data/local/DisclaimerPreferences.kt b/app/src/main/java/com/app/paperstow/data/local/DisclaimerPreferences.kt similarity index 96% rename from app/src/main/java/com/app/traveldocs/data/local/DisclaimerPreferences.kt rename to app/src/main/java/com/app/paperstow/data/local/DisclaimerPreferences.kt index 95607d4..c60a9c9 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/DisclaimerPreferences.kt +++ b/app/src/main/java/com/app/paperstow/data/local/DisclaimerPreferences.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local import android.content.Context import dagger.hilt.android.qualifiers.ApplicationContext diff --git a/app/src/main/java/com/app/traveldocs/data/local/DocumentRepositoryImpl.kt b/app/src/main/java/com/app/paperstow/data/local/DocumentRepositoryImpl.kt similarity index 83% rename from app/src/main/java/com/app/traveldocs/data/local/DocumentRepositoryImpl.kt rename to app/src/main/java/com/app/paperstow/data/local/DocumentRepositoryImpl.kt index 5591b76..87bf05a 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/DocumentRepositoryImpl.kt +++ b/app/src/main/java/com/app/paperstow/data/local/DocumentRepositoryImpl.kt @@ -1,19 +1,19 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local import androidx.room.withTransaction -import com.app.traveldocs.data.local.dao.DocumentDao -import com.app.traveldocs.data.local.dao.DocumentMetadataDao -import com.app.traveldocs.data.local.dao.DocumentTagDao -import com.app.traveldocs.data.local.entity.DocumentEntity -import com.app.traveldocs.data.local.entity.DocumentMetadataEntity -import com.app.traveldocs.data.local.entity.DocumentTagEntity -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.MetadataField -import com.app.traveldocs.domain.model.SearchQuery -import com.app.traveldocs.domain.model.Tag -import com.app.traveldocs.domain.repository.DocumentRepository +import com.app.paperstow.data.local.dao.DocumentDao +import com.app.paperstow.data.local.dao.DocumentMetadataDao +import com.app.paperstow.data.local.dao.DocumentTagDao +import com.app.paperstow.data.local.entity.DocumentEntity +import com.app.paperstow.data.local.entity.DocumentMetadataEntity +import com.app.paperstow.data.local.entity.DocumentTagEntity +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.MetadataField +import com.app.paperstow.domain.model.SearchQuery +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.DocumentRepository import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import java.time.Instant @@ -89,6 +89,14 @@ class DocumentRepositoryImpl @Inject constructor( } } + override suspend fun updateName( + documentId: String, + originalFileName: String, + updatedAt: Instant + ): Result = runCatching { + documentDao.updateNameAndTimestamp(documentId, originalFileName, updatedAt.toEpochMilli()) + } + override suspend fun delete(documentId: String): Result { return try { database.withTransaction { @@ -106,6 +114,10 @@ class DocumentRepositoryImpl @Inject constructor( return documentDao.getCount(memberId) } + override suspend fun updateOcrText(documentId: String, ocrText: String): Result = runCatching { + documentDao.updateOcrText(documentId, ocrText.take(SearchIndex.MAX_CHARS)) + } + override suspend fun search(memberId: String, query: SearchQuery): List { val entities = when { query.tags.isNotEmpty() && query.freeText != null -> { @@ -185,7 +197,8 @@ class DocumentRepositoryImpl @Inject constructor( createdAt = document.createdAt.toEpochMilli(), updatedAt = document.updatedAt.toEpochMilli(), extractionConfidence = document.extractionConfidence, - requiresManualReview = document.requiresManualReview + requiresManualReview = document.requiresManualReview, + ocrText = "" ) } } diff --git a/app/src/main/java/com/app/paperstow/data/local/FeatureFlags.kt b/app/src/main/java/com/app/paperstow/data/local/FeatureFlags.kt new file mode 100644 index 0000000..7651adb --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/local/FeatureFlags.kt @@ -0,0 +1,36 @@ +package com.app.paperstow.data.local + +import android.content.Context + +/** + * Legacy SharedPreferences flags. + * + * Experimental cloud, GPS, WiFi, Auto, and DICOM features were removed from the + * Play Store build. These readers stay so existing preference files do not crash + * older call sites, but all default to OFF and setters are no-ops for removed features. + */ +object FeatureFlags { + fun isExperimentalEnabled(context: Context) = false + fun isGoogleDriveEnabled(context: Context) = false + fun isS3Enabled(context: Context) = false + fun isGpsTrackingEnabled(context: Context) = false + fun setGpsTracking(context: Context, v: Boolean) { /* removed */ } + + fun isBackupRestoreEnabled(context: Context) = true + fun isWifiShareEnabled(context: Context) = false + fun setWifiShare(context: Context, v: Boolean) { /* removed */ } + + fun isAudioPlaybackEnabled(context: Context) = false + fun setAudioPlayback(context: Context, v: Boolean) { /* removed */ } + + fun isExtendedFormatsEnabled(context: Context) = false + fun setExtendedFormats(context: Context, v: Boolean) { /* removed */ } + + fun setExperimental(context: Context, v: Boolean) { /* removed */ } + fun setGoogleDrive(context: Context, v: Boolean) { /* removed */ } + fun setS3(context: Context, v: Boolean) { /* removed */ } + fun setBackupRestore(context: Context, v: Boolean) { /* always on */ } + + fun isFormatEnabled(context: Context, format: String) = format != "dicom" + fun setFormatEnabled(context: Context, format: String, v: Boolean) { /* removed */ } +} diff --git a/app/src/main/java/com/app/traveldocs/data/local/InputSanitizer.kt b/app/src/main/java/com/app/paperstow/data/local/InputSanitizer.kt similarity index 94% rename from app/src/main/java/com/app/traveldocs/data/local/InputSanitizer.kt rename to app/src/main/java/com/app/paperstow/data/local/InputSanitizer.kt index 6d4e1fd..ddd464e 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/InputSanitizer.kt +++ b/app/src/main/java/com/app/paperstow/data/local/InputSanitizer.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local object InputSanitizer { private val TAG_REGEX = Regex("[a-zA-Z0-9 _\\-]+") diff --git a/app/src/main/java/com/app/traveldocs/data/local/SearchEngineImpl.kt b/app/src/main/java/com/app/paperstow/data/local/SearchEngineImpl.kt similarity index 79% rename from app/src/main/java/com/app/traveldocs/data/local/SearchEngineImpl.kt rename to app/src/main/java/com/app/paperstow/data/local/SearchEngineImpl.kt index c3f5667..4b92697 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/SearchEngineImpl.kt +++ b/app/src/main/java/com/app/paperstow/data/local/SearchEngineImpl.kt @@ -1,15 +1,15 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.QueryIntent -import com.app.traveldocs.domain.model.SearchQuery -import com.app.traveldocs.domain.model.SearchResult -import com.app.traveldocs.domain.repository.DocumentChecklistGenerator -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.NaturalLanguageParser -import com.app.traveldocs.domain.repository.SearchEngine +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.QueryIntent +import com.app.paperstow.domain.model.SearchQuery +import com.app.paperstow.domain.model.SearchResult +import com.app.paperstow.domain.repository.DocumentChecklistGenerator +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.NaturalLanguageParser +import com.app.paperstow.domain.repository.SearchEngine import kotlinx.coroutines.flow.first import java.time.Instant import javax.inject.Inject @@ -45,15 +45,7 @@ class SearchEngineImpl @Inject constructor( return when (parseResult.intent) { QueryIntent.DOCUMENT_SEARCH -> { - val documents = if (parseResult.searchTerms.isNotEmpty() && parseResult.searchTerms.any { it.length > 4 }) { - val searchQuery = SearchQuery( - tags = parseResult.searchTerms, - freeText = query - ) - documentRepository.search(memberId, searchQuery) - } else { - searchFreeForm(memberId, query) - } + val documents = searchFreeForm(memberId, query) DebugLogger.i("Search", "DOCUMENT_SEARCH result: ${documents.size} documents") SearchResult.DocumentResults(documents) } diff --git a/app/src/main/java/com/app/paperstow/data/local/SearchIndex.kt b/app/src/main/java/com/app/paperstow/data/local/SearchIndex.kt new file mode 100644 index 0000000..eb1606c --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/local/SearchIndex.kt @@ -0,0 +1,76 @@ +package com.app.paperstow.data.local + +import android.graphics.Bitmap +import android.graphics.Color +import android.graphics.pdf.PdfRenderer +import android.os.ParcelFileDescriptor +import com.app.paperstow.domain.model.DocumentFormat +import java.io.ByteArrayOutputStream +import java.io.File + +object SearchIndex { + const val MAX_CHARS = 50_000 + + fun textForImport(format: DocumentFormat, bytes: ByteArray, ocrText: String): String { + val fromFile = when (format) { + DocumentFormat.TEXT, DocumentFormat.MARKDOWN, DocumentFormat.GPX -> + runCatching { String(bytes, Charsets.UTF_8) }.getOrDefault("") + else -> "" + } + return (ocrText.ifBlank { fromFile }).trim().take(MAX_CHARS) + } + + fun isImage(format: DocumentFormat): Boolean = format in setOf( + DocumentFormat.JPG, DocumentFormat.PNG, DocumentFormat.WEBP, + DocumentFormat.HEIC, DocumentFormat.BMP, DocumentFormat.GIF + ) + + fun isPlainText(format: DocumentFormat): Boolean = format in setOf( + DocumentFormat.TEXT, DocumentFormat.MARKDOWN, DocumentFormat.GPX + ) + + /** Image bytes ML Kit can read: the file itself, or rasterized PDF pages. */ + fun imagesForOcr(format: DocumentFormat, bytes: ByteArray, cacheDir: File): List = when { + isImage(format) -> listOf(bytes) + format == DocumentFormat.PDF -> pdfPagesAsJpeg(bytes, cacheDir) + else -> emptyList() + } + + fun pdfPagesAsJpeg(bytes: ByteArray, cacheDir: File, maxPages: Int = 4): List { + if (bytes.size < 5 || String(bytes, 0, 5, Charsets.ISO_8859_1) != "%PDF-") return emptyList() + val file = File.createTempFile("ocr", ".pdf", cacheDir) + return try { + file.writeBytes(bytes) + val pfd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY) + val renderer = PdfRenderer(pfd) + try { + val count = minOf(renderer.pageCount, maxPages) + (0 until count).mapNotNull { i -> + val page = renderer.openPage(i) + try { + val w = (page.width * 1.5f).toInt().coerceIn(400, 1600) + val h = (page.height * 1.5f).toInt().coerceIn(400, 2200) + val bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) + // PdfRenderer paints onto a transparent bitmap. JPEG drops alpha, + // so unpainted pixels become black and ML Kit reads nothing. + bitmap.eraseColor(Color.WHITE) + page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY) + val out = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, 80, out) + bitmap.recycle() + out.toByteArray() + } finally { + page.close() + } + } + } finally { + renderer.close() + pfd.close() + } + } catch (_: Exception) { + emptyList() + } finally { + file.delete() + } + } +} diff --git a/app/src/main/java/com/app/paperstow/data/local/SearchIndexRebuilder.kt b/app/src/main/java/com/app/paperstow/data/local/SearchIndexRebuilder.kt new file mode 100644 index 0000000..29fb622 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/local/SearchIndexRebuilder.kt @@ -0,0 +1,82 @@ +package com.app.paperstow.data.local + +import android.content.Context +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.MetadataExtractor +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.withContext +import javax.inject.Inject +import javax.inject.Singleton + +data class IndexRebuildState( + val running: Boolean = false, + val current: Int = 0, + val total: Int = 0, + val fileName: String = "", + val excerpt: String = "", + val done: Boolean = false, + val error: String? = null +) + +@Singleton +class SearchIndexRebuilder @Inject constructor( + @ApplicationContext private val context: Context, + private val documentRepository: DocumentRepository, + private val fileStorage: DocumentFileStorage, + private val metadataExtractor: MetadataExtractor +) { + private val _state = MutableStateFlow(IndexRebuildState()) + val state: StateFlow = _state.asStateFlow() + + suspend fun rebuild() = withContext(Dispatchers.IO) { + if (_state.value.running) return@withContext + try { + val docs = documentRepository.getAll("default-member").first() + _state.value = IndexRebuildState(running = true, total = docs.size) + docs.forEachIndexed { index, doc -> + val name = doc.originalFileName ?: doc.id + _state.value = _state.value.copy( + current = index + 1, + fileName = name, + excerpt = "Reading…" + ) + val bytes = fileStorage.retrieve(doc.id).getOrNull() + val text = if (bytes == null) { + "" + } else { + extractText(doc.format, bytes) + } + documentRepository.updateOcrText(doc.id, text) + _state.value = _state.value.copy( + current = index + 1, + fileName = name, + excerpt = text.ifBlank { "(no text found)" } + ) + DebugLogger.i("SearchIndex", "Indexed ${index + 1}/${docs.size} $name chars=${text.length}") + } + _state.value = _state.value.copy(running = false, done = true, excerpt = _state.value.excerpt) + } catch (e: Exception) { + DebugLogger.e("SearchIndex", "Rebuild failed", e) + _state.value = _state.value.copy(running = false, error = e.message ?: "Rebuild failed") + } + } + + private suspend fun extractText(format: com.app.paperstow.domain.model.DocumentFormat, bytes: ByteArray): String { + if (SearchIndex.isPlainText(format)) { + return SearchIndex.textForImport(format, bytes, "") + } + val chunks = SearchIndex.imagesForOcr(format, bytes, context.cacheDir).mapNotNull { page -> + val outcome = metadataExtractor.extract(page) + outcome.onFailure { e -> DebugLogger.w("SearchIndex", "OCR failed: ${e.message}") } + outcome.getOrNull()?.rawText + } + return chunks.joinToString("\n").trim().take(SearchIndex.MAX_CHARS) + } +} diff --git a/app/src/main/java/com/app/paperstow/data/local/TagColorStore.kt b/app/src/main/java/com/app/paperstow/data/local/TagColorStore.kt new file mode 100644 index 0000000..f8c93fb --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/local/TagColorStore.kt @@ -0,0 +1,163 @@ +package com.app.paperstow.data.local + +import android.content.Context +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.net.Uri +import java.io.File +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Optional folder photo for each tag. Photos stay on this phone. + */ +@Singleton +class TagColorStore @Inject constructor( + @dagger.hilt.android.qualifiers.ApplicationContext private val context: Context +) { + companion object { + private const val PREFS = "tag_colors" + + val PALETTE = listOf( + 0xFF1E88E5.toInt(), + 0xFF00C853.toInt(), + 0xFFFF6D00.toInt(), + 0xFFFF1744.toInt(), + 0xFFAA00FF.toInt(), + 0xFFFFD600.toInt(), + 0xFF00B8D4.toInt(), + 0xFFF50057.toInt(), + 0xFF304FFE.toInt(), + 0xFF64DD17.toInt(), + 0xFFFFAB00.toInt(), + 0xFF00BFA5.toInt(), + 0xFFD500F9.toInt(), + 0xFFFF3D00.toInt(), + 0xFF2979FF.toInt(), + 0xFF76FF03.toInt() + ) + + val EMOJIS = listOf( + "✈️", "🏨", "🛂", "🎫", "🚗", "💊", "📝", "📍", + "👨‍👩‍👧", "💼", "🔑", "💳", "📄", "✅", "🎒", "🌍", + "🚆", "🚢", "🏠", "⭐", "🔔", "💡" + ) + + fun contrastOn(color: Int): Int { + val r = (color shr 16) and 0xFF + val g = (color shr 8) and 0xFF + val b = color and 0xFF + val luminance = (0.299 * r + 0.587 * g + 0.114 * b) + return if (luminance > 160) 0xFF212121.toInt() else 0xFFFFFFFF.toInt() + } + } + + private fun prefs() = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) + + private fun iconDir(): File = File(context.filesDir, "tag_icons").apply { mkdirs() } + + fun getColor(tagName: String): Int { + val stored = prefs().getInt("color_$tagName", -1) + if (stored != -1) return stored + val idx = (tagName.hashCode().and(0x7FFFFFFF)) % PALETTE.size + return PALETTE[idx] + } + + fun setColor(tagName: String, color: Int) { + prefs().edit().putInt("color_$tagName", color).apply() + } + + fun getEmoji(tagName: String): String? { + val stored = prefs().getString("emoji_$tagName", null) + if (!stored.isNullOrBlank()) return stored + return defaultEmoji(tagName) + } + + fun setEmoji(tagName: String, emoji: String?) { + val edit = prefs().edit() + if (emoji.isNullOrBlank()) edit.remove("emoji_$tagName") + else edit.putString("emoji_$tagName", emoji) + edit.apply() + } + + fun imageFile(tagName: String): File? { + val file = File(iconDir(), fileName(tagName)) + return if (file.exists() && file.length() > 0) file else null + } + + fun saveImage(tagName: String, uri: Uri): Boolean { + return runCatching { + context.contentResolver.openInputStream(uri)?.use { input -> + val decoded = BitmapFactory.decodeStream(input) ?: return false + val size = maxOf(decoded.width, decoded.height) + val scaled = if (size > 256) { + val factor = 256f / size + Bitmap.createScaledBitmap( + decoded, + (decoded.width * factor).toInt().coerceAtLeast(1), + (decoded.height * factor).toInt().coerceAtLeast(1), + true + ) + } else decoded + val out = File(iconDir(), fileName(tagName)) + out.outputStream().use { stream -> + scaled.compress(Bitmap.CompressFormat.JPEG, 85, stream) + } + if (scaled !== decoded) scaled.recycle() + } ?: return false + true + }.getOrDefault(false) + } + + fun clearImage(tagName: String) { + File(iconDir(), fileName(tagName)).delete() + } + + fun isShownOnHome(tagName: String): Boolean = + prefs().getBoolean("show_home_$tagName", true) + + fun setShownOnHome(tagName: String, shown: Boolean) { + prefs().edit().putBoolean("show_home_$tagName", shown).apply() + } + + fun renameLook(oldName: String, newName: String) { + if (oldName == newName) return + setColor(newName, getColor(oldName)) + prefs().getString("emoji_$oldName", null)?.let { setEmoji(newName, it) } + setShownOnHome(newName, isShownOnHome(oldName)) + val oldFile = File(iconDir(), fileName(oldName)) + if (oldFile.exists()) oldFile.copyTo(File(iconDir(), fileName(newName)), overwrite = true) + clearLook(oldName) + } + + fun clearLook(tagName: String) { + prefs().edit() + .remove("color_$tagName") + .remove("emoji_$tagName") + .remove("show_home_$tagName") + .apply() + clearImage(tagName) + } + + private fun fileName(tagName: String): String { + val safe = tagName.lowercase().replace(Regex("[^a-z0-9._-]"), "_").take(40) + return "${safe}_${tagName.hashCode() and 0x7FFFFFFF}.jpg" + } + + private fun defaultEmoji(tagName: String): String? { + val n = tagName.lowercase() + return when { + n.contains("passport") -> "🛂" + n.contains("visa") -> "🎫" + n.contains("ticket") || n.contains("flight") -> "✈️" + n.contains("hotel") -> "🏨" + n.contains("health") || n.contains("insurance") || n.contains("vaccine") -> "💊" + n.contains("note") -> "📝" + n.contains("plan") || n.contains("check") -> "✅" + n.contains("trail") -> "📍" + n.contains("car") || n.contains("rental") -> "🚗" + n.contains("sample") || n.contains("trip") -> "🌍" + else -> null + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/local/TagRepositoryImpl.kt b/app/src/main/java/com/app/paperstow/data/local/TagRepositoryImpl.kt similarity index 69% rename from app/src/main/java/com/app/traveldocs/data/local/TagRepositoryImpl.kt rename to app/src/main/java/com/app/paperstow/data/local/TagRepositoryImpl.kt index 77a09a0..620db46 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/TagRepositoryImpl.kt +++ b/app/src/main/java/com/app/paperstow/data/local/TagRepositoryImpl.kt @@ -1,9 +1,9 @@ -package com.app.traveldocs.data.local +package com.app.paperstow.data.local -import com.app.traveldocs.data.local.dao.DocumentTagDao -import com.app.traveldocs.data.local.entity.DocumentTagEntity -import com.app.traveldocs.domain.model.Tag -import com.app.traveldocs.domain.repository.TagRepository +import com.app.paperstow.data.local.dao.DocumentTagDao +import com.app.paperstow.data.local.entity.DocumentTagEntity +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.TagRepository import javax.inject.Inject import javax.inject.Singleton @@ -14,6 +14,7 @@ class TagRepositoryImpl @Inject constructor( companion object { private const val MAX_TAGS_PER_DOCUMENT = 20 + const val CATALOG_DOCUMENT_ID = DocumentTagDao.CATALOG_DOCUMENT_ID } override suspend fun getTagsForDocument(documentId: String): List { @@ -41,7 +42,6 @@ class TagRepositoryImpl @Inject constructor( override suspend fun removeTag(documentId: String, tagName: String): Result { // System tags (__ prefix) cannot be removed directly by the user. - // They are managed by their owning feature (e.g., PIN lock manages __PIN_PROTECTED). if (tagName.startsWith("__")) { return Result.failure(IllegalArgumentException("System tag '$tagName' cannot be removed manually")) } @@ -71,6 +71,32 @@ class TagRepositoryImpl @Inject constructor( .distinctBy { it.name } } + override suspend fun createStandaloneTag(memberId: String, tagName: String): Result { + val name = tagName.trim() + if (name.isEmpty()) { + return Result.failure(IllegalArgumentException("Tag name is empty")) + } + if (name.startsWith("__")) { + return Result.failure(IllegalArgumentException("System tag names are reserved")) + } + return try { + val existing = documentTagDao.getAllTagsForMember(memberId).any { it.tag.equals(name, ignoreCase = false) } + if (!existing) { + documentTagDao.insert( + DocumentTagEntity( + documentId = CATALOG_DOCUMENT_ID, + tag = name, + isAutoGenerated = false, + createdAt = System.currentTimeMillis() + ) + ) + } + Result.success(Unit) + } catch (e: Exception) { + Result.failure(e) + } + } + suspend fun getTagUsageCount(memberId: String, tagName: String): Int { return documentTagDao.getDocumentCountForTag(memberId, tagName) } diff --git a/app/src/main/java/com/app/paperstow/data/local/TravelDocsDatabase.kt b/app/src/main/java/com/app/paperstow/data/local/TravelDocsDatabase.kt new file mode 100644 index 0000000..6825144 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/local/TravelDocsDatabase.kt @@ -0,0 +1,49 @@ +package com.app.paperstow.data.local + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase +import com.app.paperstow.data.local.dao.DocumentDao +import com.app.paperstow.data.local.dao.DocumentMetadataDao +import com.app.paperstow.data.local.dao.DocumentTagDao +import com.app.paperstow.data.local.dao.FamilyMemberDao +import com.app.paperstow.data.local.dao.GpsTrackDao +import com.app.paperstow.data.local.entity.DocumentEntity +import com.app.paperstow.data.local.entity.DocumentMetadataEntity +import com.app.paperstow.data.local.entity.DocumentTagEntity +import com.app.paperstow.data.local.entity.FamilyMemberEntity +import com.app.paperstow.data.local.entity.GpsTrackEntity + +@Database( + entities = [ + DocumentEntity::class, + DocumentMetadataEntity::class, + DocumentTagEntity::class, + FamilyMemberEntity::class, + GpsTrackEntity::class + ], + version = 4, + exportSchema = false +) +abstract class TravelDocsDatabase : RoomDatabase() { + abstract fun documentDao(): DocumentDao + abstract fun documentMetadataDao(): DocumentMetadataDao + abstract fun documentTagDao(): DocumentTagDao + abstract fun familyMemberDao(): FamilyMemberDao + abstract fun gpsTrackDao(): GpsTrackDao + + companion object { + val MIGRATION_2_3 = object : Migration(2, 3) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE gps_tracks ADD COLUMN batteryPercent INTEGER NOT NULL DEFAULT -1") + } + } + + val MIGRATION_3_4 = object : Migration(3, 4) { + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE documents ADD COLUMN ocrText TEXT NOT NULL DEFAULT ''") + } + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/local/auth/AuthRepositoryImpl.kt b/app/src/main/java/com/app/paperstow/data/local/auth/AuthRepositoryImpl.kt similarity index 94% rename from app/src/main/java/com/app/traveldocs/data/local/auth/AuthRepositoryImpl.kt rename to app/src/main/java/com/app/paperstow/data/local/auth/AuthRepositoryImpl.kt index 98b08b1..2c916e3 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/auth/AuthRepositoryImpl.kt +++ b/app/src/main/java/com/app/paperstow/data/local/auth/AuthRepositoryImpl.kt @@ -1,12 +1,12 @@ -package com.app.traveldocs.data.local.auth +package com.app.paperstow.data.local.auth import android.content.Context -import com.app.traveldocs.data.local.crypto.PinHasher -import com.app.traveldocs.data.local.dao.FamilyMemberDao -import com.app.traveldocs.data.local.entity.FamilyMemberEntity -import com.app.traveldocs.domain.model.LockoutState -import com.app.traveldocs.domain.repository.AuthRepository -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.data.local.crypto.PinHasher +import com.app.paperstow.data.local.dao.FamilyMemberDao +import com.app.paperstow.data.local.entity.FamilyMemberEntity +import com.app.paperstow.domain.model.LockoutState +import com.app.paperstow.domain.repository.AuthRepository +import com.app.paperstow.debug.DebugLogger import java.util.Base64 import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/com/app/traveldocs/data/local/auth/AuthSessionManager.kt b/app/src/main/java/com/app/paperstow/data/local/auth/AuthSessionManager.kt similarity index 92% rename from app/src/main/java/com/app/traveldocs/data/local/auth/AuthSessionManager.kt rename to app/src/main/java/com/app/paperstow/data/local/auth/AuthSessionManager.kt index 3e14013..65e1626 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/auth/AuthSessionManager.kt +++ b/app/src/main/java/com/app/paperstow/data/local/auth/AuthSessionManager.kt @@ -1,7 +1,7 @@ -package com.app.traveldocs.data.local.auth +package com.app.paperstow.data.local.auth -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.repository.SessionManager +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.repository.SessionManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.SupervisorJob diff --git a/app/src/main/java/com/app/paperstow/data/local/auth/SecurityAlertService.kt b/app/src/main/java/com/app/paperstow/data/local/auth/SecurityAlertService.kt new file mode 100644 index 0000000..267f7b7 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/local/auth/SecurityAlertService.kt @@ -0,0 +1,26 @@ +package com.app.paperstow.data.local.auth + +import android.content.Context +import com.app.paperstow.debug.DebugLogger +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Records PIN lockout events locally. Does not send SMS or show notifications + * (those require extra Play declarations). + */ +@Singleton +class SecurityAlertService @Inject constructor( + @dagger.hilt.android.qualifiers.ApplicationContext + private val context: Context, + private val securityPreferences: SecurityPreferences +) { + fun onLockoutTriggered() { + val timestamp = SimpleDateFormat("HH:mm dd-MMM-yyyy", Locale.US).format(Date()) + securityPreferences.lastAlertTime = System.currentTimeMillis() + DebugLogger.i("SecurityAlert", "PIN lockout at $timestamp") + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/local/auth/SecurityPreferences.kt b/app/src/main/java/com/app/paperstow/data/local/auth/SecurityPreferences.kt similarity index 85% rename from app/src/main/java/com/app/traveldocs/data/local/auth/SecurityPreferences.kt rename to app/src/main/java/com/app/paperstow/data/local/auth/SecurityPreferences.kt index 4333145..5dd51ca 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/auth/SecurityPreferences.kt +++ b/app/src/main/java/com/app/paperstow/data/local/auth/SecurityPreferences.kt @@ -1,10 +1,10 @@ -package com.app.traveldocs.data.local.auth +package com.app.paperstow.data.local.auth import android.content.Context import android.content.SharedPreferences import androidx.security.crypto.EncryptedSharedPreferences -import androidx.security.crypto.MasterKeys -import com.app.traveldocs.debug.DebugLogger +import androidx.security.crypto.MasterKey +import com.app.paperstow.debug.DebugLogger import javax.inject.Inject import javax.inject.Singleton @@ -21,9 +21,13 @@ class SecurityPreferences @Inject constructor(@dagger.hilt.android.qualifiers.Ap private val prefs: SharedPreferences by lazy { try { - val masterKey = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) + val masterKey = MasterKey.Builder(context) + .setKeyScheme(MasterKey.KeyScheme.AES256_GCM) + .build() EncryptedSharedPreferences.create( - PREFS_NAME, masterKey, context, + context, + PREFS_NAME, + masterKey, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) diff --git a/app/src/main/java/com/app/traveldocs/data/local/auth/TimeProvider.kt b/app/src/main/java/com/app/paperstow/data/local/auth/TimeProvider.kt similarity index 88% rename from app/src/main/java/com/app/traveldocs/data/local/auth/TimeProvider.kt rename to app/src/main/java/com/app/paperstow/data/local/auth/TimeProvider.kt index 2d17a0b..9269878 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/auth/TimeProvider.kt +++ b/app/src/main/java/com/app/paperstow/data/local/auth/TimeProvider.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.auth +package com.app.paperstow.data.local.auth import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/com/app/traveldocs/data/local/crypto/DeviceKeyManager.kt b/app/src/main/java/com/app/paperstow/data/local/crypto/DeviceKeyManager.kt similarity index 98% rename from app/src/main/java/com/app/traveldocs/data/local/crypto/DeviceKeyManager.kt rename to app/src/main/java/com/app/paperstow/data/local/crypto/DeviceKeyManager.kt index 3ca9448..cbc59dc 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/crypto/DeviceKeyManager.kt +++ b/app/src/main/java/com/app/paperstow/data/local/crypto/DeviceKeyManager.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.crypto +package com.app.paperstow.data.local.crypto import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties diff --git a/app/src/main/java/com/app/traveldocs/data/local/crypto/KeyDerivation.kt b/app/src/main/java/com/app/paperstow/data/local/crypto/KeyDerivation.kt similarity index 97% rename from app/src/main/java/com/app/traveldocs/data/local/crypto/KeyDerivation.kt rename to app/src/main/java/com/app/paperstow/data/local/crypto/KeyDerivation.kt index b1ddb96..d122db9 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/crypto/KeyDerivation.kt +++ b/app/src/main/java/com/app/paperstow/data/local/crypto/KeyDerivation.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.crypto +package com.app.paperstow.data.local.crypto import org.bouncycastle.crypto.digests.SHA256Digest import org.bouncycastle.crypto.generators.HKDFBytesGenerator diff --git a/app/src/main/java/com/app/traveldocs/data/local/crypto/PinHasher.kt b/app/src/main/java/com/app/paperstow/data/local/crypto/PinHasher.kt similarity index 98% rename from app/src/main/java/com/app/traveldocs/data/local/crypto/PinHasher.kt rename to app/src/main/java/com/app/paperstow/data/local/crypto/PinHasher.kt index a47caeb..5816d97 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/crypto/PinHasher.kt +++ b/app/src/main/java/com/app/paperstow/data/local/crypto/PinHasher.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.crypto +package com.app.paperstow.data.local.crypto import org.bouncycastle.crypto.generators.Argon2BytesGenerator import org.bouncycastle.crypto.params.Argon2Parameters diff --git a/app/src/main/java/com/app/traveldocs/data/local/dao/DocumentDao.kt b/app/src/main/java/com/app/paperstow/data/local/dao/DocumentDao.kt similarity index 67% rename from app/src/main/java/com/app/traveldocs/data/local/dao/DocumentDao.kt rename to app/src/main/java/com/app/paperstow/data/local/dao/DocumentDao.kt index 77c0707..90500da 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/dao/DocumentDao.kt +++ b/app/src/main/java/com/app/paperstow/data/local/dao/DocumentDao.kt @@ -1,10 +1,10 @@ -package com.app.traveldocs.data.local.dao +package com.app.paperstow.data.local.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.app.traveldocs.data.local.entity.DocumentEntity +import com.app.paperstow.data.local.entity.DocumentEntity import kotlinx.coroutines.flow.Flow @Dao @@ -19,9 +19,18 @@ interface DocumentDao { @Query("SELECT * FROM documents WHERE id = :documentId") suspend fun getById(documentId: String): DocumentEntity? + @Query("SELECT * FROM documents") + suspend fun getAll(): List + @Query("DELETE FROM documents WHERE id = :documentId") suspend fun delete(documentId: String) + @Query("UPDATE documents SET originalFileName = :originalFileName, updatedAt = :updatedAt WHERE id = :id") + suspend fun updateNameAndTimestamp(id: String, originalFileName: String, updatedAt: Long) + + @Query("UPDATE documents SET ocrText = :ocrText WHERE id = :id") + suspend fun updateOcrText(id: String, ocrText: String) + @Query("SELECT COUNT(*) FROM documents WHERE memberId = :memberId") suspend fun getCount(memberId: String): Int @@ -31,7 +40,10 @@ interface DocumentDao { LEFT JOIN document_tags dt ON d.id = dt.documentId LEFT JOIN document_metadata dm ON d.id = dm.documentId WHERE d.memberId = :memberId - AND (:freeText IS NULL OR dt.tag LIKE '%' || :freeText || '%' OR dm.value LIKE '%' || :freeText || '%') + AND (:freeText IS NULL OR d.originalFileName LIKE '%' || :freeText || '%' + OR d.ocrText LIKE '%' || :freeText || '%' + OR dt.tag LIKE '%' || :freeText || '%' + OR dm.value LIKE '%' || :freeText || '%') ORDER BY d.updatedAt DESC """ ) @@ -56,7 +68,10 @@ interface DocumentDao { LEFT JOIN document_metadata dm ON d.id = dm.documentId WHERE d.memberId = :memberId AND dt.tag IN (:tags) - AND (:freeText IS NULL OR dt.tag LIKE '%' || :freeText || '%' OR dm.value LIKE '%' || :freeText || '%') + AND (:freeText IS NULL OR d.originalFileName LIKE '%' || :freeText || '%' + OR d.ocrText LIKE '%' || :freeText || '%' + OR dt.tag LIKE '%' || :freeText || '%' + OR dm.value LIKE '%' || :freeText || '%') GROUP BY d.id HAVING COUNT(DISTINCT dt.tag) = :tagCount ORDER BY d.updatedAt DESC diff --git a/app/src/main/java/com/app/traveldocs/data/local/dao/DocumentMetadataDao.kt b/app/src/main/java/com/app/paperstow/data/local/dao/DocumentMetadataDao.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/data/local/dao/DocumentMetadataDao.kt rename to app/src/main/java/com/app/paperstow/data/local/dao/DocumentMetadataDao.kt index db01566..5710bf1 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/dao/DocumentMetadataDao.kt +++ b/app/src/main/java/com/app/paperstow/data/local/dao/DocumentMetadataDao.kt @@ -1,10 +1,10 @@ -package com.app.traveldocs.data.local.dao +package com.app.paperstow.data.local.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.app.traveldocs.data.local.entity.DocumentMetadataEntity +import com.app.paperstow.data.local.entity.DocumentMetadataEntity @Dao interface DocumentMetadataDao { diff --git a/app/src/main/java/com/app/traveldocs/data/local/dao/DocumentTagDao.kt b/app/src/main/java/com/app/paperstow/data/local/dao/DocumentTagDao.kt similarity index 56% rename from app/src/main/java/com/app/traveldocs/data/local/dao/DocumentTagDao.kt rename to app/src/main/java/com/app/paperstow/data/local/dao/DocumentTagDao.kt index 55318a2..2790ab9 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/dao/DocumentTagDao.kt +++ b/app/src/main/java/com/app/paperstow/data/local/dao/DocumentTagDao.kt @@ -1,14 +1,18 @@ -package com.app.traveldocs.data.local.dao +package com.app.paperstow.data.local.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.app.traveldocs.data.local.entity.DocumentTagEntity +import com.app.paperstow.data.local.entity.DocumentTagEntity @Dao interface DocumentTagDao { + companion object { + const val CATALOG_DOCUMENT_ID = "__tag_catalog__" + } + @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insert(tag: DocumentTagEntity) @@ -26,12 +30,19 @@ interface DocumentTagDao { @Query( """ - DELETE FROM document_tags - WHERE tag = :tag - AND documentId IN (SELECT id FROM documents WHERE memberId = :memberId) + DELETE FROM document_tags + WHERE tag = :tag + AND ( + documentId = :catalogId + OR documentId IN (SELECT id FROM documents WHERE memberId = :memberId) + ) """ ) - suspend fun deleteTagGlobally(memberId: String, tag: String) + suspend fun deleteTagGlobally( + memberId: String, + tag: String, + catalogId: String = CATALOG_DOCUMENT_ID + ) @Query("SELECT COUNT(*) FROM document_tags WHERE documentId = :documentId") suspend fun getCount(documentId: String): Int @@ -39,11 +50,14 @@ interface DocumentTagDao { @Query( """ SELECT DISTINCT dt.* FROM document_tags dt - INNER JOIN documents d ON dt.documentId = d.id - WHERE d.memberId = :memberId + LEFT JOIN documents d ON dt.documentId = d.id + WHERE d.memberId = :memberId OR dt.documentId = :catalogId """ ) - suspend fun getAllTagsForMember(memberId: String): List + suspend fun getAllTagsForMember( + memberId: String, + catalogId: String = CATALOG_DOCUMENT_ID + ): List @Query( """ @@ -57,8 +71,16 @@ interface DocumentTagDao { @Query( """ UPDATE document_tags SET tag = :newName - WHERE tag = :oldName AND documentId IN (SELECT id FROM documents WHERE memberId = :memberId) + WHERE tag = :oldName AND ( + documentId = :catalogId + OR documentId IN (SELECT id FROM documents WHERE memberId = :memberId) + ) """ ) - suspend fun renameTag(memberId: String, oldName: String, newName: String) + suspend fun renameTag( + memberId: String, + oldName: String, + newName: String, + catalogId: String = CATALOG_DOCUMENT_ID + ) } diff --git a/app/src/main/java/com/app/traveldocs/data/local/dao/FamilyMemberDao.kt b/app/src/main/java/com/app/paperstow/data/local/dao/FamilyMemberDao.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/data/local/dao/FamilyMemberDao.kt rename to app/src/main/java/com/app/paperstow/data/local/dao/FamilyMemberDao.kt index 8f09c9d..8147e3e 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/dao/FamilyMemberDao.kt +++ b/app/src/main/java/com/app/paperstow/data/local/dao/FamilyMemberDao.kt @@ -1,11 +1,11 @@ -package com.app.traveldocs.data.local.dao +package com.app.paperstow.data.local.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Update -import com.app.traveldocs.data.local.entity.FamilyMemberEntity +import com.app.paperstow.data.local.entity.FamilyMemberEntity @Dao interface FamilyMemberDao { diff --git a/app/src/main/java/com/app/traveldocs/data/local/dao/GpsTrackDao.kt b/app/src/main/java/com/app/paperstow/data/local/dao/GpsTrackDao.kt similarity index 56% rename from app/src/main/java/com/app/traveldocs/data/local/dao/GpsTrackDao.kt rename to app/src/main/java/com/app/paperstow/data/local/dao/GpsTrackDao.kt index e9f548e..81e25de 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/dao/GpsTrackDao.kt +++ b/app/src/main/java/com/app/paperstow/data/local/dao/GpsTrackDao.kt @@ -1,9 +1,10 @@ -package com.app.traveldocs.data.local.dao +package com.app.paperstow.data.local.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.Query -import com.app.traveldocs.data.local.entity.GpsTrackEntity +import com.app.paperstow.data.local.entity.GpsTrackEntity +import kotlinx.coroutines.flow.Flow @Dao interface GpsTrackDao { @@ -16,12 +17,21 @@ interface GpsTrackDao { @Query("SELECT * FROM gps_tracks WHERE timestamp BETWEEN :startTime AND :endTime ORDER BY timestamp ASC") suspend fun getTracksBetween(startTime: Long, endTime: Long): List + @Query("SELECT * FROM gps_tracks ORDER BY timestamp DESC") + fun observeAllNewestFirst(): Flow> + @Query("SELECT * FROM gps_tracks ORDER BY timestamp ASC") suspend fun getAllTracks(): List @Query("SELECT COUNT(*) FROM gps_tracks") suspend fun getCount(): Int + @Query("UPDATE gps_tracks SET timestamp = :timestamp, batteryPercent = :batteryPercent WHERE id = :id") + suspend fun updateTimestampAndBattery(id: Long, timestamp: Long, batteryPercent: Int) + + @Query("DELETE FROM gps_tracks WHERE timestamp < :before") + suspend fun deleteOlderThan(before: Long) + @Query("DELETE FROM gps_tracks") suspend fun deleteAll() } diff --git a/app/src/main/java/com/app/traveldocs/data/local/entity/DocumentEntity.kt b/app/src/main/java/com/app/paperstow/data/local/entity/DocumentEntity.kt similarity index 75% rename from app/src/main/java/com/app/traveldocs/data/local/entity/DocumentEntity.kt rename to app/src/main/java/com/app/paperstow/data/local/entity/DocumentEntity.kt index 73c128e..8caca39 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/entity/DocumentEntity.kt +++ b/app/src/main/java/com/app/paperstow/data/local/entity/DocumentEntity.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.entity +package com.app.paperstow.data.local.entity import androidx.room.Entity import androidx.room.PrimaryKey @@ -14,5 +14,6 @@ data class DocumentEntity( val createdAt: Long, val updatedAt: Long, val extractionConfidence: Float?, - val requiresManualReview: Boolean = false + val requiresManualReview: Boolean = false, + val ocrText: String = "" ) diff --git a/app/src/main/java/com/app/traveldocs/data/local/entity/DocumentMetadataEntity.kt b/app/src/main/java/com/app/paperstow/data/local/entity/DocumentMetadataEntity.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/data/local/entity/DocumentMetadataEntity.kt rename to app/src/main/java/com/app/paperstow/data/local/entity/DocumentMetadataEntity.kt index 4ad4222..1d24c0a 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/entity/DocumentMetadataEntity.kt +++ b/app/src/main/java/com/app/paperstow/data/local/entity/DocumentMetadataEntity.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.entity +package com.app.paperstow.data.local.entity import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/app/traveldocs/data/local/entity/DocumentTagEntity.kt b/app/src/main/java/com/app/paperstow/data/local/entity/DocumentTagEntity.kt similarity index 84% rename from app/src/main/java/com/app/traveldocs/data/local/entity/DocumentTagEntity.kt rename to app/src/main/java/com/app/paperstow/data/local/entity/DocumentTagEntity.kt index d2fe8d6..667bb84 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/entity/DocumentTagEntity.kt +++ b/app/src/main/java/com/app/paperstow/data/local/entity/DocumentTagEntity.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.entity +package com.app.paperstow.data.local.entity import androidx.room.Entity diff --git a/app/src/main/java/com/app/traveldocs/data/local/entity/FamilyMemberEntity.kt b/app/src/main/java/com/app/paperstow/data/local/entity/FamilyMemberEntity.kt similarity index 87% rename from app/src/main/java/com/app/traveldocs/data/local/entity/FamilyMemberEntity.kt rename to app/src/main/java/com/app/paperstow/data/local/entity/FamilyMemberEntity.kt index 3f72aef..53f8504 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/entity/FamilyMemberEntity.kt +++ b/app/src/main/java/com/app/paperstow/data/local/entity/FamilyMemberEntity.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.entity +package com.app.paperstow.data.local.entity import androidx.room.Entity import androidx.room.PrimaryKey diff --git a/app/src/main/java/com/app/traveldocs/data/local/entity/GpsTrackEntity.kt b/app/src/main/java/com/app/paperstow/data/local/entity/GpsTrackEntity.kt similarity index 71% rename from app/src/main/java/com/app/traveldocs/data/local/entity/GpsTrackEntity.kt rename to app/src/main/java/com/app/paperstow/data/local/entity/GpsTrackEntity.kt index 92f6123..de9b5ed 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/entity/GpsTrackEntity.kt +++ b/app/src/main/java/com/app/paperstow/data/local/entity/GpsTrackEntity.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.data.local.entity +package com.app.paperstow.data.local.entity import androidx.room.Entity import androidx.room.PrimaryKey @@ -10,5 +10,6 @@ data class GpsTrackEntity( val longitude: Double, val accuracy: Float, val timestamp: Long, - val isMoving: Boolean = false + val isMoving: Boolean = false, + val batteryPercent: Int = -1 ) diff --git a/app/src/main/java/com/app/traveldocs/data/local/storage/DocumentFileStorageImpl.kt b/app/src/main/java/com/app/paperstow/data/local/storage/DocumentFileStorageImpl.kt similarity index 92% rename from app/src/main/java/com/app/traveldocs/data/local/storage/DocumentFileStorageImpl.kt rename to app/src/main/java/com/app/paperstow/data/local/storage/DocumentFileStorageImpl.kt index 35d8a22..a909246 100644 --- a/app/src/main/java/com/app/traveldocs/data/local/storage/DocumentFileStorageImpl.kt +++ b/app/src/main/java/com/app/paperstow/data/local/storage/DocumentFileStorageImpl.kt @@ -1,11 +1,11 @@ -package com.app.traveldocs.data.local.storage +package com.app.paperstow.data.local.storage -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger import android.content.Context import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyProperties -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.repository.DocumentFileStorage import dagger.hilt.android.qualifiers.ApplicationContext import java.io.File import java.security.KeyStore @@ -58,6 +58,12 @@ class DocumentFileStorageImpl @Inject constructor( fileId } + override suspend fun replace(fileId: String, fileData: ByteArray): Result = runCatching { + val file = findFile(fileId) + ?: throw IllegalArgumentException("File not found: $fileId") + file.writeBytes(encrypt(fileData)) + } + override suspend fun retrieve(fileId: String): Result = runCatching { DebugLogger.d("FileStorage", "retrieve: fileId=$fileId") val file = findFile(fileId) diff --git a/app/src/main/java/com/app/traveldocs/data/nlp/.gitkeep b/app/src/main/java/com/app/paperstow/data/nlp/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/data/nlp/.gitkeep rename to app/src/main/java/com/app/paperstow/data/nlp/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/data/nlp/BasicDocumentChecklistGenerator.kt b/app/src/main/java/com/app/paperstow/data/nlp/BasicDocumentChecklistGenerator.kt similarity index 90% rename from app/src/main/java/com/app/traveldocs/data/nlp/BasicDocumentChecklistGenerator.kt rename to app/src/main/java/com/app/paperstow/data/nlp/BasicDocumentChecklistGenerator.kt index 20cae72..0980205 100644 --- a/app/src/main/java/com/app/traveldocs/data/nlp/BasicDocumentChecklistGenerator.kt +++ b/app/src/main/java/com/app/paperstow/data/nlp/BasicDocumentChecklistGenerator.kt @@ -1,12 +1,12 @@ -package com.app.traveldocs.data.nlp +package com.app.paperstow.data.nlp -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.MissingDocument -import com.app.traveldocs.domain.model.RequiredDocument -import com.app.traveldocs.domain.model.TravelDocumentChecklist -import com.app.traveldocs.domain.model.TravelParameters -import com.app.traveldocs.domain.repository.DocumentChecklistGenerator +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.MissingDocument +import com.app.paperstow.domain.model.RequiredDocument +import com.app.paperstow.domain.model.TravelDocumentChecklist +import com.app.paperstow.domain.model.TravelParameters +import com.app.paperstow.domain.repository.DocumentChecklistGenerator import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/com/app/traveldocs/data/nlp/RegexNaturalLanguageParser.kt b/app/src/main/java/com/app/paperstow/data/nlp/RegexNaturalLanguageParser.kt similarity index 97% rename from app/src/main/java/com/app/traveldocs/data/nlp/RegexNaturalLanguageParser.kt rename to app/src/main/java/com/app/paperstow/data/nlp/RegexNaturalLanguageParser.kt index feab340..274228c 100644 --- a/app/src/main/java/com/app/traveldocs/data/nlp/RegexNaturalLanguageParser.kt +++ b/app/src/main/java/com/app/paperstow/data/nlp/RegexNaturalLanguageParser.kt @@ -1,9 +1,9 @@ -package com.app.traveldocs.data.nlp +package com.app.paperstow.data.nlp -import com.app.traveldocs.domain.model.ParseResult -import com.app.traveldocs.domain.model.QueryIntent -import com.app.traveldocs.domain.model.TravelParameters -import com.app.traveldocs.domain.repository.NaturalLanguageParser +import com.app.paperstow.domain.model.ParseResult +import com.app.paperstow.domain.model.QueryIntent +import com.app.paperstow.domain.model.TravelParameters +import com.app.paperstow.domain.repository.NaturalLanguageParser import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/com/app/paperstow/data/safety/DeviceBattery.kt b/app/src/main/java/com/app/paperstow/data/safety/DeviceBattery.kt new file mode 100644 index 0000000..4a1ab8f --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/safety/DeviceBattery.kt @@ -0,0 +1,13 @@ +package com.app.paperstow.data.safety + +import android.content.Context +import android.os.BatteryManager + +object DeviceBattery { + /** Remaining battery as 0–100, or -1 if the device does not report it. */ + fun remainingPercent(context: Context): Int { + val manager = context.getSystemService(Context.BATTERY_SERVICE) as? BatteryManager ?: return -1 + val percent = manager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY) + return if (percent in 0..100) percent else -1 + } +} diff --git a/app/src/main/java/com/app/paperstow/data/safety/SafetyLocationRepository.kt b/app/src/main/java/com/app/paperstow/data/safety/SafetyLocationRepository.kt new file mode 100644 index 0000000..c1850db --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/safety/SafetyLocationRepository.kt @@ -0,0 +1,61 @@ +package com.app.paperstow.data.safety + +import android.content.Context +import com.app.paperstow.data.local.dao.GpsTrackDao +import com.app.paperstow.data.local.entity.GpsTrackEntity +import com.app.paperstow.domain.safety.SafetyPlace +import com.app.paperstow.domain.safety.UniqueLocations +import dagger.hilt.android.qualifiers.ApplicationContext +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class SafetyLocationRepository @Inject constructor( + private val dao: GpsTrackDao, + @ApplicationContext private val context: Context +) { + fun observeLast24Hours(): Flow> { + return dao.observeAllNewestFirst().map { rows -> + val cutoff = System.currentTimeMillis() - UniqueLocations.WINDOW_MS + rows.filter { it.timestamp >= cutoff }.map { it.toPlace() } + } + } + + suspend fun pruneExpired() { + dao.deleteOlderThan(System.currentTimeMillis() - UniqueLocations.WINDOW_MS) + } + + suspend fun recordFix(latitude: Double, longitude: Double, accuracy: Float, nowMs: Long = System.currentTimeMillis()) { + if (accuracy > UniqueLocations.MAX_ACCURACY_METERS) return + pruneExpired() + val batteryPercent = DeviceBattery.remainingPercent(context) + val last = dao.getLastTrack() + if (last != null && !UniqueLocations.isNewPlace(last.latitude, last.longitude, latitude, longitude)) { + dao.updateTimestampAndBattery(last.id, nowMs, batteryPercent) + return + } + dao.insert( + GpsTrackEntity( + latitude = latitude, + longitude = longitude, + accuracy = accuracy, + timestamp = nowMs, + isMoving = last != null, + batteryPercent = batteryPercent + ) + ) + } + + suspend fun clearAll() { + dao.deleteAll() + } + + private fun GpsTrackEntity.toPlace() = SafetyPlace( + latitude = latitude, + longitude = longitude, + timestamp = timestamp, + batteryPercent = batteryPercent + ) +} diff --git a/app/src/main/java/com/app/paperstow/data/safety/SafetyTrailPreferences.kt b/app/src/main/java/com/app/paperstow/data/safety/SafetyTrailPreferences.kt new file mode 100644 index 0000000..5f3ac04 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/safety/SafetyTrailPreferences.kt @@ -0,0 +1,28 @@ +package com.app.paperstow.data.safety + +import android.content.Context +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +object SafetyTrailPreferences { + private const val PREFS = "safety_trail_prefs" + private const val KEY_WANTED = "user_wants_trail" + + private val _running = MutableStateFlow(false) + val running: StateFlow = _running.asStateFlow() + + fun wantsTrail(context: Context): Boolean = + context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).getBoolean(KEY_WANTED, false) + + fun setWantsTrail(context: Context, wanted: Boolean) { + context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) + .edit() + .putBoolean(KEY_WANTED, wanted) + .apply() + } + + fun setRunning(running: Boolean) { + _running.value = running + } +} diff --git a/app/src/main/java/com/app/paperstow/data/safety/SafetyTrailService.kt b/app/src/main/java/com/app/paperstow/data/safety/SafetyTrailService.kt new file mode 100644 index 0000000..6dc67a9 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/safety/SafetyTrailService.kt @@ -0,0 +1,200 @@ +package com.app.paperstow.data.safety + +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent +import android.app.Service +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.content.pm.ServiceInfo +import android.location.Location +import android.location.LocationListener +import android.location.LocationManager +import android.os.Build +import android.os.Bundle +import android.os.IBinder +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import com.app.paperstow.R +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.presentation.MainActivity +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.cancel +import kotlinx.coroutines.launch +import javax.inject.Inject + +/** + * User-started location trail. A visible notification stays up while unique + * places are recorded. Does not use ACCESS_BACKGROUND_LOCATION. + */ +@AndroidEntryPoint +class SafetyTrailService : Service() { + + @Inject lateinit var repository: SafetyLocationRepository + + private val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO) + private var locationManager: LocationManager? = null + private val listener = object : LocationListener { + override fun onLocationChanged(location: Location) { + scope.launch { + repository.recordFix(location.latitude, location.longitude, location.accuracy) + } + } + + @Deprecated("Deprecated in Java") + override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) = Unit + override fun onProviderEnabled(provider: String) = Unit + override fun onProviderDisabled(provider: String) = Unit + } + + override fun onBind(intent: Intent?): IBinder? = null + + override fun onCreate() { + super.onCreate() + createChannel() + locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager + } + + override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { + if (intent?.action == ACTION_STOP) { + SafetyTrailPreferences.setWantsTrail(this, false) + stopUpdates() + stopForeground(STOP_FOREGROUND_REMOVE) + stopSelf() + return START_NOT_STICKY + } + if (intent?.action == ACTION_START || SafetyTrailPreferences.wantsTrail(this) || intent == null) { + SafetyTrailPreferences.setWantsTrail(this, true) + startInForeground() + beginUpdates() + return START_STICKY + } + stopSelf() + return START_NOT_STICKY + } + + override fun onDestroy() { + stopUpdates() + SafetyTrailPreferences.setRunning(false) + scope.cancel() + super.onDestroy() + } + + private fun startInForeground() { + val notification = buildNotification() + if (Build.VERSION.SDK_INT >= 34) { + startForeground(NOTIFICATION_ID, notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION) + } else { + startForeground(NOTIFICATION_ID, notification) + } + SafetyTrailPreferences.setRunning(true) + } + + private fun beginUpdates() { + val manager = locationManager ?: return + if (!hasLocationPermission()) { + DebugLogger.w(TAG, "Location permission missing — stopping trail") + SafetyTrailPreferences.setWantsTrail(this, false) + stopSelf() + return + } + try { + manager.getProviders(true).forEach { provider -> + if (provider == LocationManager.GPS_PROVIDER || provider == LocationManager.NETWORK_PROVIDER) { + manager.requestLocationUpdates(provider, MIN_TIME_MS, MIN_DISTANCE_METERS, listener) + } + } + listOf(LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER).forEach { provider -> + if (manager.isProviderEnabled(provider)) { + manager.getLastKnownLocation(provider)?.let { location -> + scope.launch { + repository.recordFix(location.latitude, location.longitude, location.accuracy) + } + } + } + } + DebugLogger.i(TAG, "My Trail started") + } catch (e: SecurityException) { + DebugLogger.e(TAG, "Location updates denied", e) + SafetyTrailPreferences.setWantsTrail(this, false) + stopSelf() + } + } + + private fun stopUpdates() { + try { + locationManager?.removeUpdates(listener) + } catch (_: Exception) { + } + SafetyTrailPreferences.setRunning(false) + } + + private fun hasLocationPermission(): Boolean { + val fine = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) + val coarse = ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) + return fine == PackageManager.PERMISSION_GRANTED || coarse == PackageManager.PERMISSION_GRANTED + } + + private fun createChannel() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return + val manager = getSystemService(NotificationManager::class.java) ?: return + val channel = NotificationChannel( + CHANNEL_ID, + getString(R.string.safety_notification_channel), + NotificationManager.IMPORTANCE_LOW + ).apply { + description = getString(R.string.safety_notification_channel_desc) + setShowBadge(false) + } + manager.createNotificationChannel(channel) + } + + private fun buildNotification(): Notification { + val openApp = PendingIntent.getActivity( + this, + 0, + Intent(this, MainActivity::class.java).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), + PendingIntent.FLAG_IMMUTABLE + ) + val stop = PendingIntent.getService( + this, + 1, + Intent(this, SafetyTrailService::class.java).setAction(ACTION_STOP), + PendingIntent.FLAG_IMMUTABLE + ) + return NotificationCompat.Builder(this, CHANNEL_ID) + .setSmallIcon(android.R.drawable.ic_menu_mylocation) + .setContentTitle(getString(R.string.safety_notification_title)) + .setContentText(getString(R.string.safety_notification_text)) + .setOngoing(true) + .setContentIntent(openApp) + .addAction(0, getString(R.string.safety_stop), stop) + .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) + .build() + } + + companion object { + const val ACTION_START = "com.app.paperstow.safety.START" + const val ACTION_STOP = "com.app.paperstow.safety.STOP" + private const val TAG = "SafetyTrail" + private const val CHANNEL_ID = "family_safety_trail" + private const val NOTIFICATION_ID = 41 + private const val MIN_TIME_MS = 2 * 60 * 1000L + private const val MIN_DISTANCE_METERS = 100f + + fun start(context: Context) { + val intent = Intent(context, SafetyTrailService::class.java).setAction(ACTION_START) + ContextCompat.startForegroundService(context, intent) + } + + fun stop(context: Context) { + val intent = Intent(context, SafetyTrailService::class.java).setAction(ACTION_STOP) + context.startService(intent) + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/scanner/.gitkeep b/app/src/main/java/com/app/paperstow/data/scanner/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/data/scanner/.gitkeep rename to app/src/main/java/com/app/paperstow/data/scanner/.gitkeep diff --git a/app/src/main/java/com/app/paperstow/data/scanner/CameraDocumentScanner.kt b/app/src/main/java/com/app/paperstow/data/scanner/CameraDocumentScanner.kt new file mode 100644 index 0000000..83b5868 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/data/scanner/CameraDocumentScanner.kt @@ -0,0 +1,87 @@ +package com.app.paperstow.data.scanner + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.IntentSender +import android.net.Uri +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.ImportedDocument +import com.google.mlkit.vision.documentscanner.GmsDocumentScannerOptions +import com.google.mlkit.vision.documentscanner.GmsDocumentScannerOptions.RESULT_FORMAT_JPEG +import com.google.mlkit.vision.documentscanner.GmsDocumentScannerOptions.SCANNER_MODE_FULL +import com.google.mlkit.vision.documentscanner.GmsDocumentScanning +import com.google.mlkit.vision.documentscanner.GmsDocumentScanningResult +import dagger.hilt.android.qualifiers.ApplicationContext +import java.io.IOException +import javax.inject.Inject +import javax.inject.Singleton + +/** + * On-device document scan via ML Kit / Google Play services. + * + * Edge detection, crop, filters, and the camera UI run in Play services. + * Paperstow does not need CAMERA permission for this path. JPEG pages are + * read locally and fed into the normal import pipeline. + */ +@Singleton +class CameraDocumentScanner @Inject constructor( + @ApplicationContext private val context: Context +) { + + private val options = GmsDocumentScannerOptions.Builder() + .setGalleryImportAllowed(false) + .setPageLimit(MAX_PAGES) + .setResultFormats(RESULT_FORMAT_JPEG) + .setScannerMode(SCANNER_MODE_FULL) + .build() + + fun getStartIntent( + activity: Activity, + onReady: (IntentSender) -> Unit, + onError: (Exception) -> Unit + ) { + GmsDocumentScanning.getClient(options) + .getStartScanIntent(activity) + .addOnSuccessListener { sender -> + DebugLogger.i(TAG, "Document scanner ready") + onReady(sender) + } + .addOnFailureListener { e -> + DebugLogger.e(TAG, "Document scanner unavailable", e) + onError(e) + } + } + + fun pagesFromResult(data: Intent?): List { + val result = GmsDocumentScanningResult.fromActivityResultIntent(data) ?: return emptyList() + val pages = result.pages.orEmpty() + if (pages.isEmpty()) return emptyList() + val stamp = System.currentTimeMillis() + return pages.mapIndexedNotNull { index, page -> + try { + ImportedDocument( + rawBytes = readBytes(page.imageUri), + format = DocumentFormat.JPG, + originalFileName = "scan_${stamp}_${index + 1}.jpg" + ) + } catch (e: Exception) { + DebugLogger.e(TAG, "Failed to read scanned page $index", e) + null + } + } + } + + private fun readBytes(uri: Uri): ByteArray { + return context.contentResolver.openInputStream(uri)?.use { it.readBytes() } + ?: throw IOException("Unable to open scanned page: $uri") + } + + companion object { + const val MAX_PAGES = 4 + private const val TAG = "DocScanner" + } +} + +class ScannerException(message: String, cause: Throwable? = null) : Exception(message, cause) diff --git a/app/src/main/java/com/app/traveldocs/data/scanner/MlKitMetadataExtractor.kt b/app/src/main/java/com/app/paperstow/data/scanner/MlKitMetadataExtractor.kt similarity index 92% rename from app/src/main/java/com/app/traveldocs/data/scanner/MlKitMetadataExtractor.kt rename to app/src/main/java/com/app/paperstow/data/scanner/MlKitMetadataExtractor.kt index ae52ce8..36a5e67 100644 --- a/app/src/main/java/com/app/traveldocs/data/scanner/MlKitMetadataExtractor.kt +++ b/app/src/main/java/com/app/paperstow/data/scanner/MlKitMetadataExtractor.kt @@ -1,12 +1,12 @@ -package com.app.traveldocs.data.scanner +package com.app.paperstow.data.scanner -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger import android.graphics.BitmapFactory -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.ExtractionResult -import com.app.traveldocs.domain.model.ExtractedValue -import com.app.traveldocs.domain.model.MetadataField -import com.app.traveldocs.domain.repository.MetadataExtractor +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.ExtractionResult +import com.app.paperstow.domain.model.ExtractedValue +import com.app.paperstow.domain.model.MetadataField +import com.app.paperstow.domain.repository.MetadataExtractor import com.google.mlkit.vision.common.InputImage import com.google.mlkit.vision.text.TextRecognition import com.google.mlkit.vision.text.TextRecognizer @@ -43,7 +43,8 @@ class MlKitMetadataExtractor @Inject constructor() : MetadataExtractor { documentType = documentType, metadata = metadata, confidence = confidence, - requiresManualReview = confidence < 0.8f + requiresManualReview = confidence < 0.8f, + rawText = text ) ) } catch (e: Exception) { @@ -69,26 +70,36 @@ class MlKitMetadataExtractor @Inject constructor() : MetadataExtractor { * Runs ML Kit Text Recognition on the given image bytes and returns the full text. */ internal suspend fun recognizeText(imageData: ByteArray): String { - val bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.size) + val bitmap = decodeForOcr(imageData) ?: throw ExtractionException("Unable to decode image data") val inputImage = InputImage.fromBitmap(bitmap, 0) + DebugLogger.d("OCR", "recognizeText: ${bitmap.width}x${bitmap.height}") return suspendCancellableCoroutine { continuation -> textRecognizer.process(inputImage) .addOnSuccessListener { result -> - continuation.resume(result.text) + DebugLogger.i("OCR", "ML Kit text chars=${result.text.length}") + if (continuation.isActive) continuation.resume(result.text) } .addOnFailureListener { exception -> - continuation.resume("") + DebugLogger.e("OCR", "ML Kit failed: ${exception.message}", exception) + if (continuation.isActive) continuation.resume("") } - - continuation.invokeOnCancellation { - // TextRecognizer doesn't support cancellation directly - } } } + private fun decodeForOcr(imageData: ByteArray): android.graphics.Bitmap? { + val bounds = BitmapFactory.Options().apply { inJustDecodeBounds = true } + BitmapFactory.decodeByteArray(imageData, 0, imageData.size, bounds) + if (bounds.outWidth <= 0 || bounds.outHeight <= 0) return null + var sample = 1 + val longest = maxOf(bounds.outWidth, bounds.outHeight) + while (longest / sample > 2000) sample *= 2 + val opts = BitmapFactory.Options().apply { inSampleSize = sample } + return BitmapFactory.decodeByteArray(imageData, 0, imageData.size, opts) + } + /** * Classifies the document type based on keyword patterns in the extracted text. * diff --git a/app/src/main/java/com/app/traveldocs/data/scanner/SmartFileNamer.kt b/app/src/main/java/com/app/paperstow/data/scanner/SmartFileNamer.kt similarity index 96% rename from app/src/main/java/com/app/traveldocs/data/scanner/SmartFileNamer.kt rename to app/src/main/java/com/app/paperstow/data/scanner/SmartFileNamer.kt index e86b576..27bedf8 100644 --- a/app/src/main/java/com/app/traveldocs/data/scanner/SmartFileNamer.kt +++ b/app/src/main/java/com/app/paperstow/data/scanner/SmartFileNamer.kt @@ -1,6 +1,6 @@ -package com.app.traveldocs.data.scanner +package com.app.paperstow.data.scanner -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger import java.text.SimpleDateFormat import java.util.Date import java.util.Locale diff --git a/app/src/main/java/com/app/traveldocs/data/tags/AutoTagGeneratorImpl.kt b/app/src/main/java/com/app/paperstow/data/tags/AutoTagGeneratorImpl.kt similarity index 91% rename from app/src/main/java/com/app/traveldocs/data/tags/AutoTagGeneratorImpl.kt rename to app/src/main/java/com/app/paperstow/data/tags/AutoTagGeneratorImpl.kt index 491e6c9..cdbd583 100644 --- a/app/src/main/java/com/app/traveldocs/data/tags/AutoTagGeneratorImpl.kt +++ b/app/src/main/java/com/app/paperstow/data/tags/AutoTagGeneratorImpl.kt @@ -1,9 +1,9 @@ -package com.app.traveldocs.data.tags +package com.app.paperstow.data.tags -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.ExtractedValue -import com.app.traveldocs.domain.model.MetadataField -import com.app.traveldocs.domain.repository.AutoTagGenerator +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.ExtractedValue +import com.app.paperstow.domain.model.MetadataField +import com.app.paperstow.domain.repository.AutoTagGenerator import javax.inject.Inject import javax.inject.Singleton diff --git a/app/src/main/java/com/app/traveldocs/debug/CrashHandler.kt b/app/src/main/java/com/app/paperstow/debug/CrashHandler.kt similarity index 62% rename from app/src/main/java/com/app/traveldocs/debug/CrashHandler.kt rename to app/src/main/java/com/app/paperstow/debug/CrashHandler.kt index 529dee5..f3052d1 100644 --- a/app/src/main/java/com/app/traveldocs/debug/CrashHandler.kt +++ b/app/src/main/java/com/app/paperstow/debug/CrashHandler.kt @@ -1,23 +1,19 @@ -package com.app.traveldocs.debug +package com.app.paperstow.debug -import android.app.NotificationChannel -import android.app.NotificationManager -import android.app.PendingIntent import android.content.Context import android.content.Intent import android.os.Build -import androidx.core.app.NotificationCompat import java.io.PrintWriter import java.io.StringWriter /** * Global uncaught exception handler that: * 1. Logs crashes to DebugLogger (on-device debug log file) - * 2. Shows a notification offering to send crash feedback to the developer + * 2. Stores a local crash report the user can share later * 3. Delegates to the default handler (system crash dialog) * - * Play Store compliance: Google Play Console automatically collects crash reports - * from users who opt in. This handler adds a local notification as a secondary channel. + * Play Console collects crash reports from users who opt in. This handler does + * not show notifications (no POST_NOTIFICATIONS permission). */ class CrashHandler( private val context: Context, @@ -45,7 +41,7 @@ class CrashHandler( // Build crash report summary for feedback val crashSummary = buildString { - appendLine("App: Document Manager") + appendLine("App: Paperstow") appendLine("Version: ${getAppVersion()}") appendLine("Android: ${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})") appendLine("Device: ${Build.MANUFACTURER} ${Build.MODEL}") @@ -56,12 +52,8 @@ class CrashHandler( append(stackTrace.take(2000)) } - // Store crash report for later retrieval (user can send it on next launch) storeCrashReport(crashSummary) - // Show notification offering to send feedback (non-blocking) - showCrashNotification(crashSummary) - } catch (_: Exception) { // Don't let logging crash the crash handler } @@ -84,38 +76,8 @@ class CrashHandler( } catch (_: Exception) { } } - private fun showCrashNotification(crashSummary: String) { - try { - val channelId = "crash_feedback" - val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val channel = NotificationChannel(channelId, "Crash Reports", NotificationManager.IMPORTANCE_HIGH) - channel.description = "Notifications when the app crashes, offering to send feedback" - notificationManager.createNotificationChannel(channel) - } - - val emailIntent = createFeedbackIntent(crashSummary) - val pendingIntent = PendingIntent.getActivity( - context, 0, emailIntent, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - - val notification = NotificationCompat.Builder(context, channelId) - .setSmallIcon(android.R.drawable.stat_notify_error) - .setContentTitle("Document Manager crashed") - .setContentText("Tap to send crash report to developer") - .setAutoCancel(true) - .setContentIntent(pendingIntent) - .setPriority(NotificationCompat.PRIORITY_HIGH) - .build() - - notificationManager.notify(9999, notification) - } catch (_: Exception) { } - } - companion object { - private const val DEVELOPER_EMAIL = "support@docvault.app" + private const val ISSUES_URL = "https://github.com/sethusrinivasan/document-manager/issues" fun install(context: Context) { val defaultHandler = Thread.getDefaultUncaughtExceptionHandler() @@ -130,10 +92,9 @@ class CrashHandler( */ fun createFeedbackIntent(crashReport: String): Intent { return Intent(Intent.ACTION_SEND).apply { - type = "message/rfc822" - putExtra(Intent.EXTRA_EMAIL, arrayOf(DEVELOPER_EMAIL)) - putExtra(Intent.EXTRA_SUBJECT, "Document Manager - Crash Report") - putExtra(Intent.EXTRA_TEXT, crashReport) + type = "text/plain" + putExtra(Intent.EXTRA_SUBJECT, "Paperstow - Crash Report") + putExtra(Intent.EXTRA_TEXT, crashReport + "\n\nFile at: $ISSUES_URL") addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } } diff --git a/app/src/main/java/com/app/traveldocs/debug/DebugLogScreen.kt b/app/src/main/java/com/app/paperstow/debug/DebugLogScreen.kt similarity index 99% rename from app/src/main/java/com/app/traveldocs/debug/DebugLogScreen.kt rename to app/src/main/java/com/app/paperstow/debug/DebugLogScreen.kt index b2f738f..72fa018 100644 --- a/app/src/main/java/com/app/traveldocs/debug/DebugLogScreen.kt +++ b/app/src/main/java/com/app/paperstow/debug/DebugLogScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.debug +package com.app.paperstow.debug import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll diff --git a/app/src/main/java/com/app/traveldocs/debug/DebugLogger.kt b/app/src/main/java/com/app/paperstow/debug/DebugLogger.kt similarity index 84% rename from app/src/main/java/com/app/traveldocs/debug/DebugLogger.kt rename to app/src/main/java/com/app/paperstow/debug/DebugLogger.kt index 5f5de43..49e0c0c 100644 --- a/app/src/main/java/com/app/traveldocs/debug/DebugLogger.kt +++ b/app/src/main/java/com/app/paperstow/debug/DebugLogger.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.debug +package com.app.paperstow.debug import android.content.Context import android.util.Log @@ -18,10 +18,10 @@ import java.util.concurrent.ConcurrentLinkedDeque * Captures logs to: * 1. Android Logcat (standard, filtered by tag "TravelDocs") * 2. In-memory ring buffer (last 500 entries, viewable in-app) - * 3. File on device: /data/data/com.app.traveldocs/files/debug_logs/traveldocs_debug.log + * 3. File on device: /data/data/com.app.paperstow/files/debug_logs/traveldocs_debug.log * * To pull logs via adb: - * adb shell run-as com.app.traveldocs cat files/debug_logs/traveldocs_debug.log > local_debug.log + * adb shell run-as com.app.paperstow cat files/debug_logs/traveldocs_debug.log > local_debug.log * * Or from the app's "Debug Logs" screen accessible via the floating bug icon. */ @@ -64,7 +64,7 @@ object DebugLogger { * Initialize the file-based logger. Call from Application.onCreate(). */ fun init(context: Context) { - if (!com.app.traveldocs.BuildConfig.DEBUG) { + if (!com.app.paperstow.BuildConfig.DEBUG) { initialized = true return // No file logging in release builds } @@ -102,16 +102,22 @@ object DebugLogger { val throwableStr = throwable?.let { "${it::class.simpleName}: ${it.message}" } val entry = LogEntry(timestamp, level, component, message, throwableStr) - // 1. Logcat (fast, never blocks) + // 1. Logcat — errors only in release (no verbose or location-adjacent noise) val logcatMsg = "[$component] $message" - when (level) { - Level.DEBUG -> Log.d(TAG, logcatMsg, throwable) - Level.INFO -> Log.i(TAG, logcatMsg, throwable) - Level.WARN -> Log.w(TAG, logcatMsg, throwable) - Level.ERROR -> Log.e(TAG, logcatMsg, throwable) + if (com.app.paperstow.BuildConfig.DEBUG) { + when (level) { + Level.DEBUG -> Log.d(TAG, logcatMsg, throwable) + Level.INFO -> Log.i(TAG, logcatMsg, throwable) + Level.WARN -> Log.w(TAG, logcatMsg, throwable) + Level.ERROR -> Log.e(TAG, logcatMsg, throwable) + } + } else if (level == Level.ERROR) { + Log.e(TAG, logcatMsg, throwable) } - // 2. In-memory buffer (fast, lock-free ConcurrentLinkedDeque) + if (!com.app.paperstow.BuildConfig.DEBUG) return + + // 2. In-memory buffer (debug builds only) buffer.addLast(entry) while (buffer.size > MAX_BUFFER_SIZE) { buffer.pollFirst() diff --git a/app/src/main/java/com/app/traveldocs/debug/LoggingInterceptors.kt b/app/src/main/java/com/app/paperstow/debug/LoggingInterceptors.kt similarity index 98% rename from app/src/main/java/com/app/traveldocs/debug/LoggingInterceptors.kt rename to app/src/main/java/com/app/paperstow/debug/LoggingInterceptors.kt index f7fb690..03e95f3 100644 --- a/app/src/main/java/com/app/traveldocs/debug/LoggingInterceptors.kt +++ b/app/src/main/java/com/app/paperstow/debug/LoggingInterceptors.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.debug +package com.app.paperstow.debug /** * Extension functions and utilities for instrumenting key operations with debug logging. diff --git a/app/src/main/java/com/app/traveldocs/debug/TempFileCleanup.kt b/app/src/main/java/com/app/paperstow/debug/TempFileCleanup.kt similarity index 94% rename from app/src/main/java/com/app/traveldocs/debug/TempFileCleanup.kt rename to app/src/main/java/com/app/paperstow/debug/TempFileCleanup.kt index b771b75..f111d00 100644 --- a/app/src/main/java/com/app/traveldocs/debug/TempFileCleanup.kt +++ b/app/src/main/java/com/app/paperstow/debug/TempFileCleanup.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.debug +package com.app.paperstow.debug import android.content.Context import java.io.File diff --git a/app/src/main/java/com/app/traveldocs/debug/UsageTelemetry.kt b/app/src/main/java/com/app/paperstow/debug/UsageTelemetry.kt similarity index 96% rename from app/src/main/java/com/app/traveldocs/debug/UsageTelemetry.kt rename to app/src/main/java/com/app/paperstow/debug/UsageTelemetry.kt index 3259e95..f274751 100644 --- a/app/src/main/java/com/app/traveldocs/debug/UsageTelemetry.kt +++ b/app/src/main/java/com/app/paperstow/debug/UsageTelemetry.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.debug +package com.app.paperstow.debug import java.text.SimpleDateFormat import java.util.Date @@ -57,6 +57,7 @@ object UsageTelemetry { * Log when user leaves a screen. */ fun screenExit(screenName: String) { + if (!isEnabled()) return val entryTime = screenEntryTime[screenName] val durationMs = if (entryTime != null) System.currentTimeMillis() - entryTime else 0 DebugLogger.d(TAG, "SCREEN_EXIT: $screenName (duration=${durationMs}ms)") @@ -76,6 +77,7 @@ object UsageTelemetry { * Log when user completes a multi-step flow. */ fun funnelComplete(funnelName: String) { + if (!isEnabled()) return funnelCompletes.getOrPut(funnelName) { AtomicInteger(0) }.incrementAndGet() val starts = funnelStarts[funnelName]?.get() ?: 0 val completes = funnelCompletes[funnelName]?.get() ?: 0 @@ -87,6 +89,7 @@ object UsageTelemetry { * Log when user abandons a flow without completing. */ fun funnelAbandon(funnelName: String, reason: String = "") { + if (!isEnabled()) return val detail = if (reason.isNotBlank()) " reason=$reason" else "" DebugLogger.d(TAG, "FUNNEL_ABANDON: $funnelName$detail") } @@ -106,6 +109,7 @@ object UsageTelemetry { * Log an error encountered by the user. */ fun userError(feature: String, errorType: String) { + if (!isEnabled()) return DebugLogger.d(TAG, "USER_ERROR: [$feature] $errorType") } @@ -113,6 +117,7 @@ object UsageTelemetry { * Log a timing measurement for a user-facing operation. */ fun timing(feature: String, operation: String, durationMs: Long) { + if (!isEnabled()) return DebugLogger.d(TAG, "TIMING: [$feature] $operation took ${durationMs}ms") } @@ -120,6 +125,7 @@ object UsageTelemetry { * Emit session summary (call on app background or periodic). */ fun emitSessionSummary() { + if (!isEnabled()) return val sessionDuration = (System.currentTimeMillis() - sessionStart) / 1000 val totalActions = actionCount.get() @@ -173,7 +179,7 @@ object UsageTelemetry { fun getLocalSummary(): String { val sessionDuration = (System.currentTimeMillis() - sessionStart) / 1000 return buildString { - appendLine("=== Document Manager Telemetry Report ===") + appendLine("=== Paperstow Telemetry Report ===") appendLine("Generated: ${java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", java.util.Locale.US).format(java.util.Date())}") appendLine("Session duration: ${sessionDuration}s") appendLine("Total actions: ${actionCount.get()}") diff --git a/app/src/main/java/com/app/traveldocs/di/.gitkeep b/app/src/main/java/com/app/paperstow/di/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/di/.gitkeep rename to app/src/main/java/com/app/paperstow/di/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/di/AppModule.kt b/app/src/main/java/com/app/paperstow/di/AppModule.kt similarity index 59% rename from app/src/main/java/com/app/traveldocs/di/AppModule.kt rename to app/src/main/java/com/app/paperstow/di/AppModule.kt index 5c10bad..6d71b09 100644 --- a/app/src/main/java/com/app/traveldocs/di/AppModule.kt +++ b/app/src/main/java/com/app/paperstow/di/AppModule.kt @@ -1,33 +1,33 @@ -package com.app.traveldocs.di +package com.app.paperstow.di import android.content.Context import androidx.room.Room -import com.app.traveldocs.data.local.DocumentRepositoryImpl -import com.app.traveldocs.data.local.SearchEngineImpl -import com.app.traveldocs.data.local.TagRepositoryImpl -import com.app.traveldocs.data.local.TravelDocsDatabase -import com.app.traveldocs.data.local.auth.AuthRepositoryImpl -import com.app.traveldocs.data.local.auth.AuthSessionManager -import com.app.traveldocs.data.local.dao.DocumentDao -import com.app.traveldocs.data.local.dao.DocumentMetadataDao -import com.app.traveldocs.data.local.dao.DocumentTagDao -import com.app.traveldocs.data.local.dao.FamilyMemberDao -import com.app.traveldocs.data.local.dao.GpsTrackDao -import com.app.traveldocs.data.local.storage.DocumentFileStorageImpl -import com.app.traveldocs.data.nlp.BasicDocumentChecklistGenerator -import com.app.traveldocs.data.nlp.RegexNaturalLanguageParser -import com.app.traveldocs.data.scanner.MlKitMetadataExtractor -import com.app.traveldocs.data.tags.AutoTagGeneratorImpl -import com.app.traveldocs.domain.repository.AuthRepository -import com.app.traveldocs.domain.repository.AutoTagGenerator -import com.app.traveldocs.domain.repository.DocumentChecklistGenerator -import com.app.traveldocs.domain.repository.DocumentFileStorage -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.MetadataExtractor -import com.app.traveldocs.domain.repository.NaturalLanguageParser -import com.app.traveldocs.domain.repository.SearchEngine -import com.app.traveldocs.domain.repository.SessionManager -import com.app.traveldocs.domain.repository.TagRepository +import com.app.paperstow.data.local.DocumentRepositoryImpl +import com.app.paperstow.data.local.SearchEngineImpl +import com.app.paperstow.data.local.TagRepositoryImpl +import com.app.paperstow.data.local.TravelDocsDatabase +import com.app.paperstow.data.local.auth.AuthRepositoryImpl +import com.app.paperstow.data.local.auth.AuthSessionManager +import com.app.paperstow.data.local.dao.DocumentDao +import com.app.paperstow.data.local.dao.DocumentMetadataDao +import com.app.paperstow.data.local.dao.DocumentTagDao +import com.app.paperstow.data.local.dao.FamilyMemberDao +import com.app.paperstow.data.local.dao.GpsTrackDao +import com.app.paperstow.data.local.storage.DocumentFileStorageImpl +import com.app.paperstow.data.nlp.BasicDocumentChecklistGenerator +import com.app.paperstow.data.nlp.RegexNaturalLanguageParser +import com.app.paperstow.data.scanner.MlKitMetadataExtractor +import com.app.paperstow.data.tags.AutoTagGeneratorImpl +import com.app.paperstow.domain.repository.AuthRepository +import com.app.paperstow.domain.repository.AutoTagGenerator +import com.app.paperstow.domain.repository.DocumentChecklistGenerator +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.MetadataExtractor +import com.app.paperstow.domain.repository.NaturalLanguageParser +import com.app.paperstow.domain.repository.SearchEngine +import com.app.paperstow.domain.repository.SessionManager +import com.app.paperstow.domain.repository.TagRepository import dagger.Binds import dagger.Module import dagger.Provides @@ -61,7 +61,7 @@ object DatabaseModule { context, TravelDocsDatabase::class.java, "traveldocs.db" - ).build() + ).addMigrations(TravelDocsDatabase.MIGRATION_2_3, TravelDocsDatabase.MIGRATION_3_4).build() } @Provides fun provideDocumentDao(db: TravelDocsDatabase): DocumentDao = db.documentDao() diff --git a/app/src/main/java/com/app/traveldocs/domain/model/.gitkeep b/app/src/main/java/com/app/paperstow/domain/model/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/domain/model/.gitkeep rename to app/src/main/java/com/app/paperstow/domain/model/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/domain/model/AppError.kt b/app/src/main/java/com/app/paperstow/domain/model/AppError.kt similarity index 91% rename from app/src/main/java/com/app/traveldocs/domain/model/AppError.kt rename to app/src/main/java/com/app/paperstow/domain/model/AppError.kt index c02ff88..39caffb 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/AppError.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/AppError.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model sealed class AppError { data class StorageError(val message: String, val cause: Throwable?) : AppError() diff --git a/app/src/main/java/com/app/traveldocs/domain/model/Document.kt b/app/src/main/java/com/app/paperstow/domain/model/Document.kt similarity index 90% rename from app/src/main/java/com/app/traveldocs/domain/model/Document.kt rename to app/src/main/java/com/app/paperstow/domain/model/Document.kt index 0f71b87..7050a89 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/Document.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/Document.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model import java.time.Instant diff --git a/app/src/main/java/com/app/paperstow/domain/model/DocumentFormat.kt b/app/src/main/java/com/app/paperstow/domain/model/DocumentFormat.kt new file mode 100644 index 0000000..8674cce --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/model/DocumentFormat.kt @@ -0,0 +1,25 @@ +package com.app.paperstow.domain.model + +/** + * File formats Paperstow can stow. + * + * Core travel papers: PDF, JPEG, PNG, WEBP, HEIC, BMP, GIF, plain text, markdown, and GPX. + * VIDEO / AUDIO / DICOM remain in the enum so older stored files still open; + * they are not offered as import types. + */ +enum class DocumentFormat { + PDF, + JPG, + PNG, + TEXT, + MARKDOWN, + GPX, + WEBP, + HEIC, + BMP, + GIF, + VIDEO, + AUDIO, + DICOM, + UNKNOWN, +} diff --git a/app/src/main/java/com/app/traveldocs/domain/model/DocumentType.kt b/app/src/main/java/com/app/paperstow/domain/model/DocumentType.kt similarity index 74% rename from app/src/main/java/com/app/traveldocs/domain/model/DocumentType.kt rename to app/src/main/java/com/app/paperstow/domain/model/DocumentType.kt index bab43bb..98d2c71 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/DocumentType.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/DocumentType.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model enum class DocumentType { PASSPORT, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/ExtractionResult.kt b/app/src/main/java/com/app/paperstow/domain/model/ExtractionResult.kt similarity index 68% rename from app/src/main/java/com/app/traveldocs/domain/model/ExtractionResult.kt rename to app/src/main/java/com/app/paperstow/domain/model/ExtractionResult.kt index 5566722..64ca383 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/ExtractionResult.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/ExtractionResult.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class ExtractedValue( val value: String, @@ -9,5 +9,6 @@ data class ExtractionResult( val documentType: DocumentType, val metadata: Map, val confidence: Float, - val requiresManualReview: Boolean + val requiresManualReview: Boolean, + val rawText: String = "" ) diff --git a/app/src/main/java/com/app/traveldocs/domain/model/ImportedDocument.kt b/app/src/main/java/com/app/paperstow/domain/model/ImportedDocument.kt similarity index 94% rename from app/src/main/java/com/app/traveldocs/domain/model/ImportedDocument.kt rename to app/src/main/java/com/app/paperstow/domain/model/ImportedDocument.kt index 683623e..2d31929 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/ImportedDocument.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/ImportedDocument.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class ImportedDocument( val rawBytes: ByteArray, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/LockoutState.kt b/app/src/main/java/com/app/paperstow/domain/model/LockoutState.kt similarity index 74% rename from app/src/main/java/com/app/traveldocs/domain/model/LockoutState.kt rename to app/src/main/java/com/app/paperstow/domain/model/LockoutState.kt index 4aea6e4..52a1470 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/LockoutState.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/LockoutState.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class LockoutState( val isLocked: Boolean, diff --git a/app/src/main/java/com/app/paperstow/domain/model/MarkdownChecklist.kt b/app/src/main/java/com/app/paperstow/domain/model/MarkdownChecklist.kt new file mode 100644 index 0000000..38636be --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/model/MarkdownChecklist.kt @@ -0,0 +1,85 @@ +package com.app.paperstow.domain.model + +/** + * Tiny markdown checklist used for plans and action items. + * Understands headings, notes, `- [ ]` / `- [x]`, and plain `-` / `*` bullets. + */ +data class ChecklistItem( + val text: String, + val done: Boolean = false +) + +data class MarkdownChecklist( + val title: String = "", + val notes: String = "", + val items: List = emptyList() +) { + fun toMarkdown(): String { + val parts = mutableListOf() + val heading = title.trim() + if (heading.isNotEmpty()) parts += "# $heading" + val body = notes.trim() + if (body.isNotEmpty()) { + if (parts.isNotEmpty()) parts += "" + parts += body + } + if (items.isNotEmpty()) { + if (parts.isNotEmpty()) parts += "" + items.forEach { item -> + val mark = if (item.done) "x" else " " + parts += "- [$mark] ${item.text.trim()}" + } + } + return parts.joinToString("\n") + if (parts.isEmpty()) "" else "\n" + } + + companion object { + private val heading = Regex("""^\s{0,3}#{1,6}\s+(.*)$""") + private val checkbox = Regex("""^\s*[-*+]\s+\[([ xX])]\s+(.*)$""") + private val bullet = Regex("""^\s*[-*+]\s+(.*)$""") + + fun parse(markdown: String): MarkdownChecklist { + val title = StringBuilder() + val notes = StringBuilder() + val items = mutableListOf() + markdown.replace("\r\n", "\n").lines().forEach { raw -> + val line = raw.trimEnd() + when { + title.isEmpty() && items.isEmpty() && notes.isEmpty() && heading.matches(line) -> + title.append(heading.matchEntire(line)!!.groupValues[1].trim()) + checkbox.matches(line) -> { + val match = checkbox.matchEntire(line)!! + items += ChecklistItem( + text = match.groupValues[2].trim(), + done = match.groupValues[1].equals("x", ignoreCase = true) + ) + } + bullet.matches(line) -> + items += ChecklistItem(text = bullet.matchEntire(line)!!.groupValues[1].trim()) + line.isBlank() -> { + if (notes.isNotEmpty() && !notes.endsWith("\n\n")) notes.append('\n') + } + else -> { + if (notes.isNotEmpty() && !notes.endsWith("\n")) notes.append('\n') + notes.append(line) + } + } + } + return MarkdownChecklist( + title = title.toString().trim(), + notes = notes.toString().trim(), + items = items + ) + } + + fun starter(title: String = "Trip plans"): MarkdownChecklist = MarkdownChecklist( + title = title, + notes = "Tick items as you finish them. Add your own below.", + items = listOf( + ChecklistItem("Confirm tickets and seats"), + ChecklistItem("Pack medicines and chargers"), + ChecklistItem("Share the itinerary") + ) + ) + } +} diff --git a/app/src/main/java/com/app/traveldocs/domain/model/MetadataField.kt b/app/src/main/java/com/app/paperstow/domain/model/MetadataField.kt similarity index 85% rename from app/src/main/java/com/app/traveldocs/domain/model/MetadataField.kt rename to app/src/main/java/com/app/paperstow/domain/model/MetadataField.kt index ff0c7ab..cc28294 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/MetadataField.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/MetadataField.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model enum class MetadataField { ID_NUMBER, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/ParseResult.kt b/app/src/main/java/com/app/paperstow/domain/model/ParseResult.kt similarity index 76% rename from app/src/main/java/com/app/traveldocs/domain/model/ParseResult.kt rename to app/src/main/java/com/app/paperstow/domain/model/ParseResult.kt index fc38ce8..fc823a6 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/ParseResult.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/ParseResult.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class ParseResult( val intent: QueryIntent, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/QueryIntent.kt b/app/src/main/java/com/app/paperstow/domain/model/QueryIntent.kt similarity index 69% rename from app/src/main/java/com/app/traveldocs/domain/model/QueryIntent.kt rename to app/src/main/java/com/app/paperstow/domain/model/QueryIntent.kt index 2453d3f..ca26a65 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/QueryIntent.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/QueryIntent.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model enum class QueryIntent { DOCUMENT_SEARCH, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/SearchQuery.kt b/app/src/main/java/com/app/paperstow/domain/model/SearchQuery.kt similarity index 78% rename from app/src/main/java/com/app/traveldocs/domain/model/SearchQuery.kt rename to app/src/main/java/com/app/paperstow/domain/model/SearchQuery.kt index ce87d87..2e6c702 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/SearchQuery.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/SearchQuery.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class SearchQuery( val tags: List = emptyList(), diff --git a/app/src/main/java/com/app/traveldocs/domain/model/SearchResult.kt b/app/src/main/java/com/app/paperstow/domain/model/SearchResult.kt similarity index 87% rename from app/src/main/java/com/app/traveldocs/domain/model/SearchResult.kt rename to app/src/main/java/com/app/paperstow/domain/model/SearchResult.kt index 523acf0..b9fc8c5 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/SearchResult.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/SearchResult.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model sealed class SearchResult { data class DocumentResults(val documents: List) : SearchResult() diff --git a/app/src/main/java/com/app/traveldocs/domain/model/Tag.kt b/app/src/main/java/com/app/paperstow/domain/model/Tag.kt similarity index 64% rename from app/src/main/java/com/app/traveldocs/domain/model/Tag.kt rename to app/src/main/java/com/app/paperstow/domain/model/Tag.kt index 820c9db..6dfd6ce 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/Tag.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/Tag.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class Tag( val name: String, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/TravelDocumentChecklist.kt b/app/src/main/java/com/app/paperstow/domain/model/TravelDocumentChecklist.kt similarity index 88% rename from app/src/main/java/com/app/traveldocs/domain/model/TravelDocumentChecklist.kt rename to app/src/main/java/com/app/paperstow/domain/model/TravelDocumentChecklist.kt index 2e32c13..9cdc3d2 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/TravelDocumentChecklist.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/TravelDocumentChecklist.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class RequiredDocument( val type: DocumentType, diff --git a/app/src/main/java/com/app/traveldocs/domain/model/TravelParameters.kt b/app/src/main/java/com/app/paperstow/domain/model/TravelParameters.kt similarity index 80% rename from app/src/main/java/com/app/traveldocs/domain/model/TravelParameters.kt rename to app/src/main/java/com/app/paperstow/domain/model/TravelParameters.kt index 146e66b..18514b6 100644 --- a/app/src/main/java/com/app/traveldocs/domain/model/TravelParameters.kt +++ b/app/src/main/java/com/app/paperstow/domain/model/TravelParameters.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.model +package com.app.paperstow.domain.model data class TravelParameters( val familySize: Int?, diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/AuthRepository.kt b/app/src/main/java/com/app/paperstow/domain/repository/AuthRepository.kt similarity index 81% rename from app/src/main/java/com/app/traveldocs/domain/repository/AuthRepository.kt rename to app/src/main/java/com/app/paperstow/domain/repository/AuthRepository.kt index e611264..655c18f 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/AuthRepository.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/AuthRepository.kt @@ -1,6 +1,6 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository -import com.app.traveldocs.domain.model.LockoutState +import com.app.paperstow.domain.model.LockoutState interface AuthRepository { suspend fun createPin(memberId: String, pin: String): Result diff --git a/app/src/main/java/com/app/paperstow/domain/repository/AutoTagGenerator.kt b/app/src/main/java/com/app/paperstow/domain/repository/AutoTagGenerator.kt new file mode 100644 index 0000000..befcc5f --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/repository/AutoTagGenerator.kt @@ -0,0 +1,9 @@ +package com.app.paperstow.domain.repository + +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.ExtractedValue +import com.app.paperstow.domain.model.MetadataField + +interface AutoTagGenerator { + fun generateTags(documentType: DocumentType, metadata: Map): List +} diff --git a/app/src/main/java/com/app/paperstow/domain/repository/DocumentChecklistGenerator.kt b/app/src/main/java/com/app/paperstow/domain/repository/DocumentChecklistGenerator.kt new file mode 100644 index 0000000..5da966e --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/repository/DocumentChecklistGenerator.kt @@ -0,0 +1,11 @@ +package com.app.paperstow.domain.repository + +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.MissingDocument +import com.app.paperstow.domain.model.TravelDocumentChecklist +import com.app.paperstow.domain.model.TravelParameters + +interface DocumentChecklistGenerator { + fun generateChecklist(params: TravelParameters): TravelDocumentChecklist + fun detectMissing(checklist: TravelDocumentChecklist, existingDocuments: List): List +} diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentFileStorage.kt b/app/src/main/java/com/app/paperstow/domain/repository/DocumentFileStorage.kt similarity index 59% rename from app/src/main/java/com/app/traveldocs/domain/repository/DocumentFileStorage.kt rename to app/src/main/java/com/app/paperstow/domain/repository/DocumentFileStorage.kt index 7ec732b..79dd5c0 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentFileStorage.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/DocumentFileStorage.kt @@ -1,9 +1,10 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository -import com.app.traveldocs.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentFormat interface DocumentFileStorage { suspend fun store(memberId: String, fileData: ByteArray, format: DocumentFormat): Result suspend fun retrieve(fileId: String): Result + suspend fun replace(fileId: String, fileData: ByteArray): Result suspend fun secureDelete(fileId: String): Result } diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentImporter.kt b/app/src/main/java/com/app/paperstow/domain/repository/DocumentImporter.kt similarity index 66% rename from app/src/main/java/com/app/traveldocs/domain/repository/DocumentImporter.kt rename to app/src/main/java/com/app/paperstow/domain/repository/DocumentImporter.kt index 41d6726..52d49ca 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentImporter.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/DocumentImporter.kt @@ -1,8 +1,8 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository import android.net.Uri -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.ImportedDocument +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.ImportedDocument interface DocumentImporter { suspend fun importFromCamera(): Result diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentRepository.kt b/app/src/main/java/com/app/paperstow/domain/repository/DocumentRepository.kt similarity index 54% rename from app/src/main/java/com/app/traveldocs/domain/repository/DocumentRepository.kt rename to app/src/main/java/com/app/paperstow/domain/repository/DocumentRepository.kt index 800a4a7..c85c1b6 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/DocumentRepository.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/DocumentRepository.kt @@ -1,14 +1,17 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.SearchQuery +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.SearchQuery import kotlinx.coroutines.flow.Flow +import java.time.Instant interface DocumentRepository { suspend fun getAll(memberId: String): Flow> suspend fun getById(documentId: String): Document? suspend fun insert(document: Document): Result + suspend fun updateName(documentId: String, originalFileName: String, updatedAt: Instant): Result suspend fun delete(documentId: String): Result suspend fun getCount(memberId: String): Int suspend fun search(memberId: String, query: SearchQuery): List + suspend fun updateOcrText(documentId: String, ocrText: String): Result } diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/MetadataExtractor.kt b/app/src/main/java/com/app/paperstow/domain/repository/MetadataExtractor.kt similarity index 55% rename from app/src/main/java/com/app/traveldocs/domain/repository/MetadataExtractor.kt rename to app/src/main/java/com/app/paperstow/domain/repository/MetadataExtractor.kt index a3f34ec..5a87e08 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/MetadataExtractor.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/MetadataExtractor.kt @@ -1,7 +1,7 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.ExtractionResult +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.ExtractionResult interface MetadataExtractor { suspend fun extract(imageData: ByteArray): Result diff --git a/app/src/main/java/com/app/paperstow/domain/repository/NaturalLanguageParser.kt b/app/src/main/java/com/app/paperstow/domain/repository/NaturalLanguageParser.kt new file mode 100644 index 0000000..30a7c41 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/repository/NaturalLanguageParser.kt @@ -0,0 +1,7 @@ +package com.app.paperstow.domain.repository + +import com.app.paperstow.domain.model.ParseResult + +interface NaturalLanguageParser { + fun parse(query: String): ParseResult +} diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/SearchEngine.kt b/app/src/main/java/com/app/paperstow/domain/repository/SearchEngine.kt similarity index 65% rename from app/src/main/java/com/app/traveldocs/domain/repository/SearchEngine.kt rename to app/src/main/java/com/app/paperstow/domain/repository/SearchEngine.kt index b379b04..e0da936 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/SearchEngine.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/SearchEngine.kt @@ -1,7 +1,7 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.SearchResult +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.SearchResult interface SearchEngine { suspend fun searchByTags(memberId: String, tags: List): List diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/SessionManager.kt b/app/src/main/java/com/app/paperstow/domain/repository/SessionManager.kt similarity index 84% rename from app/src/main/java/com/app/traveldocs/domain/repository/SessionManager.kt rename to app/src/main/java/com/app/paperstow/domain/repository/SessionManager.kt index 4271331..c823422 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/SessionManager.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/SessionManager.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository import kotlinx.coroutines.flow.StateFlow diff --git a/app/src/main/java/com/app/traveldocs/domain/repository/TagRepository.kt b/app/src/main/java/com/app/paperstow/domain/repository/TagRepository.kt similarity index 69% rename from app/src/main/java/com/app/traveldocs/domain/repository/TagRepository.kt rename to app/src/main/java/com/app/paperstow/domain/repository/TagRepository.kt index 59212de..f4273bb 100644 --- a/app/src/main/java/com/app/traveldocs/domain/repository/TagRepository.kt +++ b/app/src/main/java/com/app/paperstow/domain/repository/TagRepository.kt @@ -1,6 +1,6 @@ -package com.app.traveldocs.domain.repository +package com.app.paperstow.domain.repository -import com.app.traveldocs.domain.model.Tag +import com.app.paperstow.domain.model.Tag interface TagRepository { suspend fun getTagsForDocument(documentId: String): List @@ -8,4 +8,5 @@ interface TagRepository { suspend fun removeTag(documentId: String, tagName: String): Result suspend fun deleteTagGlobally(memberId: String, tagName: String): Result suspend fun getAllTags(memberId: String): List + suspend fun createStandaloneTag(memberId: String, tagName: String): Result } diff --git a/app/src/main/java/com/app/paperstow/domain/safety/GpxTrail.kt b/app/src/main/java/com/app/paperstow/domain/safety/GpxTrail.kt new file mode 100644 index 0000000..4a9b4d4 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/safety/GpxTrail.kt @@ -0,0 +1,93 @@ +package com.app.paperstow.domain.safety + +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone + +/** + * GPX 1.1 write/read for My Trail points. Keeps the file plain so a backup ZIP + * can be unzipped and opened in any map app. + */ +object GpxTrail { + fun toGpx(placesOldestFirst: List, name: String = "My Trail"): String { + val iso = isoFormatter() + val body = StringBuilder() + body.appendLine("") + body.appendLine("") + body.appendLine(" ") + body.appendLine(" ${escape(name)}") + body.appendLine(" ") + body.appendLine(" ") + body.appendLine(" ${escape(name)}") + body.appendLine(" ") + placesOldestFirst.forEach { place -> + body.appendLine( + " " + ) + body.appendLine(" ") + if (place.batteryPercent in 0..100) { + body.appendLine(" battery ${place.batteryPercent}%") + } + body.appendLine(" ") + } + body.appendLine(" ") + body.appendLine(" ") + body.appendLine("") + return body.toString() + } + + fun parse(xml: String): List { + val points = mutableListOf() + val point = Regex( + """<(?:trkpt|wpt)\s+lat="([+-]?\d+(?:\.\d+)?)"\s+lon="([+-]?\d+(?:\.\d+)?)"\s*>(.*?)""", + setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE) + ) + val timeTag = Regex("""""", RegexOption.IGNORE_CASE) + val batteryTag = Regex("""battery\s+(\d{1,3})\s*%""", RegexOption.IGNORE_CASE) + point.findAll(xml).forEach { match -> + val lat = match.groupValues[1].toDoubleOrNull() ?: return@forEach + val lon = match.groupValues[2].toDoubleOrNull() ?: return@forEach + val inner = match.groupValues[3] + val time = timeTag.find(inner)?.groupValues?.get(1)?.let { parseIso(it) } ?: 0L + val battery = batteryTag.find(inner)?.groupValues?.get(1)?.toIntOrNull() ?: -1 + points += SafetyPlace(lat, lon, time, battery) + } + return points + } + + fun looksLikeGpx(bytes: ByteArray): Boolean { + if (bytes.isEmpty()) return false + val head = String(bytes, 0, minOf(bytes.size, 800), Charsets.UTF_8) + return head.contains("", ">") + .replace("\"", """) + + private fun isoFormatter(): SimpleDateFormat = + SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US).apply { + timeZone = TimeZone.getTimeZone("UTC") + } + + private fun parseIso(value: String): Long { + val cleaned = value.trim() + val patterns = listOf( + "yyyy-MM-dd'T'HH:mm:ss'Z'", + "yyyy-MM-dd'T'HH:mm:ssX", + "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" + ) + for (pattern in patterns) { + try { + val fmt = SimpleDateFormat(pattern, Locale.US).apply { + timeZone = TimeZone.getTimeZone("UTC") + } + return fmt.parse(cleaned)?.time ?: continue + } catch (_: Exception) { + // try next pattern + } + } + return 0L + } +} diff --git a/app/src/main/java/com/app/paperstow/domain/safety/UniqueLocations.kt b/app/src/main/java/com/app/paperstow/domain/safety/UniqueLocations.kt new file mode 100644 index 0000000..86cedb5 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/domain/safety/UniqueLocations.kt @@ -0,0 +1,105 @@ +package com.app.paperstow.domain.safety + +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import java.util.TimeZone +import kotlin.math.asin +import kotlin.math.cos +import kotlin.math.pow +import kotlin.math.sin +import kotlin.math.sqrt + +data class SafetyPlace( + val latitude: Double, + val longitude: Double, + val timestamp: Long, + val batteryPercent: Int = -1 +) + +/** + * Unique places for My Trail: keep a new point only when the device + * has moved far enough, and drop anything older than 24 hours. + */ +object UniqueLocations { + const val MIN_SEPARATION_METERS = 150.0 + const val WINDOW_MS = 24L * 60 * 60 * 1000 + const val MAX_ACCURACY_METERS = 500f + + fun metersBetween(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double { + val earthMeters = 6_371_000.0 + val dLat = Math.toRadians(lat2 - lat1) + val dLon = Math.toRadians(lon2 - lon1) + val a = sin(dLat / 2).pow(2) + + cos(Math.toRadians(lat1)) * cos(Math.toRadians(lat2)) * sin(dLon / 2).pow(2) + return 2 * earthMeters * asin(sqrt(a.coerceIn(0.0, 1.0))) + } + + fun isNewPlace( + lastLat: Double, + lastLon: Double, + nextLat: Double, + nextLon: Double, + minMeters: Double = MIN_SEPARATION_METERS + ): Boolean = metersBetween(lastLat, lastLon, nextLat, nextLon) >= minMeters + + fun inWindow( + places: List, + nowMs: Long = System.currentTimeMillis(), + windowMs: Long = WINDOW_MS + ): List = places.filter { nowMs - it.timestamp <= windowMs } + + fun mapsUrl(latitude: Double, longitude: Double): String = + "https://maps.google.com/?q=$latitude,$longitude" + + fun shareAll( + placesNewestFirst: List, + locale: Locale = Locale.getDefault(), + timeZone: TimeZone = TimeZone.getDefault() + ): String { + if (placesNewestFirst.isEmpty()) { + return "Paperstow — no unique places in My Trail on this phone." + } + val fmt = timeFormatter(locale, timeZone) + val last = placesNewestFirst.first() + val sb = StringBuilder() + sb.appendLine("Paperstow — My Trail (this phone only)") + sb.appendLine() + sb.appendLine("Last known (${fmt.format(Date(last.timestamp))})${batterySuffix(last)}:") + sb.appendLine(mapsUrl(last.latitude, last.longitude)) + val earlier = placesNewestFirst.drop(1) + if (earlier.isNotEmpty()) { + sb.appendLine() + sb.appendLine("Earlier:") + earlier.forEach { place -> + sb.appendLine("• ${fmt.format(Date(place.timestamp))}${batterySuffix(place)} — ${mapsUrl(place.latitude, place.longitude)}") + } + } + return sb.toString().trimEnd() + } + + fun shareLastKnown( + place: SafetyPlace, + locale: Locale = Locale.getDefault(), + timeZone: TimeZone = TimeZone.getDefault() + ): String { + val fmt = timeFormatter(locale, timeZone) + return buildString { + appendLine("Paperstow — last known place") + appendLine("${fmt.format(Date(place.timestamp))}${batterySuffix(place)}") + append(mapsUrl(place.latitude, place.longitude)) + }.trimEnd() + } + + fun batteryLabel(percent: Int): String? = + if (percent in 0..100) "Battery $percent%" else null + + private fun batterySuffix(place: SafetyPlace): String { + val label = batteryLabel(place.batteryPercent) ?: return "" + return " · $label" + } + + private fun timeFormatter(locale: Locale, timeZone: TimeZone): SimpleDateFormat { + return SimpleDateFormat("h:mm a", locale).apply { this.timeZone = timeZone } + } +} diff --git a/app/src/main/java/com/app/traveldocs/domain/usecase/.gitkeep b/app/src/main/java/com/app/paperstow/domain/usecase/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/domain/usecase/.gitkeep rename to app/src/main/java/com/app/paperstow/domain/usecase/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/domain/usecase/DocumentImportUseCase.kt b/app/src/main/java/com/app/paperstow/domain/usecase/DocumentImportUseCase.kt similarity index 63% rename from app/src/main/java/com/app/traveldocs/domain/usecase/DocumentImportUseCase.kt rename to app/src/main/java/com/app/paperstow/domain/usecase/DocumentImportUseCase.kt index 89bc786..4c683d7 100644 --- a/app/src/main/java/com/app/traveldocs/domain/usecase/DocumentImportUseCase.kt +++ b/app/src/main/java/com/app/paperstow/domain/usecase/DocumentImportUseCase.kt @@ -1,16 +1,18 @@ -package com.app.traveldocs.domain.usecase +package com.app.paperstow.domain.usecase -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentType -import com.app.traveldocs.domain.model.ExtractionResult -import com.app.traveldocs.domain.model.ImportedDocument -import com.app.traveldocs.domain.model.MetadataField -import com.app.traveldocs.domain.model.Tag -import com.app.traveldocs.domain.repository.AutoTagGenerator -import com.app.traveldocs.domain.repository.DocumentFileStorage -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.MetadataExtractor +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.ExtractionResult +import com.app.paperstow.domain.model.ImportedDocument +import com.app.paperstow.domain.model.MetadataField +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.AutoTagGenerator +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.MetadataExtractor +import dagger.hilt.android.qualifiers.ApplicationContext +import android.content.Context import java.time.Instant import java.util.UUID import javax.inject.Inject @@ -28,6 +30,7 @@ import javax.inject.Inject * Pipeline steps are logged extensively for debugging large imports. */ class DocumentImportUseCase @Inject constructor( + @ApplicationContext private val context: Context, private val fileStorage: DocumentFileStorage, private val metadataExtractor: MetadataExtractor, private val documentRepository: DocumentRepository, @@ -53,11 +56,11 @@ class DocumentImportUseCase @Inject constructor( // Step 2: Extract metadata (graceful degradation on failure) DebugLogger.d("Import", "Step 2: Extracting metadata via ML Kit OCR...") val extractionResult = try { - val result = metadataExtractor.extract(importedDocument.rawBytes).getOrNull() + val result = ocrDocument(importedDocument.format, importedDocument.rawBytes) if (result != null) { - DebugLogger.i("Import", "Step 2 OK: type=${result.documentType}, confidence=${result.confidence}, fields=${result.metadata.size}, manualReview=${result.requiresManualReview}") + DebugLogger.i("Import", "Step 2 OK: type=${result.documentType}, confidence=${result.confidence}, fields=${result.metadata.size}, textChars=${result.rawText.length}") } else { - DebugLogger.w("Import", "Step 2: Extraction returned null (graceful degradation)") + DebugLogger.w("Import", "Step 2: No OCR text (format=${importedDocument.format})") } result } catch (e: Exception) { @@ -83,10 +86,10 @@ class DocumentImportUseCase @Inject constructor( } // Step 3b: Tag unsupported formats so they're easy to find - val formatTags = if (importedDocument.format == com.app.traveldocs.domain.model.DocumentFormat.AUDIO) { - autoTags + com.app.traveldocs.domain.model.Tag(name = "__AUDIO", isAutoGenerated = true) - } else if (importedDocument.format == com.app.traveldocs.domain.model.DocumentFormat.UNKNOWN) { - autoTags + com.app.traveldocs.domain.model.Tag(name = "__UNSUPPORTED", isAutoGenerated = true) + val formatTags = if (importedDocument.format == com.app.paperstow.domain.model.DocumentFormat.AUDIO) { + autoTags + com.app.paperstow.domain.model.Tag(name = "__AUDIO", isAutoGenerated = true) + } else if (importedDocument.format == com.app.paperstow.domain.model.DocumentFormat.UNKNOWN) { + autoTags + com.app.paperstow.domain.model.Tag(name = "__UNSUPPORTED", isAutoGenerated = true) } else autoTags // Step 4: Build and store the Document @@ -107,6 +110,16 @@ class DocumentImportUseCase @Inject constructor( ) val insertResult = documentRepository.insert(document) + insertResult.onSuccess { + val indexText = com.app.paperstow.data.local.SearchIndex.textForImport( + importedDocument.format, + importedDocument.rawBytes, + extractionResult?.rawText.orEmpty() + ) + if (indexText.isNotBlank()) { + documentRepository.updateOcrText(document.id, indexText) + } + } val elapsed = System.currentTimeMillis() - startTime insertResult.onSuccess { DebugLogger.i("Import", "═══ Pipeline COMPLETE in ${elapsed}ms: docId=${document.id}, type=${document.type}") @@ -116,4 +129,21 @@ class DocumentImportUseCase @Inject constructor( } return insertResult.map { document } } + + private suspend fun ocrDocument( + format: com.app.paperstow.domain.model.DocumentFormat, + bytes: ByteArray + ): ExtractionResult? { + val pages = com.app.paperstow.data.local.SearchIndex.imagesForOcr(format, bytes, context.cacheDir) + if (pages.isEmpty()) return null + val results = pages.mapNotNull { page -> + val outcome = metadataExtractor.extract(page) + outcome.onFailure { e -> DebugLogger.w("Import", "OCR page failed: ${e.message}") } + outcome.getOrNull() + } + if (results.isEmpty()) return null + val best = results.maxBy { it.confidence } + val combined = results.joinToString("\n\n") { it.rawText }.trim() + return best.copy(rawText = combined) + } } diff --git a/app/src/main/java/com/app/paperstow/presentation/MainActivity.kt b/app/src/main/java/com/app/paperstow/presentation/MainActivity.kt new file mode 100644 index 0000000..7f9e020 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/MainActivity.kt @@ -0,0 +1,727 @@ +package com.app.paperstow.presentation + +import java.io.File +import android.content.Context +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Description +import androidx.compose.material.icons.filled.FlightTakeoff +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Folder +import androidx.compose.material.icons.filled.HealthAndSafety +import androidx.compose.material.icons.filled.Hotel +import androidx.compose.material.icons.filled.AccountBox +import androidx.compose.material.icons.filled.AirplanemodeActive +import androidx.compose.material.icons.filled.CreditCard +import androidx.compose.material.icons.filled.InsertDriveFile +import androidx.compose.material.icons.filled.LocalHospital +import androidx.compose.material.icons.filled.Public +import androidx.compose.material.icons.filled.Sell +import androidx.compose.material.icons.filled.QuestionMark +import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Settings +import androidx.compose.material.icons.filled.Share +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.saveable.rememberSaveable +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.debug.TempFileCleanup +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.presentation.documents.DocumentListScreen +import com.app.paperstow.presentation.documents.DocumentListViewModel +import com.app.paperstow.presentation.documents.DocumentViewerScreen +import com.app.paperstow.presentation.documents.ImportScreen +import com.app.paperstow.presentation.search.SearchScreen +import com.app.paperstow.presentation.settings.SettingsScreen +import com.app.paperstow.data.local.TagColorStore +import com.app.paperstow.presentation.tags.TagManagementScreen +import com.app.paperstow.presentation.tags.TagCover +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material.icons.filled.CheckCircle +import com.app.paperstow.presentation.demo.DemoDataViewModel +import com.app.paperstow.presentation.documents.ImportViewModel +import com.app.paperstow.BuildConfig +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : androidx.fragment.app.FragmentActivity() { + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + DebugLogger.i("MainActivity", "onCreate") + val telemetryConsented = getSharedPreferences("disclaimer_prefs", MODE_PRIVATE) + .getBoolean("telemetry_consented", false) + val settingsTelemetry = getSharedPreferences("app_settings", MODE_PRIVATE) + .getBoolean("telemetry_enabled", false) + com.app.paperstow.debug.UsageTelemetry.setConsent(telemetryConsented || settingsTelemetry) + com.app.paperstow.debug.UsageTelemetry.resetSession() + + setContent { + val eulaPrefs = remember { getSharedPreferences("eula_prefs", MODE_PRIVATE) } + val splashPrefs = remember { getSharedPreferences("splash_prefs", MODE_PRIVATE) } + val disclaimerPrefs = remember { getSharedPreferences("disclaimer_prefs", MODE_PRIVATE) } + // Check if launched via share intent (another app shared a doc to us) + val sharedUri = remember { + val action = intent?.action + if (action == android.content.Intent.ACTION_SEND) { + intent?.getParcelableExtra(android.content.Intent.EXTRA_STREAM) + } else if (action == android.content.Intent.ACTION_VIEW) { + intent?.data + } else null + } + + val initialScreen = when { + !eulaPrefs.getBoolean("eula_accepted", false) -> "eula" + !splashPrefs.getBoolean("trail_intro_shown", false) -> "splash" + !disclaimerPrefs.getBoolean("disclaimer_accepted", false) -> "disclaimer" + else -> "pin" + } + var screen by rememberSaveable { mutableStateOf(initialScreen) } + var selectedDocId by rememberSaveable { mutableStateOf(null) } + var noteDocId by rememberSaveable { mutableStateOf(null) } + var currentDocIds by rememberSaveable { mutableStateOf(listOf()) } + var viewerOrigin by rememberSaveable { mutableStateOf("main") } + var homeFolderTag by rememberSaveable { mutableStateOf(null) } + var documentListFilterTag by rememberSaveable { mutableStateOf(null) } + var noteBody by rememberSaveable { mutableStateOf("") } + val listVm: DocumentListViewModel = hiltViewModel() + val allDocs by listVm.documents.collectAsState() + val selectedDoc = selectedDocId?.let { id -> allDocs.find { it.id == id } } + val noteDoc = noteDocId?.let { id -> allDocs.find { it.id == id } } + val currentDocList = currentDocIds.mapNotNull { id -> allDocs.find { it.id == id } } + // Dynamic dark/light theme - reads from SharedPreferences, updates immediately + val darkMode = remember { mutableStateOf(getSharedPreferences("app_settings", MODE_PRIVATE).getBoolean("dark_mode", false)) } + val colorScheme = if (darkMode.value) androidx.compose.material3.darkColorScheme() else androidx.compose.material3.lightColorScheme() + MaterialTheme(colorScheme = colorScheme) { + when { + screen == "eula" -> com.app.paperstow.presentation.onboarding.EulaScreen( + onAccepted = { + val prefs = getSharedPreferences("eula_prefs", MODE_PRIVATE) + val timestamp = System.currentTimeMillis() + prefs.edit() + .putBoolean("eula_accepted", true) + .putLong("accepted_timestamp", timestamp) + .apply() + com.app.paperstow.debug.DebugLogger.i("EULA", "Accepted at $timestamp") + screen = if (!splashPrefs.getBoolean("trail_intro_shown", false)) "splash" + else if (!disclaimerPrefs.getBoolean("disclaimer_accepted", false)) "disclaimer" + else "pin" + }, + onDeclined = { + com.app.paperstow.debug.DebugLogger.w("EULA", "Declined — closing app") + finishAffinity() + } + ) + screen == "splash" -> com.app.paperstow.presentation.onboarding.SplashScreen(onContinue = { skipInFuture -> + getSharedPreferences("splash_prefs", MODE_PRIVATE).edit() + .putBoolean("trail_intro_shown", true) + .putBoolean("skip_splash", skipInFuture || splashPrefs.getBoolean("skip_splash", false)) + .apply() + screen = if (!disclaimerPrefs.getBoolean("disclaimer_accepted", false)) "disclaimer" + else "pin" + }) + screen == "disclaimer" -> com.app.paperstow.presentation.onboarding.DisclaimerScreen(onAccepted = { telemetryConsent -> + getSharedPreferences("disclaimer_prefs", MODE_PRIVATE).edit().putBoolean("disclaimer_accepted", true).putLong("accepted_timestamp", System.currentTimeMillis()).putBoolean("telemetry_consented", telemetryConsent).apply() + getSharedPreferences("app_settings", MODE_PRIVATE).edit().putBoolean("telemetry_enabled", telemetryConsent).apply() + com.app.paperstow.debug.UsageTelemetry.setConsent(telemetryConsent) + screen = "pin" + }) + + screen == "pin" -> { + val fa = this@MainActivity as androidx.fragment.app.FragmentActivity + com.app.paperstow.presentation.auth.BiometricAuthScreen( + activity = fa, + onAuthenticated = { screen = if (sharedUri != null) "import_shared" else "main" }, + onSkipped = { screen = if (sharedUri != null) "import_shared" else "main" } + ) + } + screen == "import_shared" -> { + // Received a doc from another app — auto-import it + val importVm: com.app.paperstow.presentation.documents.ImportViewModel = hiltViewModel() + LaunchedEffect(sharedUri) { + if (sharedUri != null) { + com.app.paperstow.debug.DebugLogger.i("ShareTarget", "Auto-importing shared doc: $sharedUri") + importVm.importFile(sharedUri) + } + } + val sState by importVm.state.collectAsState() + Column(modifier = Modifier.fillMaxSize().padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { + when { + sState.isImporting -> { CircularProgressIndicator(Modifier.size(64.dp)); Spacer(Modifier.height(16.dp)); Text("Importing shared document...") } + sState.importedDocument != null -> { + Icon(Icons.Filled.CheckCircle, null, tint = Color(0xFF4CAF50), modifier = Modifier.size(64.dp)) + Spacer(Modifier.height(16.dp)); Text("Imported!", fontSize = 20.sp, fontWeight = FontWeight.Bold) + Spacer(Modifier.height(24.dp)); Button(onClick = { importVm.clearState(); screen = "main" }) { Text("Done") } + } + sState.error != null -> { + Text("\u274C", fontSize = 48.sp) + Spacer(Modifier.height(16.dp)); Text("Import Failed", color = Color(0xFFF44336)) + Text(sState.error ?: "", fontSize = 13.sp, color = Color.Gray) + Spacer(Modifier.height(24.dp)); Button(onClick = { screen = "main" }) { Text("Go to Home") } + } + else -> { CircularProgressIndicator(); Text("Preparing...") } + } + } + } + screen == "import" -> ImportScreen( + onDone = { screen = "main" } + ) + screen == "note" -> com.app.paperstow.presentation.documents.TextNoteEditorScreen( + existing = noteDoc, + initialBody = noteBody, + extraTags = listOfNotNull(homeFolderTag?.takeUnless { it.startsWith("__") }), + onBack = { screen = if (noteDocId != null) "viewer" else "main" }, + onSaved = { saved -> + selectedDocId = saved.id + noteDocId = saved.id + screen = "viewer" + } + ) + screen == "checklist" -> com.app.paperstow.presentation.documents.ChecklistEditorScreen( + existing = noteDoc, + initialBody = noteBody, + extraTags = listOfNotNull(homeFolderTag?.takeUnless { it.startsWith("__") }), + onBack = { screen = if (noteDocId != null) "viewer" else "main" }, + onSaved = { saved -> + selectedDocId = saved.id + noteDocId = saved.id + screen = "viewer" + } + ) + screen == "documents" -> DocumentListScreen( + filterTag = documentListFilterTag, + onBack = { + screen = if (documentListFilterTag != null) "tags" else "main" + }, + onDocumentClick = { doc -> selectedDocId = doc.id; viewerOrigin = "documents"; screen = "viewer" }, + onSetDocList = { currentDocIds = it.map { d -> d.id } } + ) + screen == "viewer" && selectedDoc != null -> { + val currentIdx = currentDocList.indexOfFirst { it.id == selectedDoc!!.id } + DocumentViewerScreen( + document = selectedDoc!!, + onBack = { screen = viewerOrigin }, + onPrev = if (currentIdx > 0) { { selectedDocId = currentDocList[currentIdx - 1].id } } else null, + onNext = if (currentIdx < currentDocList.size - 1) { { selectedDocId = currentDocList[currentIdx + 1].id } } else null, + onEditNote = { text -> + noteDocId = selectedDocId + noteBody = text + screen = if (selectedDoc?.format == DocumentFormat.MARKDOWN) "checklist" else "note" + } + ) + } + screen == "viewer" -> { + Box(Modifier.fillMaxSize(), contentAlignment = Alignment.Center) { + CircularProgressIndicator() + } + } + screen == "search" -> SearchScreen(onBack = { screen = "main" }, onDocumentClick = { doc -> selectedDocId = doc.id; viewerOrigin = "search"; screen = "viewer" }) + screen == "tags" -> TagManagementScreen( + onBack = { screen = "main" }, + onViewDocs = { tag -> + documentListFilterTag = tag + viewerOrigin = "documents" + screen = "documents" + } + ) + screen == "settings" -> SettingsScreen(onBack = { screen = "main" }, onReset = { resetApp() }) + screen == "about" -> com.app.paperstow.presentation.about.AboutScreen(onBack = { screen = "main" }) + screen == "eula_view" -> com.app.paperstow.presentation.onboarding.EulaViewScreen(onBack = { screen = "main" }) + screen == "review" -> com.app.paperstow.presentation.review.ReviewScreen(onBack = { screen = "main" }) + screen == "feedback" -> com.app.paperstow.presentation.feedback.FeedbackScreen( + onBack = { screen = "main" }, + onNoteSaved = { saved -> + selectedDocId = saved.id + viewerOrigin = "main" + homeFolderTag = com.app.paperstow.presentation.feedback.APP_FEEDBACK_TAG + screen = "viewer" + } + ) + screen == "backup" -> com.app.paperstow.presentation.backup.BackupOnlyScreen(onBack = { screen = "main" }) + screen == "restore" -> com.app.paperstow.presentation.backup.RestoreOnlyScreen(onBack = { screen = "main" }) + screen == "safety" -> com.app.paperstow.presentation.safety.SafetyLocationsScreen(onBack = { screen = "main" }) + else -> { + com.app.paperstow.presentation.safety.AutoStartTrailIfWanted() + MainScreen( + onImport = { com.app.paperstow.debug.UsageTelemetry.action("Main", "tap_import"); screen = "import" }, + onNewNote = { noteDocId = null; noteBody = ""; screen = "note" }, + onNewChecklist = { noteDocId = null; noteBody = ""; screen = "checklist" }, + onAllDocs = { + com.app.paperstow.debug.UsageTelemetry.action("Main", "tap_documents") + documentListFilterTag = null + screen = "documents" + }, + onSearch = { com.app.paperstow.debug.UsageTelemetry.action("Main", "tap_search"); screen = "search" }, + onTags = { screen = "tags" }, + onSettings = { screen = "settings" }, + onBackup = { screen = "backup" }, + onRestore = { screen = "restore" }, + onAbout = { screen = "about" }, + onFeedback = { screen = "feedback" }, + onReview = { screen = "review" }, + onSafety = { screen = "safety" }, + selectedFolder = homeFolderTag, + onFolderChange = { homeFolderTag = it }, + onDocClick = { doc, folderDocs -> + selectedDocId = doc.id + currentDocIds = folderDocs.map { it.id } + viewerOrigin = "main" + screen = "viewer" + }, + ) + } + } + } + } + } + + override fun onResume() { super.onResume(); Thread { TempFileCleanup.cleanSharedDocs(applicationContext) }.start() } + override fun onPause() { super.onPause(); com.app.paperstow.debug.UsageTelemetry.emitSessionSummary() } + + private fun resetApp(): String { + DebugLogger.w("App", "!!! FACTORY RESET triggered by user") + val report = StringBuilder() + + // Checkpoint WAL before any operations + val dbPath = getDatabasePath("traveldocs.db") + try { + if (dbPath.exists()) { + val flushDb = android.database.sqlite.SQLiteDatabase.openDatabase(dbPath.path, null, android.database.sqlite.SQLiteDatabase.OPEN_READWRITE) + flushDb.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)", null).close() + flushDb.close() + report.appendLine("WAL checkpoint: done") + } + } catch (e: Exception) { report.appendLine("WAL checkpoint: skipped (${e.message})") } + + // Archive old database + if (dbPath.exists()) { + val archiveDir = java.io.File(filesDir, "db_archive") + archiveDir.mkdirs() + for (i in 10 downTo 2) { + val older = java.io.File(archiveDir, "traveldocs.db.${String.format("%03d", i - 1)}") + val newer = java.io.File(archiveDir, "traveldocs.db.${String.format("%03d", i)}") + if (older.exists()) older.renameTo(newer) + } + val archive = java.io.File(archiveDir, "traveldocs.db.001") + dbPath.copyTo(archive, overwrite = true) + report.appendLine("DB archived: ${archive.name} (${archive.length()/1024}KB)") + } + + // Delete database + journals + deleteDatabase("traveldocs.db") + java.io.File(dbPath.path + "-wal").delete() + java.io.File(dbPath.path + "-shm").delete() + report.appendLine("Database deleted: traveldocs.db + WAL/SHM") + + // Clear preferences + val prefsToWipe = listOf("traveldocs_stats", "encryption_consent", "disclaimer_prefs", + "splash_prefs", "eula_prefs", "location_tracking_prefs", "safety_trail_prefs", "feature_flags", + "app_settings", "tag_colors", "secure_doc_pins", "security_alert_prefs") + prefsToWipe.forEach { getSharedPreferences(it, MODE_PRIVATE).edit().clear().commit() } + report.appendLine("Preferences cleared: ${prefsToWipe.size} stores") + + // Delete document files + val docsDir = java.io.File(filesDir, "docs") + val docCount = if (docsDir.exists()) docsDir.walkTopDown().filter { it.isFile }.count() else 0 + docsDir.deleteRecursively() + report.appendLine("Document files deleted: $docCount files") + + // Delete debug logs + val logsDir = java.io.File(filesDir, "debug_logs") + logsDir.deleteRecursively() + report.appendLine("Debug logs deleted") + + // Delete crash report + java.io.File(filesDir, "last_crash_report.txt").delete() + report.appendLine("Crash report deleted") + + // Delete cache + cacheDir.deleteRecursively() + report.appendLine("Cache cleared") + + report.appendLine("") + report.appendLine("Reset complete. App needs restart to initialize fresh.") + return report.toString() + } +} + + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MainScreen( + onImport: () -> Unit, onNewNote: () -> Unit, onNewChecklist: () -> Unit, onAllDocs: () -> Unit, onSearch: () -> Unit, + onTags: () -> Unit, onSettings: () -> Unit, onBackup: () -> Unit, onRestore: () -> Unit, onAbout: () -> Unit, onFeedback: () -> Unit, onReview: () -> Unit, + onSafety: () -> Unit, + selectedFolder: String? = null, + onFolderChange: (String?) -> Unit = {}, + onDocClick: (Document, List) -> Unit +) { + val viewModel: DocumentListViewModel = hiltViewModel() + val demoViewModel: DemoDataViewModel = hiltViewModel() + val context = androidx.compose.ui.platform.LocalContext.current + val tagLooks = remember { TagColorStore(context) } + val documents by viewModel.documents.collectAsState() + val demo by demoViewModel.state.collectAsState() + var isRefreshing by remember { mutableStateOf(false) } + val refreshScope = rememberCoroutineScope() + var showGearMenu by remember { mutableStateOf(false) } + var showLoadDemo by remember { mutableStateOf(false) } + var showRemoveDemo by remember { mutableStateOf(false) } + var showTips by remember { + mutableStateOf(context.getSharedPreferences("app_settings", 0).getBoolean("show_tips", true)) + } + + if (showLoadDemo) { + AlertDialog( + onDismissRequest = { showLoadDemo = false }, + title = { Text("Load sample trip?") }, + text = { + Text( + "Adds a fictional trip for John Doe and Jane Doe — papers, health records, a checklist, and a sample trail. They stay on this phone. Remove them anytime from the menu.", + fontSize = 14.sp + ) + }, + confirmButton = { + TextButton(onClick = { + showLoadDemo = false + demoViewModel.importSampleTrip() + }) { Text("Load sample") } + }, + dismissButton = { TextButton(onClick = { showLoadDemo = false }) { Text("Not now") } } + ) + } + if (showRemoveDemo) { + AlertDialog( + onDismissRequest = { showRemoveDemo = false }, + title = { Text("Remove sample trip?") }, + text = { Text("This deletes only the sample papers. Anything you imported yourself stays.", fontSize = 14.sp) }, + confirmButton = { + TextButton(onClick = { + showRemoveDemo = false + demoViewModel.removeSampleTrip() + }) { Text("Remove samples") } + }, + dismissButton = { TextButton(onClick = { showRemoveDemo = false }) { Text("Cancel") } } + ) + } + Scaffold( + topBar = { + TopAppBar( + title = { val customTitle = remember { context.getSharedPreferences("app_settings", 0).getString("home_title", "Paperstow") ?: "Paperstow" }; Text(customTitle) }, + actions = { + IconButton(onClick = { isRefreshing = true; viewModel.forceRefresh(); refreshScope.launch { kotlinx.coroutines.delay(800); isRefreshing = false } }) { Icon(Icons.Filled.Refresh, "Refresh") } + Box { + IconButton(onClick = { showGearMenu = true }) { Icon(Icons.Filled.Settings, "More") } + DropdownMenu(expanded = showGearMenu, onDismissRequest = { showGearMenu = false }) { + DropdownMenuItem(text = { Text("Tags") }, onClick = { showGearMenu = false; onTags() }) + DropdownMenuItem(text = { Text("Review & Classify") }, onClick = { showGearMenu = false; onReview() }) + DropdownMenuItem(text = { Text("My Trail") }, onClick = { showGearMenu = false; onSafety() }) + HorizontalDivider() + DropdownMenuItem(text = { Text("Backup") }, onClick = { showGearMenu = false; onBackup() }) + DropdownMenuItem(text = { Text("Restore") }, onClick = { showGearMenu = false; onRestore() }) + HorizontalDivider() + if (!demo.loaded) { + DropdownMenuItem(text = { Text("Load sample trip") }, onClick = { showGearMenu = false; showLoadDemo = true }) + } else { + DropdownMenuItem(text = { Text("Remove sample trip") }, onClick = { showGearMenu = false; showRemoveDemo = true }) + } + HorizontalDivider() + DropdownMenuItem(text = { Text("Settings") }, onClick = { showGearMenu = false; onSettings() }) + DropdownMenuItem(text = { Text("Feedback") }, onClick = { showGearMenu = false; onFeedback() }) + DropdownMenuItem(text = { Text("About") }, onClick = { showGearMenu = false; onAbout() }) + } + } } + ) + } + ) { padding -> + Column(modifier = Modifier.fillMaxSize().padding(padding).padding(horizontal = 16.dp)) { + // Pull to refresh indicator + if (isRefreshing) { androidx.compose.material3.LinearProgressIndicator(modifier = Modifier.fillMaxWidth().padding(bottom = 4.dp)) } + androidx.compose.material3.TextButton(onClick = { isRefreshing = true; refreshScope.launch { delay(1000); isRefreshing = false } }, modifier = Modifier.fillMaxWidth().height(4.dp)) {} + val landscapeHome = androidx.compose.ui.platform.LocalConfiguration.current.orientation == android.content.res.Configuration.ORIENTATION_LANDSCAPE + if (landscapeHome) { + Row(modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = onImport, modifier = Modifier.weight(1f), colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF1565C0))) { + Icon(Icons.Filled.Add, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Import", fontSize = 13.sp) + } + OutlinedButton(onClick = onAllDocs, modifier = Modifier.weight(1f)) { + Icon(Icons.Filled.Folder, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("All Docs", fontSize = 13.sp) + } + OutlinedButton(onClick = onSearch, modifier = Modifier.weight(1f)) { + Icon(Icons.Filled.Search, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Search", fontSize = 13.sp) + } + OutlinedButton(onClick = onNewNote, modifier = Modifier.weight(1f)) { + Text("Note", fontSize = 13.sp) + } + OutlinedButton(onClick = onNewChecklist, modifier = Modifier.weight(1f)) { + Text("Checklist", fontSize = 13.sp) + } + } + } else { + Row(modifier = Modifier.fillMaxWidth().padding(vertical = 12.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Button(onClick = onImport, modifier = Modifier.weight(1f), colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF1565C0))) { + Icon(Icons.Filled.Add, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Import", fontSize = 13.sp) + } + OutlinedButton(onClick = onAllDocs, modifier = Modifier.weight(1f)) { + Icon(Icons.Filled.Folder, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("All Docs", fontSize = 13.sp) + } + OutlinedButton(onClick = onSearch, modifier = Modifier.weight(1f)) { + Icon(Icons.Filled.Search, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Search", fontSize = 13.sp) + } + } + Row(modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedButton(onClick = onNewNote, modifier = Modifier.weight(1f)) { + Text("Write a note", fontSize = 13.sp) + } + OutlinedButton(onClick = onNewChecklist, modifier = Modifier.weight(1f)) { + Text("Checklist", fontSize = 13.sp) + } + } + } + if (demo.busy) { + androidx.compose.material3.LinearProgressIndicator(modifier = Modifier.fillMaxWidth().padding(bottom = 8.dp)) + Text("Updating sample trip…", fontSize = 12.sp, color = Color.Gray, modifier = Modifier.padding(bottom = 8.dp)) + } + // Folder view by tags. Internal/system tags (__ prefix) stay hidden. + val allTags = documents.flatMap { it.tags }.map { it.name }.filter { !it.startsWith("__") }.distinct().sorted() + .filter { tagLooks.isShownOnHome(it) } + val untaggedDocs = documents.filter { it.tags.none { t -> !t.name.startsWith("__") } } + val selectedTag = selectedFolder + if (demo.message != null && selectedTag == null) { + Card( + Modifier.fillMaxWidth().padding(bottom = 8.dp), + colors = CardDefaults.cardColors(containerColor = Color(0xFFE3F2FD)) + ) { + Column(Modifier.padding(12.dp)) { + Text(demo.message!!, fontSize = 13.sp) + TextButton(onClick = { demoViewModel.dismissMessage() }) { Text("Got it") } + } + } + } + + if (demo.loaded && showTips && selectedTag == null && demo.message == null) { + Card( + Modifier.fillMaxWidth().padding(bottom = 10.dp), + colors = CardDefaults.cardColors(containerColor = Color(0xFFE8F5E9)) + ) { + Column(Modifier.padding(12.dp)) { + Text("Walk through the sample trip", fontWeight = FontWeight.SemiBold, fontSize = 14.sp) + Text("1. Open Passport, Health, or Plans", fontSize = 13.sp) + Text("2. Tap a PDF, checklist, or trail file to preview", fontSize = 13.sp) + Text("3. Search for “John Doe” or “Jane Doe”", fontSize = 13.sp) + Text("When you are ready, menu → Remove sample trip.", fontSize = 12.sp, color = Color.Gray) + TextButton(onClick = { + showTips = false + context.getSharedPreferences("app_settings", 0).edit().putBoolean("show_tips", false).apply() + }) { Text("Hide tips") } + } + } + } + + if (selectedTag != null) { + // Show documents in selected folder + val folderDocs = when (selectedTag) { + "__untagged__" -> untaggedDocs + else -> documents.filter { doc -> doc.tags.any { it.name == selectedTag } } + } + val folderTitle = when (selectedTag) { + "__untagged__" -> "Untagged" + else -> selectedTag!! + } + Row(Modifier.fillMaxWidth().padding(bottom = 8.dp), verticalAlignment = Alignment.CenterVertically) { + IconButton(onClick = { onFolderChange(null) }) { Icon(Icons.Filled.ArrowBack, "Back to folders") } + Text(folderTitle, fontWeight = FontWeight.Bold, fontSize = 16.sp) + Spacer(Modifier.weight(1f)) + Text("${folderDocs.size} docs", fontSize = 12.sp, color = Color.Gray) + IconButton(onClick = { viewModel.share(context, folderDocs) }) { Icon(Icons.Filled.Share, "Share this folder") } + } + LazyColumn(Modifier.weight(1f)) { + items(folderDocs.take(50)) { doc -> + DocCard(doc = doc, onClick = { onDocClick(doc, folderDocs) }) + Spacer(Modifier.height(6.dp)) + } + } + } else { + // Show folder grid + Text("Organized by tags", fontWeight = FontWeight.Bold, fontSize = 16.sp, modifier = Modifier.padding(bottom = 8.dp)) + val widthDp = androidx.compose.ui.platform.LocalConfiguration.current.screenWidthDp + val columns = when { + widthDp >= 840 -> 4 + widthDp >= 600 -> 3 + else -> 2 + } + val folders = allTags + (if (untaggedDocs.isNotEmpty()) listOf("__untagged__") else emptyList()) + if (folders.isEmpty()) { + Column(Modifier.fillMaxWidth().padding(vertical = 24.dp), horizontalAlignment = Alignment.CenterHorizontally) { + Icon(Icons.Filled.FlightTakeoff, null, Modifier.size(56.dp), tint = Color(0xFF1565C0)) + Spacer(Modifier.height(12.dp)) + Text("Nothing stowed yet", fontSize = 16.sp, color = Color.Gray) + Text("Try a sample family trip, or add your own papers.", fontSize = 13.sp, color = Color.Gray, modifier = Modifier.padding(horizontal = 12.dp)) + Spacer(Modifier.height(16.dp)) + Button(onClick = { showLoadDemo = true }, enabled = !demo.busy) { Text("Load sample trip") } + Spacer(Modifier.height(8.dp)) + Text("PDFs, photos, and notes — remove them from the menu anytime.", fontSize = 12.sp, color = Color.LightGray) + } + } else { + LazyVerticalGrid( + columns = GridCells.Fixed(columns), + modifier = Modifier.weight(1f), + horizontalArrangement = Arrangement.spacedBy(10.dp), + verticalArrangement = Arrangement.spacedBy(10.dp) + ) { + items(folders, key = { it }) { tag -> + val label = if (tag == "__untagged__") "Untagged" else tag + val count = if (tag == "__untagged__") untaggedDocs.size else documents.count { d -> d.tags.any { it.name == tag } } + FolderTile( + tag = tag, + label = label, + count = count, + store = tagLooks, + onClick = { onFolderChange(tag) } + ) + } + } + } + } } + } +} + +@Composable +private fun FolderTile( + tag: String, + label: String, + count: Int, + store: TagColorStore, + onClick: () -> Unit +) { + Card( + modifier = Modifier.fillMaxWidth().clickable(onClick = onClick), + shape = RoundedCornerShape(16.dp), + elevation = CardDefaults.cardElevation(1.dp) + ) { + Column(Modifier.fillMaxWidth().aspectRatio(0.92f)) { + TagCover( + tagName = tag, + store = store, + untagged = tag == "__untagged__", + modifier = Modifier.fillMaxWidth().weight(1f) + ) + Text( + "$label($count)", + modifier = Modifier.fillMaxWidth().padding(horizontal = 10.dp, vertical = 8.dp), + fontSize = 13.sp, + fontWeight = FontWeight.SemiBold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + textAlign = TextAlign.Center + ) + } + } +} + +@Composable +private fun DocCard(doc: Document, onClick: () -> Unit) { + Card(modifier = Modifier.fillMaxWidth().clickable(onClick = onClick), shape = RoundedCornerShape(10.dp), elevation = CardDefaults.cardElevation(1.dp)) { + Row(modifier = Modifier.fillMaxWidth().padding(12.dp), verticalAlignment = Alignment.CenterVertically) { + Icon(iconFor(doc.type), doc.type.name, tint = colorFor(doc.type), modifier = Modifier.size(36.dp)) + Spacer(Modifier.width(12.dp)) + Column(Modifier.weight(1f)) { + Text(doc.originalFileName ?: "Document", fontWeight = FontWeight.Medium, fontSize = 14.sp, maxLines = 1) + Text(doc.type.name, fontSize = 12.sp, color = Color.Gray) + if (doc.tags.isNotEmpty()) Text(doc.tags.joinToString(", ") { it.name }, fontSize = 11.sp, color = Color(0xFF1565C0), maxLines = 1) + } + } + } +} + +private fun iconFor(type: DocumentType): ImageVector = when (type) { + DocumentType.PASSPORT -> Icons.Filled.AccountBox + DocumentType.VISA -> Icons.Filled.CreditCard + DocumentType.TICKET -> Icons.Filled.AirplanemodeActive + DocumentType.HOTEL_BOOKING -> Icons.Filled.Hotel + DocumentType.HEALTH_INSURANCE -> Icons.Filled.LocalHospital + DocumentType.UNKNOWN -> Icons.Filled.InsertDriveFile +} + +private fun colorFor(type: DocumentType): Color = when (type) { + DocumentType.PASSPORT -> Color(0xFF1565C0) + DocumentType.VISA -> Color(0xFF4CAF50) + DocumentType.TICKET -> Color(0xFFFF9800) + DocumentType.HOTEL_BOOKING -> Color(0xFF9C27B0) + DocumentType.HEALTH_INSURANCE -> Color(0xFFF44336) + DocumentType.UNKNOWN -> Color.Gray +} + +private fun tagIcon(tag: String): androidx.compose.ui.graphics.vector.ImageVector { + return when (tag.lowercase()) { + "passport" -> androidx.compose.material.icons.Icons.Filled.AccountBox + "visa" -> androidx.compose.material.icons.Icons.Filled.CreditCard + "ticket", "flight" -> androidx.compose.material.icons.Icons.Filled.AirplanemodeActive + "accommodation", "hotel" -> androidx.compose.material.icons.Icons.Filled.Hotel + "health", "insurance" -> androidx.compose.material.icons.Icons.Filled.LocalHospital + "travel", "trip" -> androidx.compose.material.icons.Icons.Filled.FlightTakeoff + "family" -> androidx.compose.material.icons.Icons.Filled.Public + "business", "work" -> androidx.compose.material.icons.Icons.Filled.Description + else -> androidx.compose.material.icons.Icons.Filled.Sell + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/about/AboutScreen.kt b/app/src/main/java/com/app/paperstow/presentation/about/AboutScreen.kt new file mode 100644 index 0000000..ac64b59 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/about/AboutScreen.kt @@ -0,0 +1,170 @@ +package com.app.paperstow.presentation.about + +import android.content.Intent +import android.net.Uri +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.sp +import com.app.paperstow.BuildConfig +import com.app.paperstow.R + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AboutScreen(onBack: () -> Unit) { + val colors = MaterialTheme.colorScheme + val ctx = LocalContext.current + val privacyUrl = stringResource(R.string.privacy_policy_url) + var showSbom by remember { mutableStateOf(false) } + if (showSbom) { + SbomScreen(onBack = { showSbom = false }) + return + } + Scaffold(topBar = { TopAppBar(title = { Text("About") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> + Column(Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(16.dp)) { + Text("Paperstow", fontSize = 20.sp, fontWeight = FontWeight.Bold, color = colors.primary) + Text("Version ${BuildConfig.VERSION_NAME}", fontSize = 14.sp, color = colors.onSurfaceVariant) + Text("Package ${ctx.packageName}", fontSize = 13.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(8.dp)) + Text( + "Keep a copy of your family travel papers on this device.", + fontSize = 14.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(16.dp)) + + Text("Passports, visas, tickets, hotel bookings, and insurance stay encrypted here. The app may suggest a name or tag after a scan — treat that as a helper and always check the original page. Nothing is uploaded unless you share a file or export an archive.", fontSize = 13.sp) + Spacer(Modifier.height(20.dp)) + + SectionTitle("Security") + InfoRow("File Encryption", "AES-256-GCM (Android KeyStore)") + InfoRow("Authentication", "This device's fingerprint, face, or screen lock") + InfoRow("Archive", "Password-protected ZIP to a folder you pick") + Spacer(Modifier.height(16.dp)) + + SectionTitle("Privacy") + InfoRow("Storage", "Documents stay encrypted on this phone. Only you can open them.") + InfoRow("Reading pages", "On-device helper only. Results can be wrong or incomplete. Always check the original.") + InfoRow("Scan", "On-device ML Kit document scanner (edge detect, crop, enhance). Play services camera; Paperstow does not need camera permission for this.") + InfoRow("My Trail", "Optional unique places for 24 hours on this phone, with battery level at each save. Share Maps links yourself.") + InfoRow("Telemetry", "Optional, local usage counts. Off by default.") + InfoRow("Tag pictures", "Optional folder photo you pick. The photo stays on this phone.") + Spacer(Modifier.height(8.dp)) + OutlinedButton( + onClick = { ctx.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(privacyUrl))) }, + modifier = Modifier.fillMaxWidth() + ) { Text("Privacy Policy") } + Spacer(Modifier.height(16.dp)) + + SectionTitle("Permissions") + Text("Permissions are requested only when a feature needs them. Denying a permission does not break core import, view, search, or share.", fontSize = 12.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(8.dp)) + PermRow("Camera", "Fallback only if the on-device scanner is unavailable") + PermRow("Location", "Optional My Trail. Requested when you start it. Not used in the background after you stop.") + PermRow("Notifications", "Shown while My Trail is recording") + PermRow("Internet", "Optional ML Kit OCR / scanner model refresh. Documents are not uploaded.") + Spacer(Modifier.height(16.dp)) + + SectionTitle("License") + Text("Apache License 2.0", fontSize = 13.sp, fontWeight = FontWeight.Medium) + Spacer(Modifier.height(4.dp)) + Text("Copyright 2026 Paperstow Contributors.", fontSize = 11.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(4.dp)) + Text( + "Third-party libraries keep their own terms: Apache 2.0 (AndroidX, Compose, Hilt, Room, Zip4j, Gson), Bouncy Castle Licence, and Google ML Kit / Play services terms for on-device OCR and scanning.", + fontSize = 11.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(8.dp)) + OutlinedButton( + onClick = { + ctx.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/sethusrinivasan/document-manager/blob/main/LICENSE"))) + }, + modifier = Modifier.fillMaxWidth() + ) { Text("View License", fontSize = 13.sp) } + Spacer(Modifier.height(8.dp)) + OutlinedButton( + onClick = { + ctx.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/sethusrinivasan/document-manager/blob/main/NOTICE"))) + }, + modifier = Modifier.fillMaxWidth() + ) { Text("Third-party notices", fontSize = 13.sp) } + Spacer(Modifier.height(16.dp)) + + SectionTitle("Software bill of materials") + Text( + "Libraries compiled into this build. Recalculated every time the app is built and stored on this device.", + fontSize = 12.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(8.dp)) + OutlinedButton( + onClick = { showSbom = true }, + modifier = Modifier.fillMaxWidth() + ) { Text("View SBOM", fontSize = 13.sp) } + Spacer(Modifier.height(16.dp)) + + SectionTitle("Contact") + Text("Questions and issues: https://github.com/sethusrinivasan/document-manager/issues", fontSize = 12.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(24.dp)) + } + } +} + +@Composable +private fun SectionTitle(text: String) { + Text(text, fontWeight = FontWeight.Bold, fontSize = 15.sp) + Spacer(Modifier.height(6.dp)) +} + +@Composable +private fun InfoRow(label: String, value: String) { + val colors = MaterialTheme.colorScheme + Card(Modifier.fillMaxWidth().padding(vertical = 2.dp), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Column(Modifier.padding(10.dp)) { + Text(label, fontSize = 12.sp, color = colors.onSurfaceVariant) + Text(value, fontSize = 13.sp, fontWeight = FontWeight.Medium) + } + } +} + +@Composable +private fun PermRow(permission: String, purpose: String) { + val colors = MaterialTheme.colorScheme + Card(Modifier.fillMaxWidth().padding(vertical = 2.dp), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Row(Modifier.padding(10.dp)) { + Text(permission, fontWeight = FontWeight.Medium, fontSize = 12.sp, modifier = Modifier.width(120.dp)) + Text(purpose, fontSize = 12.sp, color = colors.onSurfaceVariant) + } + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/about/SbomScreen.kt b/app/src/main/java/com/app/paperstow/presentation/about/SbomScreen.kt new file mode 100644 index 0000000..a0afca9 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/about/SbomScreen.kt @@ -0,0 +1,218 @@ +package com.app.paperstow.presentation.about + +import android.content.Context +import android.content.Intent +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.text.selection.SelectionContainer +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Share +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import org.json.JSONObject + +data class SbomComponent( + val group: String, + val name: String, + val version: String, + val purl: String +) + +data class SbomDocument( + val specVersion: String, + val timestamp: String, + val appName: String, + val appVersion: String, + val variant: String, + val components: List, + val rawJson: String +) + +fun loadBundledSbom(context: Context): SbomDocument? { + return try { + val json = context.assets.open("sbom.json").bufferedReader().use { it.readText() } + parseSbom(json) + } catch (_: Exception) { + null + } +} + +fun parseSbom(json: String): SbomDocument { + val root = JSONObject(json) + val metadata = root.optJSONObject("metadata") + val component = metadata?.optJSONObject("component") + val list = root.optJSONArray("components") + val components = buildList { + if (list != null) { + for (i in 0 until list.length()) { + val c = list.getJSONObject(i) + add( + SbomComponent( + group = c.optString("group"), + name = c.optString("name"), + version = c.optString("version"), + purl = c.optString("purl") + ) + ) + } + } + } + return SbomDocument( + specVersion = root.optString("specVersion", "1.5"), + timestamp = metadata?.optString("timestamp").orEmpty(), + appName = component?.optString("name").orEmpty(), + appVersion = component?.optString("version").orEmpty(), + variant = metadata?.optJSONObject("properties")?.optString("variant") + ?: metadata?.optJSONArray("properties")?.let { props -> + (0 until props.length()).firstNotNullOfOrNull { i -> + val p = props.getJSONObject(i) + if (p.optString("name") == "build:variant") p.optString("value") else null + } + }.orEmpty(), + components = components, + rawJson = json + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SbomScreen(onBack: () -> Unit) { + val context = LocalContext.current + val colors = MaterialTheme.colorScheme + val sbom = remember { loadBundledSbom(context) } + var query by remember { mutableStateOf("") } + var showRaw by remember { mutableStateOf(false) } + val filtered = remember(sbom, query) { + val q = query.trim().lowercase() + sbom?.components.orEmpty().filter { c -> + q.isEmpty() || + c.name.lowercase().contains(q) || + c.group.lowercase().contains(q) || + c.version.lowercase().contains(q) + } + } + + Scaffold( + topBar = { + TopAppBar( + title = { Text("SBOM") }, + navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }, + actions = { + if (sbom != null) { + IconButton(onClick = { + val send = Intent(Intent.ACTION_SEND).apply { + type = "application/json" + putExtra(Intent.EXTRA_SUBJECT, "Paperstow SBOM ${sbom.appVersion}") + putExtra(Intent.EXTRA_TEXT, sbom.rawJson) + } + context.startActivity(Intent.createChooser(send, "Share SBOM")) + }) { Icon(Icons.Filled.Share, "Share") } + } + } + ) + } + ) { padding -> + if (sbom == null) { + Column(Modifier.fillMaxSize().padding(padding).padding(16.dp)) { + Text( + "No SBOM is bundled in this install. It is generated at compile time and packaged with the app.", + fontSize = 14.sp, + color = colors.onSurfaceVariant + ) + } + return@Scaffold + } + + LazyColumn(Modifier.fillMaxSize().padding(padding).padding(horizontal = 16.dp)) { + item { + Text("CycloneDX ${sbom.specVersion}", fontWeight = FontWeight.Bold, fontSize = 16.sp) + Spacer(Modifier.height(4.dp)) + Text( + "${sbom.appName} ${sbom.appVersion}" + if (sbom.variant.isNotBlank()) " · ${sbom.variant}" else "", + fontSize = 13.sp, + color = colors.onSurfaceVariant + ) + if (sbom.timestamp.isNotBlank()) { + Text("Generated ${sbom.timestamp}", fontSize = 12.sp, color = colors.onSurfaceVariant) + } + Spacer(Modifier.height(4.dp)) + Text( + "${sbom.components.size} libraries in this build. This list is recalculated every compile.", + fontSize = 12.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + OutlinedTextField( + value = query, + onValueChange = { query = it }, + modifier = Modifier.fillMaxWidth(), + singleLine = true, + label = { Text("Filter libraries") } + ) + TextButton(onClick = { showRaw = !showRaw }) { + Text(if (showRaw) "Hide JSON" else "Show JSON") + } + } + if (showRaw) { + item { + Card( + Modifier.fillMaxWidth().padding(bottom = 12.dp), + colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant) + ) { + SelectionContainer { + Text( + sbom.rawJson, + modifier = Modifier.padding(10.dp), + fontSize = 10.sp, + fontFamily = FontFamily.Monospace + ) + } + } + } + } + items(filtered, key = { "${it.group}:${it.name}:${it.version}" }) { c -> + Card( + Modifier.fillMaxWidth().padding(vertical = 3.dp), + colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant) + ) { + Column(Modifier.padding(10.dp)) { + Text(c.name, fontSize = 13.sp, fontWeight = FontWeight.Medium) + Text( + listOf(c.group, c.version).filter { it.isNotBlank() }.joinToString(" · "), + fontSize = 11.sp, + color = colors.onSurfaceVariant + ) + } + } + } + item { Spacer(Modifier.height(24.dp)) } + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/auth/.gitkeep b/app/src/main/java/com/app/paperstow/presentation/auth/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/presentation/auth/.gitkeep rename to app/src/main/java/com/app/paperstow/presentation/auth/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/presentation/auth/BiometricAuthScreen.kt b/app/src/main/java/com/app/paperstow/presentation/auth/BiometricAuthScreen.kt similarity index 94% rename from app/src/main/java/com/app/traveldocs/presentation/auth/BiometricAuthScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/auth/BiometricAuthScreen.kt index 8933ca0..74b2572 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/auth/BiometricAuthScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/auth/BiometricAuthScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.auth +package com.app.paperstow.presentation.auth import android.content.Context import androidx.biometric.BiometricManager @@ -25,7 +25,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentActivity -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.debug.DebugLogger @Composable fun BiometricAuthScreen(activity: FragmentActivity, onAuthenticated: () -> Unit, onSkipped: () -> Unit) { @@ -78,8 +78,8 @@ private fun launchBiometric(activity: FragmentActivity, onSuccess: () -> Unit, o val prompt = BiometricPrompt(activity, executor, callback) val info = BiometricPrompt.PromptInfo.Builder() - .setTitle("Document Manager") - .setSubtitle("Authenticate to access your documents") + .setTitle("Paperstow") + .setSubtitle("Unlock to open the family's travel papers") .setAllowedAuthenticators(BiometricManager.Authenticators.BIOMETRIC_STRONG or BiometricManager.Authenticators.DEVICE_CREDENTIAL) .build() diff --git a/app/src/main/java/com/app/traveldocs/presentation/backup/BackupOnlyScreen.kt b/app/src/main/java/com/app/paperstow/presentation/backup/BackupOnlyScreen.kt similarity index 60% rename from app/src/main/java/com/app/traveldocs/presentation/backup/BackupOnlyScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/backup/BackupOnlyScreen.kt index 1fcc788..470324f 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/backup/BackupOnlyScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/backup/BackupOnlyScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.backup +package com.app.paperstow.presentation.backup import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult @@ -16,9 +16,9 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.documentfile.provider.DocumentFile -import com.app.traveldocs.data.backup.BackupManager -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.debug.UsageTelemetry +import com.app.paperstow.data.backup.BackupManager +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.debug.UsageTelemetry import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -29,32 +29,55 @@ fun BackupOnlyScreen(onBack: () -> Unit) { val context = LocalContext.current val scope = rememberCoroutineScope() val backupManager = remember { BackupManager() } - var state by remember { mutableStateOf("choose") } // choose, pin, running, done + var state by remember { mutableStateOf("choose") } // choose, password, running, done var resultMessage by remember { mutableStateOf("") } var isError by remember { mutableStateOf(false) } var backupPin by remember { mutableStateOf("") } + var includeTrail by remember { mutableStateOf(false) } var pendingUri by remember { mutableStateOf(null) } val folderPicker = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri -> - if (uri != null) { pendingUri = uri; state = "pin" } + if (uri != null) { pendingUri = uri; state = "password" } } - // PIN dialog - if (state == "pin") { + if (state == "password") { var pinInput by remember { mutableStateOf("") } + val pinReady = pinInput.isBlank() || pinInput.length >= 4 + fun startBackup(pin: String) { + backupPin = pin + val trail = includeTrail + state = "running" + scope.launch { doBackup(context, backupManager, pendingUri!!, backupPin, trail) { msg, err -> resultMessage = msg; isError = err; state = "done" } } + } AlertDialog( onDismissRequest = { state = "choose" }, - title = { Text("Set Backup Password") }, + title = { Text("Backup password") }, text = { Column { - Text("Protect your backup with a password (min 4 characters).", fontSize = 13.sp, color = Color.Gray) + Text("A password is optional. If you set one, you will need it to restore. Leave it blank to skip.", fontSize = 13.sp, color = Color.Gray) + Spacer(Modifier.height(12.dp)) + OutlinedTextField( + value = pinInput, + onValueChange = { pinInput = it }, + label = { Text("Password (optional)") }, + supportingText = { + if (pinInput.isNotBlank() && pinInput.length < 4) Text("At least 4 characters if you set one") + }, + isError = pinInput.isNotBlank() && pinInput.length < 4, + singleLine = true, + modifier = Modifier.fillMaxWidth(), + visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation() + ) Spacer(Modifier.height(12.dp)) - OutlinedTextField(value = pinInput, onValueChange = { pinInput = it }, label = { Text("Password") }, singleLine = true, modifier = Modifier.fillMaxWidth(), - visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation()) + Row(verticalAlignment = Alignment.CenterVertically) { + Checkbox(checked = includeTrail, onCheckedChange = { includeTrail = it }) + Text("Also include My Trail as a .gpx file", fontSize = 13.sp) + } } }, - confirmButton = { TextButton(onClick = { - backupPin = pinInput; state = "running" - scope.launch { doBackup(context, backupManager, pendingUri!!, backupPin) { msg, err -> resultMessage = msg; isError = err; state = "done" } } - }, enabled = pinInput.length >= 4) { Text("Create Backup") } }, + confirmButton = { + TextButton(onClick = { startBackup(pinInput.trim()) }, enabled = pinReady) { + Text(if (pinInput.isBlank()) "Create without password" else "Create Backup") + } + }, dismissButton = { TextButton(onClick = { state = "choose" }) { Text("Cancel") } } ) } @@ -66,11 +89,11 @@ fun BackupOnlyScreen(onBack: () -> Unit) { Spacer(Modifier.height(32.dp)) Text("Backup Documents", fontSize = 20.sp, fontWeight = FontWeight.Bold) Spacer(Modifier.height(8.dp)) - Text("Creates an encrypted ZIP file with all your documents and metadata.", fontSize = 14.sp, color = Color.Gray) + Text("Saves a ZIP of your papers to a folder you pick. You can also add My Trail as a .gpx file.", fontSize = 14.sp, color = Color.Gray) Spacer(Modifier.height(24.dp)) Button(onClick = { folderPicker.launch(null) }, modifier = Modifier.fillMaxWidth()) { Text("Choose Backup Location") } Spacer(Modifier.height(12.dp)) - Text("The backup will be password-protected. Keep your password safe — it cannot be recovered.", fontSize = 12.sp, color = Color(0xFFF44336)) + Text("A password is optional. If you set one, keep it safe — it cannot be recovered.", fontSize = 12.sp, color = Color.Gray) } "running" -> { Spacer(Modifier.height(64.dp)) @@ -91,18 +114,20 @@ fun BackupOnlyScreen(onBack: () -> Unit) { } } -private suspend fun doBackup(context: android.content.Context, mgr: BackupManager, uri: Uri, pin: String, done: (String, Boolean) -> Unit) = withContext(Dispatchers.IO) { +private suspend fun doBackup(context: android.content.Context, mgr: BackupManager, uri: Uri, pin: String, includeTrail: Boolean, done: (String, Boolean) -> Unit) = withContext(Dispatchers.IO) { try { DebugLogger.i("Backup", "=== BACKUP STARTED ===") UsageTelemetry.funnelStart("backup_local") - val r = mgr.createBackupZip(context, pin) + val password = pin.trim().ifEmpty { null } + val r = mgr.createBackupZip(context, password, includeTrailGpx = includeTrail) val folder = DocumentFile.fromTreeUri(context, uri) val out = folder?.createFile("application/zip", mgr.suggestedFileName()) if (out != null) { context.contentResolver.openOutputStream(out.uri)?.use { os -> r.zipFile.inputStream().use { it.copyTo(os) } } r.zipFile.delete() UsageTelemetry.funnelComplete("backup_local") - val report = "Backed up ${r.fileCount} documents (${r.totalBytes / 1024}KB)\nSaved to: ${folder.name}/" + val protection = if (password == null) "No password" else "Password-protected" + val report = "Backed up ${r.fileCount} documents (${r.totalBytes / 1024}KB)\n$protection\nSaved to: ${folder.name}/" DebugLogger.i("Backup", report) done(report, false) } else { done("Failed to create file in folder", true) } diff --git a/app/src/main/java/com/app/traveldocs/presentation/backup/RestoreOnlyScreen.kt b/app/src/main/java/com/app/paperstow/presentation/backup/RestoreOnlyScreen.kt similarity index 52% rename from app/src/main/java/com/app/traveldocs/presentation/backup/RestoreOnlyScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/backup/RestoreOnlyScreen.kt index db75b40..32991c8 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/backup/RestoreOnlyScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/backup/RestoreOnlyScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.backup +package com.app.paperstow.presentation.backup import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult @@ -18,8 +18,8 @@ import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.app.traveldocs.data.backup.BackupRestore -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.data.backup.BackupRestore +import com.app.paperstow.debug.DebugLogger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -43,23 +43,30 @@ fun RestoreOnlyScreen(onBack: () -> Unit) { if (showPinDialog) { AlertDialog( onDismissRequest = { showPinDialog = false }, - title = { Text("Backup Password") }, + title = { Text("Backup password") }, text = { Column { - Text("Enter the password used when creating this backup.", fontSize = 13.sp, color = Color.Gray) + Text("Only needed if this backup was created with a password. Leave it blank to skip.", fontSize = 13.sp, color = Color.Gray) Spacer(Modifier.height(12.dp)) - OutlinedTextField(value = restorePin, onValueChange = { restorePin = it }, label = { Text("Password (required)") }, singleLine = true, modifier = Modifier.fillMaxWidth(), - visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation()) + OutlinedTextField( + value = restorePin, + onValueChange = { restorePin = it }, + label = { Text("Password (optional)") }, + singleLine = true, + modifier = Modifier.fillMaxWidth(), + visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation() + ) } }, confirmButton = { TextButton(onClick = { showPinDialog = false; state = "running"; logLines = listOf("Starting restore...") - val pin = restorePin; restorePin = "" + val pin = restorePin.trim().ifEmpty { null }; restorePin = "" scope.launch { - doRestoreVerbose(context, pendingUri!!, pin) { line -> + val ok = doRestoreVerbose(context, pendingUri!!, pin) { line -> logLines = logLines + line } + isError = !ok state = "done" } - }, enabled = restorePin.isNotBlank()) { Text("Restore") } }, + }) { Text(if (restorePin.isBlank()) "Restore without password" else "Restore") } }, dismissButton = { TextButton(onClick = { showPinDialog = false }) { Text("Cancel") } } ) } @@ -75,12 +82,20 @@ fun RestoreOnlyScreen(onBack: () -> Unit) { Spacer(Modifier.height(24.dp)) Button(onClick = { filePicker.launch("application/zip") }, modifier = Modifier.fillMaxWidth()) { Text("Choose Backup File") } Spacer(Modifier.height(12.dp)) - Text("You will need the password that was set during backup.", fontSize = 12.sp, color = Color.Gray) + Text("A password is only needed if one was set when the backup was created.", fontSize = 12.sp, color = Color.Gray) } "running", "done" -> { // Verbose log output - Text(if (state == "running") "Restoring..." else "Restore Complete", fontSize = 18.sp, fontWeight = FontWeight.Bold, - color = if (state == "done" && logLines.any { it.startsWith("ERROR") }) Color(0xFFF44336) else if (state == "done") Color(0xFF4CAF50) else Color.Unspecified) + Text( + if (state == "running") "Restoring..." + else if (isError || logLines.any { it.startsWith("ERROR") || it.contains("STATUS: FAILED") }) "Restore Failed" + else "Restore Complete", + fontSize = 18.sp, + fontWeight = FontWeight.Bold, + color = if (state == "done" && (isError || logLines.any { it.startsWith("ERROR") || it.contains("STATUS: FAILED") })) Color(0xFFF44336) + else if (state == "done") Color(0xFF4CAF50) + else Color.Unspecified + ) Spacer(Modifier.height(8.dp)) if (state == "running") { LinearProgressIndicator(modifier = Modifier.fillMaxWidth()); Spacer(Modifier.height(8.dp)) } @@ -101,12 +116,18 @@ fun RestoreOnlyScreen(onBack: () -> Unit) { if (state == "done") { Spacer(Modifier.height(12.dp)) - Text("Restart required: The app must restart to load restored documents. This is a technical requirement — the database connection must be re-established.", fontSize = 12.sp, color = Color(0xFFF44336), fontWeight = FontWeight.SemiBold) - Spacer(Modifier.height(8.dp)) - Button(onClick = { android.os.Process.killProcess(android.os.Process.myPid()) }, modifier = Modifier.fillMaxWidth(), - colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF4CAF50))) { Text("Restart App Now") } - Spacer(Modifier.height(8.dp)) - OutlinedButton(onClick = onBack, modifier = Modifier.fillMaxWidth()) { Text("Go Back (documents won't show until restart)") } + if (isError) { + Text("Nothing was marked complete. If the backup itself is empty or corrupt, this phone’s current papers were left as they were.", fontSize = 13.sp, color = Color(0xFFF44336)) + Spacer(Modifier.height(8.dp)) + OutlinedButton(onClick = onBack, modifier = Modifier.fillMaxWidth()) { Text("Go Back") } + } else { + Text("Restart the app so it can open the restored papers.", fontSize = 12.sp, color = Color(0xFFF44336), fontWeight = FontWeight.SemiBold) + Spacer(Modifier.height(8.dp)) + Button(onClick = { android.os.Process.killProcess(android.os.Process.myPid()) }, modifier = Modifier.fillMaxWidth(), + colors = ButtonDefaults.buttonColors(containerColor = Color(0xFF4CAF50))) { Text("Restart App Now") } + Spacer(Modifier.height(8.dp)) + OutlinedButton(onClick = onBack, modifier = Modifier.fillMaxWidth()) { Text("Go Back (papers won’t show until restart)") } + } } } } @@ -114,11 +135,11 @@ fun RestoreOnlyScreen(onBack: () -> Unit) { } } -private suspend fun doRestoreVerbose(context: android.content.Context, uri: Uri, password: String, log: (String) -> Unit) = withContext(Dispatchers.IO) { +private suspend fun doRestoreVerbose(context: android.content.Context, uri: Uri, password: String?, log: (String) -> Unit): Boolean = withContext(Dispatchers.IO) { try { log("Reading backup file...") val bytes = context.contentResolver.openInputStream(uri)?.use { it.readBytes() } - if (bytes == null) { log("ERROR: Cannot read backup file"); return@withContext } + if (bytes == null) { log("ERROR: Cannot read backup file"); return@withContext false } log("OK: Read ${bytes.size / 1024}KB from source") val tempZip = java.io.File(context.cacheDir, "restore_temp.zip") @@ -132,16 +153,15 @@ private suspend fun doRestoreVerbose(context: android.content.Context, uri: Uri, if (!inspection.valid) { log("ERROR: ${inspection.errorMessage}") tempZip.delete() - return@withContext + return@withContext false } log("OK: Schema version ${inspection.schemaVersion}") log("OK: Backup timestamp: ${inspection.timestamp}") log("OK: Expected files: ${inspection.fileCount}") log("OK: Total size: ${inspection.totalSizeBytes / 1024}KB") - log("OK: PIN-protected docs: ${inspection.pinProtectedCount}") if (inspection.files.isNotEmpty()) { log("Files in backup:") - inspection.files.take(20).forEach { f -> log(" ${f.path} (${f.size/1024}KB)${if (f.hasPinProtection) " [PIN]" else ""}") } + inspection.files.take(20).forEach { f -> log(" ${f.path} (${f.size/1024}KB)") } if (inspection.files.size > 20) log(" ... and ${inspection.files.size - 20} more") } @@ -163,76 +183,28 @@ private suspend fun doRestoreVerbose(context: android.content.Context, uri: Uri, log("WARN: ${result.filesProcessed - result.filesRestored} files not restored") } - // Step 4: Metadata consistency check log("") - log("--- STEP 4: Metadata Consistency ---") - try { - val dbFile = context.getDatabasePath("traveldocs.db") - if (dbFile.exists()) { - val db = android.database.sqlite.SQLiteDatabase.openDatabase(dbFile.path, null, android.database.sqlite.SQLiteDatabase.OPEN_READONLY) - - // Check tables exist before querying - val tableCheck = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='documents'", null) - if (tableCheck.count == 0) { tableCheck.close(); db.close(); log("ERROR: documents table not found in restored DB — backup DB may be empty/corrupted"); log("Solution: Restart the app (Room will initialize tables from the restored file)") } else { tableCheck.close() - // Count documents table - val docCursor = db.rawQuery("SELECT COUNT(*) FROM documents", null) - val docCount = if (docCursor.moveToFirst()) docCursor.getInt(0) else -1 - docCursor.close() - log("documents table: $docCount entries") - - // Count metadata entries - val metaCursor = db.rawQuery("SELECT COUNT(*) FROM document_metadata", null) - val metaCount = if (metaCursor.moveToFirst()) metaCursor.getInt(0) else -1 - metaCursor.close() - log("document_metadata table: $metaCount entries") - - // Count tags - val tagCursor = db.rawQuery("SELECT COUNT(*) FROM document_tags", null) - val tagCount = if (tagCursor.moveToFirst()) tagCursor.getInt(0) else -1 - tagCursor.close() - log("document_tags table: $tagCount entries") - - // Check docs with no metadata (potential issue) - val orphanCursor = db.rawQuery("SELECT COUNT(*) FROM documents d WHERE NOT EXISTS (SELECT 1 FROM document_metadata m WHERE m.documentId = d.id)", null) - val orphanCount = if (orphanCursor.moveToFirst()) orphanCursor.getInt(0) else 0 - orphanCursor.close() - if (orphanCount > 0) log("WARN: $orphanCount documents have no metadata entries") - else log("OK: All documents have metadata") - - // Check that encrypted files on disk match DB entries - val docsDir = java.io.File(context.filesDir, "docs") - val diskFileCount = if (docsDir.exists()) docsDir.walkTopDown().filter { it.isFile }.count() else 0 - log("Encrypted files on disk: $diskFileCount") - if (diskFileCount == docCount) { - log("OK: File count matches DB entries") - } else if (diskFileCount > docCount) { - log("WARN: ${diskFileCount - docCount} orphan files on disk (no DB entry)") - } else { - log("WARN: ${docCount - diskFileCount} DB entries missing files on disk") - } - - // DB version - val vCursor = db.rawQuery("PRAGMA user_version", null) - val ver = if (vCursor.moveToFirst()) vCursor.getInt(0) else 0 - vCursor.close() - log("DB version: $ver (app expects: 2)") - if (ver != 2) log("WARN: Version mismatch may trigger schema migration on next Room access") - - db.close() - } // end table exists check - } else { - log("ERROR: Database file not found after restore") - } - } catch (e: Exception) { - log("ERROR: Metadata check failed — ${e.message}") + log("--- STEP 4: Database check ---") + val dbCheck = com.app.paperstow.data.backup.RoomDbFiles.inspect( + com.app.paperstow.data.backup.RoomDbFiles.liveFile(context) + ) + if (!dbCheck.hasDocumentsTable) { + log("ERROR: documents table not found — ${dbCheck.error ?: dbCheck.tables}") + log("STATUS: FAILED — backup database is empty or corrupt") + DebugLogger.e("Restore", "Post-restore DB missing documents table") + return@withContext false } + log("OK: documents table present (${dbCheck.documentCount} rows, v${dbCheck.userVersion})") + log("Tables: ${dbCheck.tables.joinToString()}") + val ok = result.success log("") - log(if (result.success) "STATUS: COMPLETE" else "STATUS: FAILED — ${result.message}") - - DebugLogger.i("Restore", "Verbose restore complete: ${result.filesRestored}/${result.filesProcessed}") + log(if (ok) "STATUS: COMPLETE" else "STATUS: FAILED — ${result.message}") + DebugLogger.i("Restore", "Verbose restore finished ok=$ok ${result.filesRestored}/${result.filesProcessed}") + return@withContext ok } catch (e: Exception) { log("ERROR: ${e.message}") DebugLogger.e("Restore", "Verbose restore failed", e) + return@withContext false } } diff --git a/app/src/main/java/com/app/traveldocs/presentation/common/CountryCodePicker.kt b/app/src/main/java/com/app/paperstow/presentation/common/CountryCodePicker.kt similarity index 98% rename from app/src/main/java/com/app/traveldocs/presentation/common/CountryCodePicker.kt rename to app/src/main/java/com/app/paperstow/presentation/common/CountryCodePicker.kt index b9531b8..b964064 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/common/CountryCodePicker.kt +++ b/app/src/main/java/com/app/paperstow/presentation/common/CountryCodePicker.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.common +package com.app.paperstow.presentation.common import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Row diff --git a/app/src/main/java/com/app/paperstow/presentation/demo/DemoDataViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/demo/DemoDataViewModel.kt new file mode 100644 index 0000000..d5bb10a --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/demo/DemoDataViewModel.kt @@ -0,0 +1,70 @@ +package com.app.paperstow.presentation.demo + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.app.paperstow.data.demo.DemoDataRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +data class DemoUiState( + val busy: Boolean = false, + val loaded: Boolean = false, + val message: String? = null +) + +@HiltViewModel +class DemoDataViewModel @Inject constructor( + private val repository: DemoDataRepository +) : ViewModel() { + + private val _state = MutableStateFlow(DemoUiState()) + val state: StateFlow = _state.asStateFlow() + + init { + refresh() + } + + fun refresh() { + viewModelScope.launch { + _state.value = _state.value.copy(loaded = repository.isLoaded()) + } + } + + fun importSampleTrip() { + viewModelScope.launch { + _state.value = _state.value.copy(busy = true, message = null) + val result = repository.importSampleTrip() + _state.value = result.fold( + onSuccess = { count -> + DemoUiState(busy = false, loaded = true, message = "Loaded $count sample papers. Open a folder to preview, search, or share. Remove the sample trip from the menu when you are done.") + }, + onFailure = { e -> + _state.value.copy(busy = false, message = e.message ?: "Could not load sample trip") + } + ) + } + } + + fun removeSampleTrip() { + viewModelScope.launch { + _state.value = _state.value.copy(busy = true, message = null) + val result = repository.removeSampleTrip() + _state.value = result.fold( + onSuccess = { count -> + DemoUiState(busy = false, loaded = false, message = "Removed $count sample papers. Your own documents were not touched.") + }, + onFailure = { e -> + _state.value.copy(busy = false, loaded = _state.value.loaded, message = e.message ?: "Could not remove sample trip") + } + ) + } + } + + fun dismissMessage() { + _state.value = _state.value.copy(message = null) + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/diagnostics/DiagnosticsScreen.kt b/app/src/main/java/com/app/paperstow/presentation/diagnostics/DiagnosticsScreen.kt similarity index 84% rename from app/src/main/java/com/app/traveldocs/presentation/diagnostics/DiagnosticsScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/diagnostics/DiagnosticsScreen.kt index 6c464d5..80f52c6 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/diagnostics/DiagnosticsScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/diagnostics/DiagnosticsScreen.kt @@ -1,9 +1,6 @@ -package com.app.traveldocs.presentation.diagnostics +package com.app.paperstow.presentation.diagnostics -import android.Manifest import android.content.Context -import android.content.pm.PackageManager -import android.location.LocationManager import android.net.ConnectivityManager import android.net.NetworkCapabilities import android.os.BatteryManager @@ -23,7 +20,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Battery4Bar import androidx.compose.material.icons.filled.BatteryChargingFull -import androidx.compose.material.icons.filled.LocationOn import androidx.compose.material.icons.filled.SignalWifi4Bar import androidx.compose.material.icons.filled.SignalWifiOff import androidx.compose.material3.Button @@ -52,8 +48,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.core.content.ContextCompat -import com.app.traveldocs.debug.TrackingSettingsPanel import kotlinx.coroutines.delay @OptIn(ExperimentalMaterial3Api::class) @@ -62,9 +56,6 @@ fun DiagnosticsScreen(onBack: () -> Unit, onViewLogs: () -> Unit) { val context = LocalContext.current var batteryLevel by remember { mutableIntStateOf(-1) } var isCharging by remember { mutableStateOf(false) } - var latitude by remember { mutableStateOf("--") } - var longitude by remember { mutableStateOf("--") } - var accuracy by remember { mutableStateOf("--") } var isOnline by remember { mutableStateOf(false) } var networkType by remember { mutableStateOf("--") } @@ -78,13 +69,6 @@ fun DiagnosticsScreen(onBack: () -> Unit, onViewLogs: () -> Unit) { val caps = cm?.activeNetwork?.let { cm.getNetworkCapabilities(it) } isOnline = caps?.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) ?: false networkType = when { caps == null -> "Offline"; caps.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> "WiFi"; caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> "Cellular"; else -> "Other" } - try { - if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { - val lm = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager - val loc = lm.getLastKnownLocation(LocationManager.FUSED_PROVIDER) ?: lm.getLastKnownLocation(LocationManager.GPS_PROVIDER) - if (loc != null) { latitude = "%.6f".format(loc.latitude); longitude = "%.6f".format(loc.longitude); accuracy = "%.0fm".format(loc.accuracy) } - } - } catch (_: Exception) {} delay(5000) } } @@ -95,14 +79,8 @@ fun DiagnosticsScreen(onBack: () -> Unit, onViewLogs: () -> Unit) { Spacer(Modifier.height(12.dp)) StatusRow(if (isCharging) Icons.Filled.BatteryChargingFull else Icons.Filled.Battery4Bar, when { batteryLevel > 50 -> Color(0xFF4CAF50); batteryLevel > 20 -> Color(0xFFFFC107); else -> Color(0xFFF44336) }, "Battery", "${batteryLevel}%", if (isCharging) "Charging" else "Discharging") Spacer(Modifier.height(8.dp)) - StatusRow(Icons.Filled.LocationOn, Color(0xFF2196F3), "GPS", "$latitude, $longitude", "Accuracy: $accuracy") - Spacer(Modifier.height(8.dp)) StatusRow(if (isOnline) Icons.Filled.SignalWifi4Bar else Icons.Filled.SignalWifiOff, if (isOnline) Color(0xFF4CAF50) else Color(0xFFF44336), "Network", networkType, if (isOnline) "Connected" else "Offline") Spacer(Modifier.height(20.dp)) - Text("GPS Tracking", fontWeight = FontWeight.Bold, fontSize = 16.sp) - Spacer(Modifier.height(8.dp)) - TrackingSettingsPanel() - Spacer(Modifier.height(20.dp)) Text("Debug Logs", fontWeight = FontWeight.Bold, fontSize = 16.sp) Spacer(Modifier.height(8.dp)) Button(onClick = onViewLogs, modifier = Modifier.fillMaxWidth()) { Text("View Debug Logs") } @@ -176,7 +154,7 @@ private fun shareLogsAsZip(context: android.content.Context) { try { val logDir = java.io.File(context.filesDir, "debug_logs") val logFile = java.io.File(logDir, "traveldocs_debug.log") - if (!logFile.exists()) { com.app.traveldocs.debug.DebugLogger.w("Diagnostics", "No log file to share"); return } + if (!logFile.exists()) { com.app.paperstow.debug.DebugLogger.w("Diagnostics", "No log file to share"); return } // Create ZIP in cache val cacheDir = java.io.File(context.cacheDir, "shared_docs") @@ -187,7 +165,7 @@ private fun shareLogsAsZip(context: android.content.Context) { logFile.inputStream().use { it.copyTo(zip) } zip.closeEntry() // Also include telemetry summary if available - val telemetry = com.app.traveldocs.debug.UsageTelemetry.getLocalSummary() + val telemetry = com.app.paperstow.debug.UsageTelemetry.getLocalSummary() zip.putNextEntry(java.util.zip.ZipEntry("telemetry_summary.txt")) zip.write(telemetry.toByteArray()) zip.closeEntry() @@ -203,9 +181,9 @@ private fun shareLogsAsZip(context: android.content.Context) { val resInfoList = context.packageManager.queryIntentActivities(intent, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY) for (ri in resInfoList) { context.grantUriPermission(ri.activityInfo.packageName, uri, android.content.Intent.FLAG_GRANT_READ_URI_PERMISSION) } context.startActivity(android.content.Intent.createChooser(intent, "Share logs via").addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK)) - com.app.traveldocs.debug.DebugLogger.i("Diagnostics", "Logs ZIP shared (${zipFile.length() / 1024}KB)") + com.app.paperstow.debug.DebugLogger.i("Diagnostics", "Logs ZIP shared (${zipFile.length() / 1024}KB)") } catch (e: Exception) { - com.app.traveldocs.debug.DebugLogger.e("Diagnostics", "Failed to share logs ZIP", e) + com.app.paperstow.debug.DebugLogger.e("Diagnostics", "Failed to share logs ZIP", e) } } @@ -279,21 +257,21 @@ private fun runDiagnostics(context: android.content.Context): Pair) { - DebugLogger.i("BatchImport", "Drive folder: ${files.size} files to import") - startBatchImport(files) - } - fun cancel() { importJob?.cancel() _state.value = _state.value.copy(isRunning = false, isCancelled = true) @@ -154,7 +150,7 @@ class BatchImportViewModel @Inject constructor( try { val bytes = context.contentResolver.openInputStream(file.uri)?.use { it.readBytes() } if (bytes == null || bytes.isEmpty()) { skipped++; failedList.add("${file.name} (empty/unreadable)"); continue } - val format = mimeToFormat(file.mimeType) + val format = formatValidator.detect(bytes, file.mimeType, file.name) val doc = ImportedDocument(rawBytes = bytes, format = format, originalFileName = file.name) val result = importUseCase.importAndProcess(doc, "default-member") if (result.isSuccess && file.folderTags.isNotEmpty()) { @@ -179,7 +175,7 @@ class BatchImportViewModel @Inject constructor( } } _state.value = _state.value.copy(isRunning = false, isComplete = true, processedCount = files.size, importedCount = imported, skippedCount = skipped, failedFiles = failedList) - com.app.traveldocs.debug.UsageTelemetry.funnelComplete("batch_import") + com.app.paperstow.debug.UsageTelemetry.funnelComplete("batch_import") DebugLogger.i("BatchImport", "Complete: $imported imported, $skipped skipped") } } @@ -203,19 +199,13 @@ class BatchImportViewModel @Inject constructor( collectFilesRecursive(child, files, pathTags) } } else { - val mime = child.type ?: "" - if (isSupportedMime(mime)) { - files.add(FileToImport(child.uri, child.name ?: "file", mime)) + if (formatValidator.isSupportedForImport(child.type, child.name)) { + files.add(FileToImport(child.uri, child.name ?: "file", child.type)) } } } return files } - - /** - * Recursively collect files, accumulating each folder level as a tag. - * pathTags represents the subfolder names from root to current directory. - */ private fun collectFilesRecursive(dir: DocumentFile, out: MutableList, pathTags: List) { for (child in dir.listFiles()) { if (child.isDirectory) { @@ -223,29 +213,14 @@ class BatchImportViewModel @Inject constructor( val deeperTags = if (folderName != null) pathTags + folderName else pathTags collectFilesRecursive(child, out, deeperTags) } else { - val mime = child.type ?: "" - if (isSupportedMime(mime)) { - out.add(FileToImport(child.uri, child.name ?: "file", mime, folderTags = pathTags)) + if (formatValidator.isSupportedForImport(child.type, child.name)) { + out.add(FileToImport(child.uri, child.name ?: "file", child.type, folderTags = pathTags)) } } } } - private fun isSupportedMime(mime: String): Boolean { - return mime.contains("pdf") || mime.contains("jpeg") || mime.contains("jpg") || mime.contains("png") || mime.contains("video") || mime.contains("webp") || mime.contains("heic") || mime.contains("heif") || mime.contains("bmp") || mime.contains("gif") || mime.contains("dicom") || mime.contains(".dcm") - } - - private fun mimeToFormat(mime: String?): DocumentFormat = when { - mime?.contains("pdf") == true -> DocumentFormat.PDF - mime?.contains("png") == true -> DocumentFormat.PNG - mime?.contains("jpeg") == true || mime?.contains("jpg") == true -> DocumentFormat.JPG - mime?.contains("video") == true -> DocumentFormat.VIDEO - mime?.contains("webp") == true -> DocumentFormat.WEBP - mime?.contains("heic") == true || mime?.contains("heif") == true -> DocumentFormat.HEIC - mime?.contains("bmp") == true -> DocumentFormat.BMP - mime?.contains("gif") == true -> DocumentFormat.GIF - mime?.contains("dicom") == true -> DocumentFormat.DICOM - mime?.contains("audio") == true || mime?.contains("mp3") == true -> DocumentFormat.AUDIO - else -> DocumentFormat.UNKNOWN + companion object { + const val MAX_FOLDER_FILES = 500 } } diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/CameraImportViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/documents/CameraImportViewModel.kt similarity index 91% rename from app/src/main/java/com/app/traveldocs/presentation/documents/CameraImportViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/CameraImportViewModel.kt index 41d892d..d19e5f3 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/CameraImportViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/CameraImportViewModel.kt @@ -1,15 +1,15 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.content.Context import android.graphics.BitmapFactory import android.net.Uri import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.data.scanner.SmartFileNamer -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.ImportedDocument -import com.app.traveldocs.domain.usecase.DocumentImportUseCase +import com.app.paperstow.data.scanner.SmartFileNamer +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.ImportedDocument +import com.app.paperstow.domain.usecase.DocumentImportUseCase import com.google.mlkit.vision.common.InputImage import com.google.mlkit.vision.text.TextRecognition import com.google.mlkit.vision.text.latin.TextRecognizerOptions diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/CameraPreviewScreen.kt b/app/src/main/java/com/app/paperstow/presentation/documents/CameraPreviewScreen.kt similarity index 98% rename from app/src/main/java/com/app/traveldocs/presentation/documents/CameraPreviewScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/CameraPreviewScreen.kt index 6553874..da4e6be 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/CameraPreviewScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/CameraPreviewScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.graphics.BitmapFactory import androidx.compose.foundation.Image diff --git a/app/src/main/java/com/app/paperstow/presentation/documents/ChecklistEditorScreen.kt b/app/src/main/java/com/app/paperstow/presentation/documents/ChecklistEditorScreen.kt new file mode 100644 index 0000000..7890f2b --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/documents/ChecklistEditorScreen.kt @@ -0,0 +1,160 @@ +package com.app.paperstow.presentation.documents + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.Checkbox +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.app.paperstow.domain.model.ChecklistItem +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.MarkdownChecklist + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ChecklistEditorScreen( + existing: Document? = null, + initialBody: String = "", + extraTags: List = emptyList(), + onBack: () -> Unit, + onSaved: (Document) -> Unit, + viewModel: TextNoteViewModel = hiltViewModel() +) { + val saving by viewModel.saving.collectAsState() + val error by viewModel.error.collectAsState() + val catalog by viewModel.catalog.collectAsState() + val parsed = remember(existing?.id, initialBody) { + if (existing == null && initialBody.isBlank()) MarkdownChecklist.starter() + else MarkdownChecklist.parse(initialBody) + } + var title by remember { + mutableStateOf( + existing?.originalFileName + ?.removeSuffix(".md")?.removeSuffix(".MD") + ?.ifBlank { parsed.title } + ?: parsed.title.ifBlank { "Trip plans" } + ) + } + var notes by remember { mutableStateOf(parsed.notes) } + var tags by remember { mutableStateOf(seedEditorTags(existing, extraTags, "Plans")) } + val items = remember { + mutableStateListOf().also { list -> + list.addAll(parsed.items.ifEmpty { listOf(ChecklistItem("")) }) + } + } + val colors = MaterialTheme.colorScheme + + fun persist() { + val doc = MarkdownChecklist(title = title, notes = notes, items = items.toList()) + val body = doc.toMarkdown() + if (existing == null) viewModel.createChecklist(title, body, tags, onSaved) + else viewModel.updateDocument(existing, title, body, tags, onSaved) + } + + Scaffold( + topBar = { + TopAppBar( + title = { Text(if (existing == null) "New checklist" else "Edit checklist") }, + navigationIcon = { + IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } + }, + actions = { + if (saving) { + CircularProgressIndicator(Modifier.size(22.dp).padding(end = 4.dp), strokeWidth = 2.dp) + } else { + IconButton(onClick = { persist() }) { Icon(Icons.Filled.Check, "Save") } + } + } + ) + } + ) { padding -> + Column( + Modifier + .fillMaxSize() + .padding(padding) + .padding(16.dp) + .verticalScroll(rememberScrollState()) + ) { + OutlinedTextField( + value = title, + onValueChange = { title = it }, + label = { Text("Title") }, + singleLine = true, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(12.dp)) + NoteTagPicker(selected = tags, catalog = catalog, onChange = { tags = it }) + Spacer(Modifier.height(12.dp)) + OutlinedTextField( + value = notes, + onValueChange = { notes = it }, + label = { Text("Notes (optional)") }, + modifier = Modifier.fillMaxWidth(), + minLines = 2 + ) + Spacer(Modifier.height(16.dp)) + Text("Items", fontSize = 13.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(8.dp)) + items.forEachIndexed { index, item -> + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()) { + Checkbox( + checked = item.done, + onCheckedChange = { checked -> items[index] = item.copy(done = checked) } + ) + OutlinedTextField( + value = item.text, + onValueChange = { items[index] = item.copy(text = it) }, + modifier = Modifier.weight(1f), + singleLine = true, + placeholder = { Text("Action item") } + ) + IconButton(onClick = { if (items.size > 1) items.removeAt(index) }) { + Icon(Icons.Filled.Close, "Remove") + } + } + Spacer(Modifier.height(8.dp)) + } + OutlinedButton(onClick = { items += ChecklistItem("") }, modifier = Modifier.fillMaxWidth()) { + Icon(Icons.Filled.Add, null, Modifier.size(18.dp)) + Spacer(Modifier.size(8.dp)) + Text("Add item") + } + if (error != null) { + Spacer(Modifier.height(12.dp)) + Text(error!!, color = colors.error, fontSize = 13.sp) + } + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentListScreen.kt b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentListScreen.kt similarity index 88% rename from app/src/main/java/com/app/traveldocs/presentation/documents/DocumentListScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/DocumentListScreen.kt index 16170e6..3fceda3 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentListScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentListScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background @@ -33,6 +33,7 @@ import androidx.compose.material.icons.filled.QuestionMark import androidx.compose.material.icons.filled.RadioButtonUnchecked import androidx.compose.material.icons.filled.RestoreFromTrash import androidx.compose.material.icons.filled.SelectAll +import androidx.compose.material.icons.filled.Share import androidx.compose.material3.AlertDialog import androidx.compose.material3.Badge import androidx.compose.material3.BadgedBox @@ -56,16 +57,24 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentType +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentType @OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) @Composable -fun DocumentListScreen(onBack: () -> Unit, onDocumentClick: (Document) -> Unit, onSetDocList: (List) -> Unit = {}, viewModel: DocumentListViewModel = hiltViewModel()) { +fun DocumentListScreen( + onBack: () -> Unit, + onDocumentClick: (Document) -> Unit, + onSetDocList: (List) -> Unit = {}, + filterTag: String? = null, + viewModel: DocumentListViewModel = hiltViewModel() +) { + val context = LocalContext.current val documents by viewModel.documents.collectAsState() val recycleBin by viewModel.recycleBin.collectAsState() val showingTrash by viewModel.showingTrash.collectAsState() @@ -73,6 +82,9 @@ fun DocumentListScreen(onBack: () -> Unit, onDocumentClick: (Document) -> Unit, val selectionMode by viewModel.selectionMode.collectAsState() val bulkState by viewModel.bulkDeleteState.collectAsState() var showBulkConfirm by remember { mutableStateOf(false) } + val visibleDocs = if (filterTag.isNullOrBlank()) documents + else documents.filter { doc -> doc.tags.any { it.name == filterTag } } + val filtered = !filterTag.isNullOrBlank() // Bulk delete confirmation if (showBulkConfirm) { @@ -104,7 +116,7 @@ fun DocumentListScreen(onBack: () -> Unit, onDocumentClick: (Document) -> Unit, Scaffold(topBar = { TopAppBar( - title = { Text(if (selectionMode) "${selectedIds.size} selected" else if (showingTrash) "Recycle Bin" else "My Documents") }, + title = { Text(if (selectionMode) "${selectedIds.size} selected" else if (showingTrash) "Recycle Bin" else filterTag ?: "My Documents") }, navigationIcon = { IconButton(onClick = { if (selectionMode) viewModel.clearSelection() else if (showingTrash) viewModel.toggleTrashView() else onBack() }) { Icon(if (selectionMode) Icons.Filled.Close else Icons.Filled.ArrowBack, "Back") @@ -113,8 +125,9 @@ fun DocumentListScreen(onBack: () -> Unit, onDocumentClick: (Document) -> Unit, actions = { if (selectionMode) { IconButton(onClick = { viewModel.selectAll() }) { Icon(Icons.Filled.SelectAll, "Select all") } + IconButton(onClick = { viewModel.shareSelected(context) }) { Icon(Icons.Filled.Share, "Share selected") } IconButton(onClick = { showBulkConfirm = true }) { Icon(Icons.Filled.Delete, "Delete selected", tint = Color(0xFFF44336)) } - } else { + } else if (!filtered) { if (showingTrash && recycleBin.isNotEmpty()) IconButton(onClick = { viewModel.emptyTrash() }) { Icon(Icons.Filled.DeleteForever, "Empty", tint = Color(0xFFF44336)) } BadgedBox(badge = { if (recycleBin.isNotEmpty()) Badge { Text("${recycleBin.size}") } }) { IconButton(onClick = { viewModel.toggleTrashView() }) { Icon(if (showingTrash) Icons.Filled.Description else Icons.Filled.DeleteSweep, "Trash") } @@ -145,20 +158,21 @@ fun DocumentListScreen(onBack: () -> Unit, onDocumentClick: (Document) -> Unit, } } } else { - if (documents.isEmpty()) { + if (visibleDocs.isEmpty()) { Column(Modifier.fillMaxSize().padding(padding), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { Icon(Icons.Filled.Description, null, Modifier.size(64.dp), tint = Color.LightGray) - Spacer(Modifier.height(16.dp)); Text("No documents yet", fontSize = 18.sp, color = Color.Gray) - Text("Import a document to get started", fontSize = 13.sp, color = Color.LightGray) + Spacer(Modifier.height(16.dp)) + Text(if (filtered) "No papers with this tag" else "Nothing stowed yet", fontSize = 18.sp, color = Color.Gray) + Text(if (filtered) "Tag a document with “$filterTag” to see it here" else "Import a passport, visa, or ticket to get started", fontSize = 13.sp, color = Color.LightGray) } } else { LazyColumn(Modifier.fillMaxSize().padding(padding).padding(horizontal = 16.dp)) { item { Text("Long-press to select multiple", fontSize = 11.sp, color = Color.LightGray, modifier = Modifier.padding(vertical = 4.dp)) } - items(documents) { doc -> + items(visibleDocs, key = { it.id }) { doc -> val isSelected = doc.id in selectedIds Card( modifier = Modifier.fillMaxWidth().padding(vertical = 4.dp) - .combinedClickable(onClick = { if (selectionMode) viewModel.toggleSelection(doc.id) else { onSetDocList(documents); onDocumentClick(doc) } }, onLongClick = { viewModel.toggleSelection(doc.id) }), + .combinedClickable(onClick = { if (selectionMode) viewModel.toggleSelection(doc.id) else { onSetDocList(visibleDocs); onDocumentClick(doc) } }, onLongClick = { viewModel.toggleSelection(doc.id) }), shape = RoundedCornerShape(10.dp), colors = CardDefaults.cardColors(containerColor = if (isSelected) Color(0xFFE3F2FD) else Color.White), elevation = CardDefaults.cardElevation(1.dp) diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentListViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentListViewModel.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/presentation/documents/DocumentListViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/DocumentListViewModel.kt index 984ef58..75ad25d 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentListViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentListViewModel.kt @@ -1,12 +1,13 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.data.local.TravelDocsDatabase -import com.app.traveldocs.domain.repository.DocumentRepository +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.data.local.TravelDocsDatabase +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.Job @@ -27,6 +28,7 @@ data class BulkDeleteState( @HiltViewModel class DocumentListViewModel @Inject constructor( private val documentRepository: DocumentRepository, + private val fileStorage: DocumentFileStorage, private val database: TravelDocsDatabase, @ApplicationContext private val context: Context ) : ViewModel() { @@ -64,7 +66,7 @@ class DocumentListViewModel @Inject constructor( _documents.value = docs.sortedByDescending { it.createdAt } } } catch (e: Exception) { - com.app.traveldocs.debug.DebugLogger.e("DocList", "Database query failed (may need app restart after failed restore)", e) + com.app.paperstow.debug.DebugLogger.e("DocList", "Database query failed (may need app restart after failed restore)", e) _documents.value = emptyList() } } @@ -75,7 +77,7 @@ class DocumentListViewModel @Inject constructor( * Use after restore or any operation that replaces the database file. */ fun forceRefresh() { - com.app.traveldocs.debug.DebugLogger.i("DocList", "Force refresh triggered — invalidating Room cache") + com.app.paperstow.debug.DebugLogger.i("DocList", "Force refresh triggered — invalidating Room cache") // Invalidate all tables so Room re-reads from disk database.invalidationTracker.refreshVersionsAsync() startCollecting() @@ -152,10 +154,14 @@ class DocumentListViewModel @Inject constructor( fun toggleTrashView() { _showingTrash.value = !_showingTrash.value } fun shareSelected(context: Context) { - val docs = _documents.value.filter { it.id in _selectedIds.value } + share(context, _documents.value.filter { it.id in _selectedIds.value }) + } + + fun share(context: Context, docs: List) { if (docs.isEmpty()) return viewModelScope.launch { - ShareHelper.shareDocuments(context, docs, documentRepository as com.app.traveldocs.domain.repository.DocumentFileStorage) + ShareHelper.shareDocuments(context, docs, fileStorage) clearSelection() } - }} + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentViewerScreen.kt b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentViewerScreen.kt similarity index 57% rename from app/src/main/java/com/app/traveldocs/presentation/documents/DocumentViewerScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/DocumentViewerScreen.kt index 3793cb3..a25f842 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentViewerScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentViewerScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.content.Context import android.content.Intent @@ -32,21 +32,19 @@ import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.ExpandLess import androidx.compose.material.icons.filled.ExpandMore -import androidx.compose.material.icons.filled.Lock import androidx.compose.material.icons.filled.OpenInNew -import androidx.compose.material.icons.filled.PictureAsPdf import androidx.compose.material.icons.filled.Share import androidx.compose.material3.AlertDialog import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults +import androidx.compose.material3.Checkbox import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.InputChip -import androidx.compose.material3.InputChipDefaults import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold @@ -76,16 +74,18 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.FileProvider import androidx.hilt.navigation.compose.hiltViewModel -import com.app.traveldocs.data.local.SecureDocumentManager -import com.app.traveldocs.data.local.TagColorStore -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentFormat +import com.app.paperstow.data.local.TagColorStore +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.MarkdownChecklist +import com.app.paperstow.domain.safety.GpxTrail +import com.app.paperstow.domain.safety.UniqueLocations import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.withContext import java.io.File -import java.util.concurrent.Executors +import java.text.DateFormat +import java.util.Date @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -94,6 +94,7 @@ fun DocumentViewerScreen( onBack: () -> Unit, onPrev: (() -> Unit)? = null, onNext: (() -> Unit)? = null, + onEditNote: ((String) -> Unit)? = null, viewModel: DocumentViewerViewModel = hiltViewModel() ) { val fileBytes by viewModel.fileBytes.collectAsState() @@ -106,17 +107,11 @@ fun DocumentViewerScreen( var showAddTagDialog by remember { mutableStateOf(false) } var docName by remember { mutableStateOf(document.originalFileName ?: "Document") } var detailsExpanded by remember { mutableStateOf(false) } - val secureDocMgr = remember { SecureDocumentManager(context) } - var hasPin by remember { mutableStateOf(secureDocMgr.hasPinSet(document.id)) } - var showSetPinDialog by remember { mutableStateOf(false) } - var showRemovePinDialog by remember { mutableStateOf(false) } - var pinUnlocked by remember { mutableStateOf(!secureDocMgr.hasPinSet(document.id)) } - var showPinUnlockDialog by remember { mutableStateOf(false) } var boundaryMsg by remember { mutableStateOf(null) } // Auto-dismiss boundary message LaunchedEffect(boundaryMsg) { if (boundaryMsg != null) { kotlinx.coroutines.delay(1500); boundaryMsg = null } } - LaunchedEffect(document.id) { if (pinUnlocked) viewModel.loadFile(document.id) } + LaunchedEffect(document.id, document.updatedAt) { viewModel.loadFile(document.id) } // Dialogs if (showRenameDialog) { @@ -130,40 +125,22 @@ fun DocumentViewerScreen( var tagInput by remember { mutableStateOf("") } AlertDialog(onDismissRequest = { showAddTagDialog = false }, title = { Text("Add Tag") }, text = { OutlinedTextField(value = tagInput, onValueChange = { tagInput = it }, label = { Text("Tag name") }, singleLine = true, modifier = Modifier.fillMaxWidth()) }, - confirmButton = { TextButton(onClick = { viewModel.addTag(com.app.traveldocs.data.local.InputSanitizer.sanitizeTag(tagInput)); showAddTagDialog = false }) { Text("Add") } }, + confirmButton = { TextButton(onClick = { viewModel.addTag(com.app.paperstow.data.local.InputSanitizer.sanitizeTag(tagInput)); showAddTagDialog = false }) { Text("Add") } }, dismissButton = { TextButton(onClick = { showAddTagDialog = false }) { Text("Cancel") } }) } - if (showPinUnlockDialog) { - var pin by remember { mutableStateOf("") } - var pinError by remember { mutableStateOf(null) } - AlertDialog(onDismissRequest = { showPinUnlockDialog = false }, title = { Text("Enter PIN") }, - text = { Column { Text("This document is PIN-protected.", fontSize = 13.sp); Spacer(Modifier.height(12.dp)) - OutlinedTextField(value = pin, onValueChange = { pin = it; pinError = null }, label = { Text("PIN") }, singleLine = true, modifier = Modifier.fillMaxWidth(), visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation()) - if (pinError != null) { Spacer(Modifier.height(4.dp)); Text(pinError!!, color = Color(0xFFF44336), fontSize = 12.sp) } } }, - confirmButton = { TextButton(onClick = { if (secureDocMgr.verifyPin(document.id, pin) != null) { pinUnlocked = true; showPinUnlockDialog = false; viewModel.loadFile(document.id) } else pinError = "Incorrect PIN" }) { Text("Unlock") } }, - dismissButton = { TextButton(onClick = { showPinUnlockDialog = false; onBack() }) { Text("Cancel") } }) - } - if (showSetPinDialog) { - var pin by remember { mutableStateOf("") }; var confirmPin by remember { mutableStateOf("") }; var pinError by remember { mutableStateOf(null) } - AlertDialog(onDismissRequest = { showSetPinDialog = false }, title = { Text("Lock with PIN") }, - text = { Column { Text("PIN cannot be recovered if forgotten.", fontSize = 12.sp, color = Color(0xFFF44336)); Spacer(Modifier.height(12.dp)) - OutlinedTextField(value = pin, onValueChange = { pin = it; pinError = null }, label = { Text("PIN (4+)") }, singleLine = true, modifier = Modifier.fillMaxWidth(), visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation()); Spacer(Modifier.height(8.dp)) - OutlinedTextField(value = confirmPin, onValueChange = { confirmPin = it; pinError = null }, label = { Text("Confirm") }, singleLine = true, modifier = Modifier.fillMaxWidth(), visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation()) - if (pinError != null) { Spacer(Modifier.height(4.dp)); Text(pinError!!, color = Color(0xFFF44336), fontSize = 12.sp) } } }, - confirmButton = { TextButton(onClick = { when { pin.length < 4 -> pinError = "Min 4 characters"; pin != confirmPin -> pinError = "PINs don't match"; else -> { secureDocMgr.setPin(document.id, pin); viewModel.addTag(SecureDocumentManager.SECURE_TAG); hasPin = true; showSetPinDialog = false } } }) { Text("Lock") } }, - dismissButton = { TextButton(onClick = { showSetPinDialog = false }) { Text("Cancel") } }) - } - if (showRemovePinDialog) { - var pin by remember { mutableStateOf("") }; var pinError by remember { mutableStateOf(null) } - AlertDialog(onDismissRequest = { showRemovePinDialog = false }, title = { Text("Remove PIN") }, - text = { Column { OutlinedTextField(value = pin, onValueChange = { pin = it; pinError = null }, label = { Text("Current PIN") }, singleLine = true, modifier = Modifier.fillMaxWidth(), visualTransformation = androidx.compose.ui.text.input.PasswordVisualTransformation()) - if (pinError != null) { Spacer(Modifier.height(4.dp)); Text(pinError!!, color = Color(0xFFF44336), fontSize = 12.sp) } } }, - confirmButton = { TextButton(onClick = { if (secureDocMgr.verifyPin(document.id, pin) != null) { secureDocMgr.removePin(document.id); viewModel.removeTag(SecureDocumentManager.SECURE_TAG); hasPin = false; showRemovePinDialog = false } else pinError = "Incorrect PIN" }) { Text("Remove") } }, - dismissButton = { TextButton(onClick = { showRemovePinDialog = false }) { Text("Cancel") } }) - } Scaffold(topBar = { TopAppBar(title = { Text(docName, maxLines = 1) }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }, - actions = { if (fileBytes != null && !loading && pinUnlocked) { IconButton(onClick = { shareDocument(context, fileBytes!!, docName, document.format) }) { Icon(Icons.Filled.Share, "Share") } }; IconButton(onClick = { showRenameDialog = true }) { Icon(Icons.Filled.Edit, "Rename") } }) } + actions = { + if (document.format in listOf(DocumentFormat.TEXT, DocumentFormat.MARKDOWN) && fileBytes != null && onEditNote != null) { + IconButton(onClick = { + val text = try { String(fileBytes!!, Charsets.UTF_8) } catch (_: Exception) { "" } + onEditNote(text) + }) { Icon(Icons.Filled.Edit, "Edit note") } + } else { + IconButton(onClick = { showRenameDialog = true }) { Icon(Icons.Filled.Edit, "Rename") } + } + if (fileBytes != null && !loading) { IconButton(onClick = { shareDocument(context, fileBytes!!, docName, document.format) }) { Icon(Icons.Filled.Share, "Share") } } + }) } ) { padding -> Column(modifier = Modifier.fillMaxSize().padding(padding)) { Box(modifier = Modifier.fillMaxWidth().weight(1f).background(Color.White) @@ -181,7 +158,6 @@ fun DocumentViewerScreen( } }, contentAlignment = Alignment.Center) { when { - !pinUnlocked -> { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(Icons.Filled.Lock, null, tint = Color(0xFFE65100), modifier = Modifier.size(64.dp)); Spacer(Modifier.height(12.dp)); Text("PIN Protected", fontSize = 18.sp, fontWeight = FontWeight.Bold); Spacer(Modifier.height(8.dp)); Text("Enter PIN to view", fontSize = 13.sp, color = Color.Gray); Spacer(Modifier.height(16.dp)); Button(onClick = { showPinUnlockDialog = true }) { Text("Unlock") } } } loading -> { Column(horizontalAlignment = Alignment.CenterHorizontally) { CircularProgressIndicator(modifier = Modifier.size(48.dp)); Spacer(Modifier.height(12.dp)); Text("Loading...", fontSize = 13.sp, color = Color.Gray) } } fileBytes != null && document.format in listOf(DocumentFormat.JPG, DocumentFormat.PNG, DocumentFormat.WEBP, DocumentFormat.HEIC, DocumentFormat.BMP, DocumentFormat.GIF) -> { val bitmapState = produceState(null, fileBytes) { value = withContext(Dispatchers.Default) { try { val b = fileBytes!!; val o = BitmapFactory.Options().apply { inJustDecodeBounds = true }; BitmapFactory.decodeByteArray(b, 0, b.size, o); val s = if (maxOf(o.outWidth, o.outHeight) > 4096) { var x = 1; while (maxOf(o.outWidth, o.outHeight) / x > 4096) x *= 2; x } else 1; BitmapFactory.decodeByteArray(b, 0, b.size, BitmapFactory.Options().apply { inSampleSize = s }) } catch (e: Exception) { null } } } @@ -191,32 +167,85 @@ fun DocumentViewerScreen( } else { CircularProgressIndicator(Modifier.size(36.dp)) } } fileBytes != null && document.format == DocumentFormat.PDF -> { - val pdfInfoState = produceState?>(null, fileBytes) { value = withContext(Dispatchers.IO) { - try { - val f = File.createTempFile("p", ".pdf", context.cacheDir); f.writeBytes(fileBytes!!); val fd = android.os.ParcelFileDescriptor.open(f, android.os.ParcelFileDescriptor.MODE_READ_ONLY); Triple(f, fd, android.graphics.pdf.PdfRenderer(fd)) - } catch (e: Exception) { - DebugLogger.e("PDF", "PDFRenderer creation failed: ${e.message}", e); null - } - } } - val pdfInfo = pdfInfoState.value - if (pdfInfo != null) { val (pdfFile, fd, renderer) = pdfInfo; val pageCount = renderer.pageCount; val pdfDispatcher = remember { Executors.newSingleThreadExecutor().asCoroutineDispatcher() }; var pdfScale by remember { mutableFloatStateOf(1f) }; var ox by remember { mutableFloatStateOf(0f) }; var oy by remember { mutableFloatStateOf(0f) } - Box(Modifier.fillMaxSize().pointerInput(Unit) { detectTransformGestures { _, pan, zoom, _ -> pdfScale = (pdfScale * zoom).coerceIn(1f, 5f); if (pdfScale > 1f) { ox += pan.x; oy += pan.y } else { ox = 0f; oy = 0f } } }) { - LazyColumn(Modifier.fillMaxSize().background(Color.White).graphicsLayer(scaleX = pdfScale, scaleY = pdfScale, translationX = ox, translationY = oy)) { - items(pageCount) { idx -> - val bmpState = produceState(null, idx) { - value = withContext(pdfDispatcher) { - try { - val page = renderer.openPage(idx); val bmp = Bitmap.createBitmap(page.width * 2, page.height * 2, Bitmap.Config.ARGB_8888); bmp.eraseColor(android.graphics.Color.WHITE); page.render(bmp, null, null, android.graphics.pdf.PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY); page.close(); bmp - } catch (e: Exception) { - DebugLogger.e("PDF", "Page render failed: idx=$idx, err=${e.message}", e); null - } - } + PdfPreview(fileBytes!!, Modifier.fillMaxSize()) + } + fileBytes != null && document.format == DocumentFormat.MARKDOWN -> { + val text = remember(fileBytes) { + try { String(fileBytes!!, Charsets.UTF_8) } catch (_: Exception) { "" } + } + val list = remember(text) { MarkdownChecklist.parse(text) } + LazyColumn(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.surface).padding(16.dp)) { + if (list.title.isNotBlank()) { + item { Text(list.title, fontWeight = FontWeight.SemiBold, fontSize = 18.sp); Spacer(Modifier.height(8.dp)) } + } + if (list.notes.isNotBlank()) { + item { Text(list.notes, fontSize = 14.sp, color = MaterialTheme.colorScheme.onSurfaceVariant); Spacer(Modifier.height(12.dp)) } + } + items(list.items.size) { idx -> + val item = list.items[idx] + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp)) { + Checkbox( + checked = item.done, + onCheckedChange = { checked -> + val updated = list.items.toMutableList() + updated[idx] = item.copy(done = checked) + viewModel.replaceBytes(list.copy(items = updated).toMarkdown().toByteArray(Charsets.UTF_8)) } - val bmp = bmpState.value; if (bmp != null) { Image(bitmap = bmp.asImageBitmap(), contentDescription = "Page ${idx+1}", modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp), contentScale = ContentScale.FillWidth) } else { Box(Modifier.fillMaxWidth().height(300.dp).background(Color(0xFFF5F5F5)), contentAlignment = Alignment.Center) { Column { CircularProgressIndicator(Modifier.size(24.dp)); Text("Page ${idx+1} loading", fontSize = 11.sp, color = Color.Gray) } } } - } + ) + Text(item.text, fontSize = 16.sp) } } - } else { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(Icons.Filled.PictureAsPdf, null, tint = Color(0xFFF44336), modifier = Modifier.size(64.dp)); Spacer(Modifier.height(8.dp)); Text("PDF preview failed", fontSize = 13.sp, color = Color.Gray); Text("File may be corrupted or not a valid PDF", fontSize = 11.sp, color = Color(0xFF9E9E9E)) } } + if (list.items.isEmpty()) { + item { Text(text.ifBlank { "Empty checklist" }, fontFamily = FontFamily.SansSerif, fontSize = 14.sp) } + } + } + } + fileBytes != null && document.format == DocumentFormat.GPX -> { + val places = remember(fileBytes) { + try { GpxTrail.parse(String(fileBytes!!, Charsets.UTF_8)) } catch (_: Exception) { emptyList() } + } + if (places.isEmpty()) { + Text("No trail points in this GPX file", color = Color.Gray, fontSize = 14.sp) + } else { + LazyColumn(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.surface).padding(16.dp)) { + item { + Text("Trail · ${places.size} places", fontWeight = FontWeight.SemiBold, fontSize = 16.sp) + Spacer(Modifier.height(8.dp)) + } + items(places.size) { idx -> + val place = places[idx] + val time = if (place.timestamp > 0) { + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(Date(place.timestamp)) + } else "Time unknown" + Card(Modifier.fillMaxWidth().padding(bottom = 8.dp)) { + Column(Modifier.padding(12.dp).clickable { + val geo = android.net.Uri.parse("geo:${place.latitude},${place.longitude}?q=${place.latitude},${place.longitude}") + try { + context.startActivity(android.content.Intent(android.content.Intent.ACTION_VIEW, geo)) + } catch (_: Exception) { + context.startActivity(android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse(UniqueLocations.mapsUrl(place.latitude, place.longitude)))) + } + }) { + Text(time, fontWeight = FontWeight.Medium, fontSize = 14.sp) + Text("%.5f, %.5f".format(place.latitude, place.longitude), fontSize = 12.sp, color = Color.Gray) + UniqueLocations.batteryLabel(place.batteryPercent)?.let { Text(it, fontSize = 12.sp, color = Color.Gray) } + } + } + } + } + } + } + fileBytes != null && document.format == DocumentFormat.TEXT -> { + val text = remember(fileBytes) { + try { String(fileBytes!!, Charsets.UTF_8) } catch (_: Exception) { null } + } + if (text != null) { + LazyColumn(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.surface).padding(16.dp)) { + item { Text(text, fontFamily = FontFamily.Monospace, fontSize = 13.sp, color = MaterialTheme.colorScheme.onSurface) } + } + } else { + Text("Could not read as text", color = Color.Gray, fontSize = 14.sp) + } } fileBytes != null && (document.format == DocumentFormat.VIDEO || document.format == DocumentFormat.AUDIO) -> { Column(horizontalAlignment = Alignment.CenterHorizontally) { Icon(Icons.Filled.OpenInNew, null, tint = Color(0xFF2196F3), modifier = Modifier.size(64.dp)); Spacer(Modifier.height(12.dp)); Text(if (document.format == DocumentFormat.AUDIO) "Audio" else "Video", fontSize = 16.sp); Text("${fileBytes!!.size / 1024} KB", color = Color.Gray, fontSize = 13.sp); Spacer(Modifier.height(16.dp)); Button(onClick = { val mime = if (document.format == DocumentFormat.AUDIO) "audio/mpeg" else "video/mp4" @@ -235,19 +264,26 @@ fun DocumentViewerScreen( textAlign = androidx.compose.ui.text.style.TextAlign.Center) } // Bottom bar - if (fileBytes != null && !loading && pinUnlocked) { Row(Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 4.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)) { Button(onClick = { val mime = when (document.format) { DocumentFormat.PDF -> "application/pdf"; DocumentFormat.JPG -> "image/jpeg"; DocumentFormat.PNG -> "image/png"; DocumentFormat.AUDIO -> "audio/*"; else -> "application/octet-stream" }; openExternally(context, fileBytes!!, docName, mime) }, modifier = Modifier.weight(1f)) { Icon(Icons.Filled.OpenInNew, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Open External", fontSize = 12.sp) } } } + if (fileBytes != null && !loading) { Row(Modifier.fillMaxWidth().padding(horizontal = 16.dp, vertical = 4.dp), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + if (document.format in listOf(DocumentFormat.TEXT, DocumentFormat.MARKDOWN) && onEditNote != null) { + Button(onClick = { + val text = try { String(fileBytes!!, Charsets.UTF_8) } catch (_: Exception) { "" } + onEditNote(text) + }, modifier = Modifier.weight(1f)) { + Icon(Icons.Filled.Edit, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Edit", fontSize = 12.sp) + } + } + Button(onClick = { openExternally(context, fileBytes!!, docName, mimeFor(document.format)) }, modifier = Modifier.weight(1f)) { Icon(Icons.Filled.OpenInNew, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text("Open External", fontSize = 12.sp) } + } } // Properties toggle TextButton(onClick = { detailsExpanded = !detailsExpanded }, modifier = Modifier.fillMaxWidth().padding(horizontal = 16.dp)) { Icon(if (detailsExpanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore, null, Modifier.size(18.dp)); Spacer(Modifier.width(4.dp)); Text(if (detailsExpanded) "Hide Properties" else "Show Properties", fontSize = 13.sp) } if (detailsExpanded) { Column(Modifier.fillMaxWidth().verticalScroll(rememberScrollState()).padding(horizontal = 16.dp, vertical = 8.dp)) { // Tags Card(Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface)) { Column(Modifier.padding(12.dp)) { Row(verticalAlignment = Alignment.CenterVertically) { Text("Tags", fontWeight = FontWeight.SemiBold, fontSize = 14.sp, modifier = Modifier.weight(1f)); IconButton(onClick = { showAddTagDialog = true }, modifier = Modifier.size(32.dp)) { Icon(Icons.Filled.Add, "Add", tint = Color(0xFF1565C0)) } } - if (tags.isEmpty()) { Text("No tags", fontSize = 12.sp, color = Color.Gray) } else { FlowRow(horizontalArrangement = Arrangement.spacedBy(6.dp)) { tags.filter { !it.name.startsWith("__") }.forEach { tag -> InputChip(selected = false, onClick = {}, label = { Text(tag.name, fontSize = 12.sp) }, trailingIcon = { Icon(Icons.Filled.Close, "Remove", modifier = Modifier.size(16.dp).clickable { viewModel.removeTag(tag.name) }) }, colors = InputChipDefaults.inputChipColors(containerColor = Color(TagColorStore(context).getColor(tag.name)))) } } } } } - Spacer(Modifier.height(8.dp)) - // PIN - Card(Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = if (hasPin) Color(0xFFFFF3E0) else Color.White)) { Row(Modifier.fillMaxWidth().padding(12.dp), verticalAlignment = Alignment.CenterVertically) { Text(if (hasPin) "PIN-locked" else "No PIN", modifier = Modifier.weight(1f), fontSize = 13.sp); if (hasPin) { TextButton(onClick = { showRemovePinDialog = true }) { Text("Remove", fontSize = 12.sp) } } else { TextButton(onClick = { showSetPinDialog = true }) { Text("Set PIN", fontSize = 12.sp, color = Color(0xFF1565C0)) } } } } + if (tags.isEmpty()) { Text("No tags", fontSize = 12.sp, color = Color.Gray) } else { FlowRow(horizontalArrangement = Arrangement.spacedBy(6.dp)) { tags.filter { !it.name.startsWith("__") }.forEach { tag -> val store = TagColorStore(context); InputChip(selected = false, onClick = {}, label = { Text(tag.name, fontSize = 12.sp) }, leadingIcon = { com.app.paperstow.presentation.tags.TagMark(tag.name, store, size = 18.dp) }, trailingIcon = { Icon(Icons.Filled.Close, "Remove", modifier = Modifier.size(16.dp).clickable { viewModel.removeTag(tag.name) }) }) } } } } } Spacer(Modifier.height(8.dp)) // Properties - Card(Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant)) { Column(Modifier.padding(12.dp)) { Text("Properties", fontWeight = FontWeight.Bold, fontSize = 14.sp); Spacer(Modifier.height(6.dp)); MetaRow("Type", document.type.name); MetaRow("Format", document.format.name); MetaRow("Confidence", "${((document.extractionConfidence ?: 0f) * 100).toInt()}%"); MetaRow("Doc ID", document.id.take(8) + "..."); Text(filePath.ifEmpty { "" }, fontSize = 10.sp, fontFamily = FontFamily.Monospace, color = Color(0xFF616161)) + Card(Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surfaceVariant)) { Column(Modifier.padding(12.dp)) { Text("Properties", fontWeight = FontWeight.Bold, fontSize = 14.sp); Spacer(Modifier.height(6.dp)); MetaRow("Type", document.type.name); MetaRow("Format", document.format.name); MetaRow("Confidence", "${((document.extractionConfidence ?: 0f) * 100).toInt()}%"); Text(filePath.ifEmpty { "" }, fontSize = 10.sp, fontFamily = FontFamily.Monospace, color = Color(0xFF616161)) if (document.metadata.isNotEmpty()) { Spacer(Modifier.height(8.dp)); Text("Extracted", fontWeight = FontWeight.SemiBold, fontSize = 13.sp); document.metadata.forEach { (f, v) -> MetaRow(f.name.replace("_", " "), v) } } } } } } } @@ -257,13 +293,13 @@ fun DocumentViewerScreen( private fun shareDocument(context: Context, bytes: ByteArray, fileName: String, format: DocumentFormat) { try { val cacheDir = File(context.cacheDir, "shared_docs"); cacheDir.mkdirs() - val ext = when (format) { DocumentFormat.PDF -> ".pdf"; DocumentFormat.JPG -> ".jpg"; DocumentFormat.PNG -> ".png"; DocumentFormat.VIDEO -> ".mp4"; DocumentFormat.AUDIO -> ".mp3"; else -> "" } + val ext = extensionFor(format) val baseName = if (fileName.contains('.')) fileName.substringBeforeLast('.') else fileName val safeName = baseName + ext val file = File(cacheDir, safeName); file.writeBytes(bytes) DebugLogger.i("Viewer", "Share file written: ${file.absolutePath} (${file.length()} bytes)") val uri = FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", file) - val mime = when (format) { DocumentFormat.PDF -> "application/pdf"; DocumentFormat.JPG -> "image/jpeg"; DocumentFormat.PNG -> "image/png"; DocumentFormat.VIDEO -> "video/mp4"; DocumentFormat.AUDIO -> "audio/mpeg"; else -> "application/octet-stream" } + val mime = mimeFor(format) val intent = Intent(Intent.ACTION_SEND).apply { type = mime; putExtra(Intent.EXTRA_STREAM, uri); addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } val resInfoList = context.packageManager.queryIntentActivities(intent, android.content.pm.PackageManager.MATCH_DEFAULT_ONLY) for (ri in resInfoList) { context.grantUriPermission(ri.activityInfo.packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION) } @@ -299,6 +335,39 @@ private fun openExternally(context: Context, bytes: ByteArray, fileName: String, } catch (e: Exception) { DebugLogger.e("Viewer", "Open failed", e) } } +private fun extensionFor(format: DocumentFormat): String = when (format) { + DocumentFormat.PDF -> ".pdf" + DocumentFormat.JPG -> ".jpg" + DocumentFormat.PNG -> ".png" + DocumentFormat.TEXT -> ".txt" + DocumentFormat.MARKDOWN -> ".md" + DocumentFormat.GPX -> ".gpx" + DocumentFormat.WEBP -> ".webp" + DocumentFormat.HEIC -> ".heic" + DocumentFormat.BMP -> ".bmp" + DocumentFormat.GIF -> ".gif" + DocumentFormat.VIDEO -> ".mp4" + DocumentFormat.AUDIO -> ".mp3" + else -> "" +} + +private fun mimeFor(format: DocumentFormat): String = when (format) { + DocumentFormat.PDF -> "application/pdf" + DocumentFormat.JPG -> "image/jpeg" + DocumentFormat.PNG -> "image/png" + DocumentFormat.TEXT -> "text/plain" + DocumentFormat.MARKDOWN -> "text/markdown" + DocumentFormat.GPX -> "application/gpx+xml" + DocumentFormat.WEBP -> "image/webp" + DocumentFormat.HEIC -> "image/heic" + DocumentFormat.BMP -> "image/bmp" + DocumentFormat.GIF -> "image/gif" + DocumentFormat.VIDEO -> "video/mp4" + DocumentFormat.AUDIO -> "audio/mpeg" + DocumentFormat.DICOM -> "application/dicom" + DocumentFormat.UNKNOWN -> "application/octet-stream" +} + @Composable private fun MetaRow(label: String, value: String) { Row(Modifier.fillMaxWidth().padding(vertical = 2.dp), horizontalArrangement = Arrangement.SpaceBetween) { Text(label, fontSize = 11.sp, color = Color.Gray); Text(value, fontSize = 11.sp, fontWeight = FontWeight.Medium) } diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentViewerViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentViewerViewModel.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/presentation/documents/DocumentViewerViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/DocumentViewerViewModel.kt index 0c9b45b..682c165 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/DocumentViewerViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/DocumentViewerViewModel.kt @@ -1,14 +1,14 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.Tag -import com.app.traveldocs.domain.repository.DocumentFileStorage -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.TagRepository +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.TagRepository import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.isActive @@ -123,9 +123,20 @@ class DocumentViewerViewModel @Inject constructor( } } + fun replaceBytes(bytes: ByteArray) { + if (currentDocId.isEmpty()) return + viewModelScope.launch { + fileStorage.replace(currentDocId, bytes).onSuccess { + _fileBytes.value = bytes + }.onFailure { e -> + DebugLogger.e("ViewerVM", "Replace failed", e) + } + } + } + fun renameDocument(document: Document, newName: String) { if (newName.isBlank()) return - val sanitizedName = com.app.traveldocs.data.local.InputSanitizer.sanitizeFilename(newName) + val sanitizedName = com.app.paperstow.data.local.InputSanitizer.sanitizeFilename(newName) viewModelScope.launch { DebugLogger.i("ViewerVM", "Renaming doc ${document.id} to '$newName'") val updated = document.copy(originalFileName = sanitizedName, updatedAt = java.time.Instant.now()) diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/ImportScreen.kt b/app/src/main/java/com/app/paperstow/presentation/documents/ImportScreen.kt similarity index 74% rename from app/src/main/java/com/app/traveldocs/presentation/documents/ImportScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/ImportScreen.kt index 6b82953..f6ea1f1 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/ImportScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/ImportScreen.kt @@ -1,9 +1,11 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents +import android.app.Activity +import android.content.Intent import android.net.Uri import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.IntentSenderRequest import androidx.activity.result.contract.ActivityResultContracts -import android.content.Context import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -19,11 +21,15 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.CheckCircle -import androidx.compose.material.icons.filled.Cloud import androidx.compose.material.icons.filled.ContentCopy import androidx.compose.material.icons.filled.Error import androidx.compose.material.icons.filled.Folder +import androidx.compose.material.icons.filled.PhotoCamera import androidx.compose.material.icons.filled.UploadFile +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.runtime.LaunchedEffect import androidx.compose.material3.AlertDialog import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Button @@ -70,17 +76,11 @@ fun ImportScreen(onDone: () -> Unit, importViewModel: ImportViewModel = hiltView val folderPickerLauncher = rememberLauncherForActivityResult(ActivityResultContracts.OpenDocumentTree()) { uri: Uri? -> if (uri != null) { pendingFolderUri = uri; showSubfolderDialog = true } } - val drivePickerLauncher = rememberLauncherForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris: List -> - if (uris.isNotEmpty()) { - val files = uris.map { uri -> FileToImport(uri, uri.lastPathSegment ?: "file", context.contentResolver.getType(uri)) } - batchViewModel.importFromDriveFiles(files) - mode = "batch_progress" - } - } - var capturedBytes by remember { mutableStateOf(null) } var showTagDialog by remember { mutableStateOf(false) } var cameraTags by remember { mutableStateOf("") } + var cameraHelp by remember { mutableStateOf(null) } + val snackbarHostState = remember { SnackbarHostState() } val cameraLauncher = rememberLauncherForActivityResult(ActivityResultContracts.TakePicturePreview()) { bitmap -> if (bitmap != null) { val baos = java.io.ByteArrayOutputStream() @@ -89,8 +89,48 @@ fun ImportScreen(onDone: () -> Unit, importViewModel: ImportViewModel = hiltView showTagDialog = true } } + val scannerLauncher = rememberLauncherForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + importViewModel.importScanResult(result.data) + mode = "single" + } + } val cameraPermission = rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted -> - if (granted) { try { cameraLauncher.launch(null) } catch (e: Exception) { com.app.traveldocs.debug.DebugLogger.e("Import", "Camera launch failed", e) } } + if (granted) { + try { cameraLauncher.launch(null) } catch (e: Exception) { + com.app.paperstow.debug.DebugLogger.e("Import", "Camera launch failed", e) + cameraHelp = "Camera is not available. You can re-enable it in system settings." + } + } else { + cameraHelp = "Camera permission is required for the fallback camera. Open settings to grant it, or try Scan document again." + } + } + fun startScan() { + val activity = context as? Activity + if (activity == null) { + cameraPermission.launch(android.Manifest.permission.CAMERA) + return + } + importViewModel.startDocumentScan( + activity = activity, + onReady = { sender -> + scannerLauncher.launch(IntentSenderRequest.Builder(sender).build()) + }, + onUnavailable = { + cameraHelp = "On-device scanner is downloading or unavailable. Using the system camera instead." + cameraPermission.launch(android.Manifest.permission.CAMERA) + } + ) + } + LaunchedEffect(cameraHelp) { + val msg = cameraHelp ?: return@LaunchedEffect + val result = snackbarHostState.showSnackbar(message = msg, actionLabel = "Settings") + if (result == SnackbarResult.ActionPerformed) { + val intent = android.content.Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS) + intent.data = android.net.Uri.parse("package:${context.packageName}") + context.startActivity(intent) + } + cameraHelp = null } // Duplicate dialog if (singleState.duplicateFound != null) { @@ -102,11 +142,11 @@ fun ImportScreen(onDone: () -> Unit, importViewModel: ImportViewModel = hiltView } // Tag dialog after camera capture if (showTagDialog && capturedBytes != null) { - AlertDialog(onDismissRequest = { showTagDialog = false; val fn = "camera_" + System.currentTimeMillis() + ".jpg"; importViewModel.importFromBytes(capturedBytes!!, com.app.traveldocs.domain.model.DocumentFormat.JPG, fn); mode = "single" }, + AlertDialog(onDismissRequest = { showTagDialog = false; val fn = "camera_" + System.currentTimeMillis() + ".jpg"; importViewModel.importFromBytes(capturedBytes!!, com.app.paperstow.domain.model.DocumentFormat.JPG, fn); mode = "single" }, title = { Text("Add Tags") }, text = { Column { Text("Add comma-separated tags:", fontSize = 13.sp, color = Color.Gray); Spacer(Modifier.height(8.dp)); OutlinedTextField(value = cameraTags, onValueChange = { cameraTags = it }, label = { Text("Tags") }, singleLine = true, modifier = Modifier.fillMaxWidth()) } }, - confirmButton = { TextButton(onClick = { showTagDialog = false; val fn = "camera_" + System.currentTimeMillis() + ".jpg"; importViewModel.importFromBytes(capturedBytes!!, com.app.traveldocs.domain.model.DocumentFormat.JPG, fn); mode = "single" }) { Text("Import") } }, - dismissButton = { TextButton(onClick = { showTagDialog = false; val fn = "camera_" + System.currentTimeMillis() + ".jpg"; importViewModel.importFromBytes(capturedBytes!!, com.app.traveldocs.domain.model.DocumentFormat.JPG, fn); mode = "single" }) { Text("Skip") } } + confirmButton = { TextButton(onClick = { showTagDialog = false; val fn = "camera_" + System.currentTimeMillis() + ".jpg"; importViewModel.importFromBytes(capturedBytes!!, com.app.paperstow.domain.model.DocumentFormat.JPG, fn); mode = "single" }) { Text("Import") } }, + dismissButton = { TextButton(onClick = { showTagDialog = false; val fn = "camera_" + System.currentTimeMillis() + ".jpg"; importViewModel.importFromBytes(capturedBytes!!, com.app.paperstow.domain.model.DocumentFormat.JPG, fn); mode = "single" }) { Text("Skip") } } ) } // Subfolder scan dialog @@ -124,31 +164,30 @@ fun ImportScreen(onDone: () -> Unit, importViewModel: ImportViewModel = hiltView ) } - Scaffold(topBar = { TopAppBar(title = { Text("Import") }, navigationIcon = { IconButton(onClick = { importViewModel.clearState(); batchViewModel.reset(); onDone() }) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> Column(modifier = Modifier.fillMaxSize().padding(padding).padding(16.dp)) { + Scaffold( + topBar = { TopAppBar(title = { Text("Import") }, navigationIcon = { IconButton(onClick = { importViewModel.clearState(); batchViewModel.reset(); onDone() }) { Icon(Icons.Filled.ArrowBack, "Back") } }) }, + snackbarHost = { SnackbarHost(snackbarHostState) } + ) { padding -> + Column(modifier = Modifier.fillMaxSize().padding(padding).padding(16.dp)) { when (mode) { - "choose" -> ImportChooser(onSingleFile = { filePickerLauncher.launch("*/*") }, onLocalFolder = { folderPickerLauncher.launch(null) }, onCamera = { cameraPermission.launch(android.Manifest.permission.CAMERA) }, onDriveFolder = { drivePickerLauncher.launch(arrayOf("application/pdf", "image/*", "video/*")) }, onUrl = { mode = "url_import" }) + "choose" -> ImportChooser(onSingleFile = { filePickerLauncher.launch("*/*") }, onLocalFolder = { folderPickerLauncher.launch(null) }, onCamera = { startScan() }) "single" -> SingleImportResult(state = singleState, onDone = { importViewModel.clearState(); onDone() }, onRetry = { importViewModel.clearState(); mode = "choose" }) "batch_progress" -> BatchImportProgressScreen(viewModel = batchViewModel, onDone = { batchViewModel.reset(); onDone() }) - "url_import" -> UrlImportSection(importViewModel = importViewModel, onDone = { mode = "single" }, onBack = { mode = "choose" }) } } } } @Composable -private fun ImportChooser(onSingleFile: () -> Unit, onLocalFolder: () -> Unit, onDriveFolder: () -> Unit, onCamera: () -> Unit, onUrl: () -> Unit) { +private fun ImportChooser(onSingleFile: () -> Unit, onLocalFolder: () -> Unit, onCamera: () -> Unit) { Column(modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally) { Text("Choose Import Method", fontSize = 20.sp, fontWeight = FontWeight.Bold) Spacer(Modifier.height(24.dp)) - ImportOptionCard(icon = Icons.Filled.UploadFile, title = "Single File", subtitle = "Pick one PDF, image, or video", onClick = onSingleFile) + ImportOptionCard(icon = Icons.Filled.UploadFile, title = "Single File", subtitle = "Pick a PDF, image, text, markdown, or GPX file", onClick = onSingleFile) Spacer(Modifier.height(12.dp)) ImportOptionCard(icon = Icons.Filled.Folder, title = "Local Folder", subtitle = "Import all files from a phone folder", onClick = onLocalFolder) - val ctx = androidx.compose.ui.platform.LocalContext.current - if (com.app.traveldocs.data.local.FeatureFlags.isExperimentalEnabled(ctx) && com.app.traveldocs.data.local.FeatureFlags.isGoogleDriveEnabled(ctx)) { ImportOptionCard(icon = Icons.Filled.Cloud, title = "Google Drive Folder", subtitle = "Browse and import from Drive", onClick = onDriveFolder); Spacer(Modifier.height(12.dp)) } - Spacer(Modifier.height(12.dp)) - ImportOptionCard(icon = Icons.Filled.Cloud, title = "Take Photo", subtitle = "Capture document with camera", onClick = onCamera) Spacer(Modifier.height(12.dp)) - ImportOptionCard(icon = Icons.Filled.Cloud, title = "Import from URL", subtitle = "Download a file from a web address", onClick = onUrl) + ImportOptionCard(icon = Icons.Filled.PhotoCamera, title = "Scan document", subtitle = "On-device edge detect, crop, and enhance", onClick = onCamera) } } @@ -167,13 +206,13 @@ private fun ImportOptionCard(icon: ImageVector, title: String, subtitle: String, private fun SingleImportResult(state: ImportUiState, onDone: () -> Unit, onRetry: () -> Unit) { Column(modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center) { when { - state.isImporting -> { CircularProgressIndicator(Modifier.size(64.dp)); Spacer(Modifier.height(16.dp)); Text("Importing..."); Text("Running OCR", fontSize = 13.sp, color = Color.Gray) } + state.isImporting -> { CircularProgressIndicator(Modifier.size(64.dp)); Spacer(Modifier.height(16.dp)); Text("Importing..."); Text("Trying to read the page…", fontSize = 13.sp, color = Color.Gray) } state.importedDocument != null -> { val doc = state.importedDocument!! Icon(Icons.Filled.CheckCircle, null, tint = Color(0xFF4CAF50), modifier = Modifier.size(64.dp)) Spacer(Modifier.height(16.dp)); Text("Imported!", fontSize = 20.sp, fontWeight = FontWeight.Bold) Spacer(Modifier.height(16.dp)) - Card(Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = Color(0xFFF5F5F5))) { + Card(Modifier.fillMaxWidth(), shape = RoundedCornerShape(12.dp), colors = CardDefaults.cardColors(containerColor = androidx.compose.material3.MaterialTheme.colorScheme.surfaceVariant)) { Column(Modifier.padding(16.dp)) { Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { Text("Type", fontSize = 12.sp, color = Color.Gray); Text(doc.type.name, fontSize = 12.sp) } Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween) { Text("File", fontSize = 12.sp, color = Color.Gray); Text(doc.originalFileName ?: "?", fontSize = 12.sp) } diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/ImportViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/documents/ImportViewModel.kt similarity index 67% rename from app/src/main/java/com/app/traveldocs/presentation/documents/ImportViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/ImportViewModel.kt index ceb9276..c59b430 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/ImportViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/ImportViewModel.kt @@ -1,16 +1,18 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.content.Context import android.net.Uri import android.provider.OpenableColumns import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.ImportedDocument -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.usecase.DocumentImportUseCase +import com.app.paperstow.data.importer.DocumentFormatValidator +import com.app.paperstow.data.scanner.CameraDocumentScanner +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.ImportedDocument +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.usecase.DocumentImportUseCase import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow @@ -34,6 +36,8 @@ data class ImportUiState( class ImportViewModel @Inject constructor( private val importUseCase: DocumentImportUseCase, private val documentRepository: DocumentRepository, + private val formatValidator: DocumentFormatValidator, + private val documentScanner: CameraDocumentScanner, @ApplicationContext private val context: Context ) : ViewModel() { @@ -43,7 +47,7 @@ class ImportViewModel @Inject constructor( fun importFile(uri: Uri) { viewModelScope.launch { _state.value = ImportUiState(isImporting = true) - com.app.traveldocs.debug.UsageTelemetry.funnelStart("single_import") + com.app.paperstow.debug.UsageTelemetry.funnelStart("single_import") DebugLogger.i("ImportVM", "Starting import from URI: $uri") try { val contentResolver = context.contentResolver @@ -53,20 +57,8 @@ class ImportViewModel @Inject constructor( return@launch } val mimeType = contentResolver.getType(uri) - val format = when { - mimeType?.contains("pdf") == true -> DocumentFormat.PDF - mimeType?.contains("video") == true -> DocumentFormat.VIDEO - mimeType?.contains("png") == true -> DocumentFormat.PNG - mimeType?.contains("jpeg") == true || mimeType?.contains("jpg") == true -> DocumentFormat.JPG - mimeType?.contains("webp") == true -> DocumentFormat.WEBP - mimeType?.contains("heic") == true || mimeType?.contains("heif") == true -> DocumentFormat.HEIC - mimeType?.contains("bmp") == true -> DocumentFormat.BMP - mimeType?.contains("gif") == true -> DocumentFormat.GIF - mimeType?.contains("dicom") == true -> DocumentFormat.DICOM - mimeType?.contains("audio") == true || mimeType?.contains("mp3") == true -> if (com.app.traveldocs.data.local.FeatureFlags.isAudioPlaybackEnabled(context)) DocumentFormat.AUDIO else DocumentFormat.UNKNOWN - else -> DocumentFormat.UNKNOWN // Unsupported format, import anyway - } val fileName = getFileName(uri) ?: "imported_document" + val format = formatValidator.detect(bytes, mimeType, fileName) val fileHash = computeSha256(bytes) DebugLogger.d("ImportVM", "File: $fileName, hash=${fileHash.take(16)}..., size=${bytes.size}") @@ -110,7 +102,7 @@ class ImportViewModel @Inject constructor( _state.value = ImportUiState(importedDocument = doc) } result.onFailure { e -> - com.app.traveldocs.debug.UsageTelemetry.userError("Import", "import_failed") + com.app.paperstow.debug.UsageTelemetry.userError("Import", "import_failed") DebugLogger.e("ImportVM", "Import failed", e) _state.value = ImportUiState(error = e.message ?: "Import failed") } @@ -132,12 +124,25 @@ class ImportViewModel @Inject constructor( return MessageDigest.getInstance("SHA-256").digest(bytes).joinToString("") { "%02x".format(it) } } - fun importFromBytes(bytes: ByteArray, format: com.app.traveldocs.domain.model.DocumentFormat, fileName: String) { + fun startDocumentScan( + activity: android.app.Activity, + onReady: (android.content.IntentSender) -> Unit, + onUnavailable: () -> Unit + ) { + documentScanner.getStartIntent(activity, onReady) { onUnavailable() } + } + + fun importScanResult(data: android.content.Intent?) { + val pages = documentScanner.pagesFromResult(data) + importScannedPages(pages) + } + + fun importFromBytes(bytes: ByteArray, format: com.app.paperstow.domain.model.DocumentFormat, fileName: String) { viewModelScope.launch { _state.value = ImportUiState(isImporting = true) DebugLogger.i("ImportVM", "Importing from bytes: $fileName (${bytes.size} bytes)") try { - val result = importUseCase.importAndProcess(com.app.traveldocs.domain.model.ImportedDocument(bytes, format, fileName), "default-member") + val result = importUseCase.importAndProcess(com.app.paperstow.domain.model.ImportedDocument(bytes, format, fileName), "default-member") result.onSuccess { doc -> DebugLogger.i("ImportVM", "Camera import OK: type=${doc.type}") val prefs = context.getSharedPreferences("traveldocs_stats", android.content.Context.MODE_PRIVATE) @@ -148,4 +153,36 @@ class ImportViewModel @Inject constructor( } catch (e: Exception) { _state.value = ImportUiState(error = e.message ?: "Error") } } } + + fun importScannedPages(pages: List) { + if (pages.isEmpty()) { + _state.value = ImportUiState(error = "No pages were captured") + return + } + viewModelScope.launch { + _state.value = ImportUiState(isImporting = true) + var last: Document? = null + var imported = 0 + var lastError: String? = null + for (page in pages) { + val result = importUseCase.importAndProcess(page, "default-member") + result.onSuccess { doc -> + last = doc + imported++ + } + result.onFailure { e -> + lastError = e.message + DebugLogger.e("ImportVM", "Scan page failed: ${page.originalFileName}", e) + } + } + val prefs = context.getSharedPreferences("traveldocs_stats", Context.MODE_PRIVATE) + prefs.edit().putInt("doc_count", prefs.getInt("doc_count", 0) + imported).apply() + if (last != null) { + DebugLogger.i("ImportVM", "Scanned $imported page(s)") + _state.value = ImportUiState(importedDocument = last) + } else { + _state.value = ImportUiState(error = lastError ?: "Scan import failed") + } + } + } } diff --git a/app/src/main/java/com/app/paperstow/presentation/documents/NoteTagPicker.kt b/app/src/main/java/com/app/paperstow/presentation/documents/NoteTagPicker.kt new file mode 100644 index 0000000..be8b868 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/documents/NoteTagPicker.kt @@ -0,0 +1,128 @@ +package com.app.paperstow.presentation.documents + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.FilterChip +import androidx.compose.material3.Icon +import androidx.compose.material3.InputChip +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.app.paperstow.data.local.InputSanitizer +import com.app.paperstow.data.local.TagColorStore +import com.app.paperstow.domain.model.Document + +fun seedEditorTags(existing: Document?, extra: List, defaultTag: String): List { + val fromDoc = existing?.tags?.map { it.name }?.filter { !it.startsWith("__") }.orEmpty() + if (fromDoc.isNotEmpty()) return fromDoc.distinct() + return (listOf(defaultTag) + extra).map { InputSanitizer.sanitizeTag(it) } + .filter { it.isNotBlank() && !it.startsWith("__") } + .distinct() +} + +@OptIn(ExperimentalLayoutApi::class) +@Composable +fun NoteTagPicker( + selected: List, + catalog: List, + onChange: (List) -> Unit, + modifier: Modifier = Modifier +) { + val context = LocalContext.current + val store = remember { TagColorStore(context) } + var draft by remember { mutableStateOf("") } + val colors = MaterialTheme.colorScheme + val suggestions = catalog.filter { name -> + !name.startsWith("__") && selected.none { it.equals(name, ignoreCase = true) } + }.take(12) + + fun add(raw: String) { + val name = InputSanitizer.sanitizeTag(raw) + if (name.isBlank() || name.startsWith("__")) return + if (selected.any { it.equals(name, ignoreCase = true) }) return + onChange(selected + name) + } + + Column(modifier.fillMaxWidth()) { + Text("Tags", fontSize = 12.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(6.dp)) + if (selected.isEmpty()) { + Text("No tags — this paper will sit in Untagged.", fontSize = 12.sp, color = colors.onSurfaceVariant) + } else { + FlowRow(horizontalArrangement = Arrangement.spacedBy(6.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) { + selected.forEach { name -> + InputChip( + selected = false, + onClick = {}, + label = { Text(name, fontSize = 12.sp) }, + leadingIcon = { + com.app.paperstow.presentation.tags.TagMark(name, store, size = 18.dp) + }, + trailingIcon = { + Icon( + Icons.Filled.Close, + "Remove $name", + modifier = Modifier.size(16.dp).clickable { onChange(selected - name) } + ) + } + ) + } + } + } + if (suggestions.isNotEmpty()) { + Spacer(Modifier.height(8.dp)) + Text("Add from your tags", fontSize = 11.sp, color = colors.onSurfaceVariant) + FlowRow(horizontalArrangement = Arrangement.spacedBy(6.dp), verticalArrangement = Arrangement.spacedBy(4.dp)) { + suggestions.forEach { name -> + FilterChip( + selected = false, + onClick = { add(name) }, + label = { Text(name, fontSize = 12.sp) }, + leadingIcon = { Icon(Icons.Filled.Add, null, Modifier.size(14.dp)) } + ) + } + } + } + Spacer(Modifier.height(8.dp)) + Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + OutlinedTextField( + value = draft, + onValueChange = { draft = it }, + label = { Text("New tag") }, + singleLine = true, + modifier = Modifier.weight(1f) + ) + Spacer(Modifier.width(8.dp)) + TextButton( + onClick = { + add(draft) + draft = "" + }, + enabled = InputSanitizer.sanitizeTag(draft).isNotBlank() + ) { Text("Add") } + } + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/documents/PdfPreview.kt b/app/src/main/java/com/app/paperstow/presentation/documents/PdfPreview.kt new file mode 100644 index 0000000..df73390 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/documents/PdfPreview.kt @@ -0,0 +1,165 @@ +package com.app.paperstow.presentation.documents + +import android.graphics.Bitmap +import android.graphics.pdf.PdfRenderer +import android.os.ParcelFileDescriptor +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.gestures.detectTransformGestures +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.PictureAsPdf +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.graphics.graphicsLayer +import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.app.paperstow.debug.DebugLogger +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.util.concurrent.Executors + +private sealed class PdfUi { + data object Loading : PdfUi() + data class Ready(val pages: List) : PdfUi() + data class Failed(val reason: String) : PdfUi() +} + +/** + * Renders a PDF on one background thread. PdfRenderer is not thread-safe; + * creating it on IO and paging it on another thread is what broke preview. + */ +@Composable +fun PdfPreview(bytes: ByteArray, modifier: Modifier = Modifier) { + val context = LocalContext.current + val scope = rememberCoroutineScope() + var ui by remember(bytes) { mutableStateOf(PdfUi.Loading) } + var scale by remember(bytes) { mutableFloatStateOf(1f) } + var ox by remember(bytes) { mutableFloatStateOf(0f) } + var oy by remember(bytes) { mutableFloatStateOf(0f) } + + DisposableEffect(bytes) { + val executor = Executors.newSingleThreadExecutor() + val dispatcher = executor.asCoroutineDispatcher() + val job = scope.launch { + ui = PdfUi.Loading + ui = withContext(dispatcher) { + try { + val head = if (bytes.size >= 5) String(bytes, 0, 5, Charsets.ISO_8859_1) else "" + if (head != "%PDF-") { + return@withContext PdfUi.Failed("Not a PDF") + } + val file = File.createTempFile("preview", ".pdf", context.cacheDir) + file.writeBytes(bytes) + val fd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY) + val renderer = PdfRenderer(fd) + val pages = ArrayList(renderer.pageCount) + try { + for (i in 0 until renderer.pageCount) { + val page = renderer.openPage(i) + val srcW = page.width.coerceAtLeast(1) + val srcH = page.height.coerceAtLeast(1) + val maxW = 1200 + val factor = maxW.toFloat() / srcW + val w = (srcW * factor).toInt().coerceAtLeast(1) + val h = (srcH * factor).toInt().coerceAtLeast(1) + val bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888) + bmp.eraseColor(android.graphics.Color.WHITE) + page.render(bmp, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY) + page.close() + pages += bmp + } + PdfUi.Ready(pages) + } finally { + renderer.close() + fd.close() + file.delete() + } + } catch (e: Exception) { + DebugLogger.e("PDF", "Preview failed: ${e.message}", e) + PdfUi.Failed(e.message ?: "Could not open PDF") + } + } + } + onDispose { + job.cancel() + dispatcher.close() + executor.shutdownNow() + } + } + + when (val state = ui) { + PdfUi.Loading -> Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier) { + CircularProgressIndicator(Modifier.size(40.dp)) + Spacer(Modifier.height(8.dp)) + Text("Opening PDF…", fontSize = 13.sp, color = Color.Gray) + } + is PdfUi.Failed -> Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = modifier) { + Icon(Icons.Filled.PictureAsPdf, null, tint = Color(0xFFF44336), modifier = Modifier.size(64.dp)) + Spacer(Modifier.height(8.dp)) + Text("PDF preview failed", fontSize = 13.sp, color = Color.Gray) + Text(state.reason, fontSize = 11.sp, color = Color(0xFF9E9E9E)) + Text("Use Open External to try another viewer.", fontSize = 11.sp, color = Color(0xFF9E9E9E)) + } + is PdfUi.Ready -> Box( + modifier + .fillMaxSize() + .pointerInput(Unit) { + detectTransformGestures { _, pan, zoom, _ -> + scale = (scale * zoom).coerceIn(1f, 5f) + if (scale > 1f) { + ox += pan.x + oy += pan.y + } else { + ox = 0f + oy = 0f + } + } + } + ) { + LazyColumn( + Modifier + .fillMaxSize() + .background(Color.White) + .graphicsLayer(scaleX = scale, scaleY = scale, translationX = ox, translationY = oy) + ) { + itemsIndexed(state.pages) { idx, bmp -> + Image( + bitmap = bmp.asImageBitmap(), + contentDescription = "Page ${idx + 1}", + modifier = Modifier.fillMaxWidth().padding(vertical = 2.dp), + contentScale = ContentScale.FillWidth + ) + } + } + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/documents/ShareHelper.kt b/app/src/main/java/com/app/paperstow/presentation/documents/ShareHelper.kt similarity index 88% rename from app/src/main/java/com/app/traveldocs/presentation/documents/ShareHelper.kt rename to app/src/main/java/com/app/paperstow/presentation/documents/ShareHelper.kt index 69c59b3..89fc738 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/documents/ShareHelper.kt +++ b/app/src/main/java/com/app/paperstow/presentation/documents/ShareHelper.kt @@ -1,14 +1,14 @@ -package com.app.traveldocs.presentation.documents +package com.app.paperstow.presentation.documents import android.content.Context import android.content.Intent import android.net.Uri import androidx.core.content.FileProvider -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.debug.UsageTelemetry -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.repository.DocumentFileStorage +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.debug.UsageTelemetry +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.repository.DocumentFileStorage import java.io.File /** @@ -82,13 +82,16 @@ object ShareHelper { DocumentFormat.PDF -> "application/pdf" DocumentFormat.JPG -> "image/jpeg" DocumentFormat.PNG -> "image/png" - DocumentFormat.VIDEO -> "video/*" + DocumentFormat.TEXT -> "text/plain" + DocumentFormat.MARKDOWN -> "text/markdown" + DocumentFormat.GPX -> "application/gpx+xml" DocumentFormat.WEBP -> "image/webp" DocumentFormat.HEIC -> "image/heic" DocumentFormat.BMP -> "image/bmp" DocumentFormat.GIF -> "image/gif" - DocumentFormat.DICOM -> "application/dicom" + DocumentFormat.VIDEO -> "video/*" DocumentFormat.AUDIO -> "audio/mpeg" + DocumentFormat.DICOM -> "application/dicom" DocumentFormat.UNKNOWN -> "application/octet-stream" } } diff --git a/app/src/main/java/com/app/paperstow/presentation/documents/TextNoteEditorScreen.kt b/app/src/main/java/com/app/paperstow/presentation/documents/TextNoteEditorScreen.kt new file mode 100644 index 0000000..2c06f85 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/documents/TextNoteEditorScreen.kt @@ -0,0 +1,118 @@ +package com.app.paperstow.presentation.documents + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.Check +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.app.paperstow.domain.model.Document + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun TextNoteEditorScreen( + existing: Document? = null, + initialBody: String = "", + extraTags: List = emptyList(), + onBack: () -> Unit, + onSaved: (Document) -> Unit, + viewModel: TextNoteViewModel = hiltViewModel() +) { + val saving by viewModel.saving.collectAsState() + val error by viewModel.error.collectAsState() + val catalog by viewModel.catalog.collectAsState() + var title by remember { + mutableStateOf(existing?.originalFileName?.removeSuffix(".txt")?.removeSuffix(".TXT").orEmpty()) + } + var body by remember { mutableStateOf(initialBody) } + var tags by remember { mutableStateOf(seedEditorTags(existing, extraTags, "Notes")) } + val colors = MaterialTheme.colorScheme + + Scaffold( + topBar = { + TopAppBar( + title = { Text(if (existing == null) "New note" else "Edit note") }, + navigationIcon = { + IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } + }, + actions = { + if (saving) { + CircularProgressIndicator(Modifier.size(22.dp).padding(end = 4.dp), strokeWidth = 2.dp) + } else { + IconButton(onClick = { + if (existing == null) viewModel.createNote(title, body, tags, onSaved) + else viewModel.updateNote(existing, title, body, tags, onSaved) + }) { Icon(Icons.Filled.Check, "Save") } + } + } + ) + } + ) { padding -> + Column(Modifier.fillMaxSize().padding(padding).padding(16.dp)) { + OutlinedTextField( + value = title, + onValueChange = { title = it }, + label = { Text("Title") }, + singleLine = true, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(12.dp)) + NoteTagPicker(selected = tags, catalog = catalog, onChange = { tags = it }) + Spacer(Modifier.height(12.dp)) + if (error != null) { + Text(error!!, color = colors.error, fontSize = 13.sp) + Spacer(Modifier.height(8.dp)) + } + Text("Notes", fontSize = 12.sp, color = colors.onSurfaceVariant) + Spacer(Modifier.height(6.dp)) + BasicTextField( + value = body, + onValueChange = { body = it }, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + .padding(top = 4.dp), + textStyle = TextStyle( + fontFamily = FontFamily.SansSerif, + fontSize = 16.sp, + color = colors.onSurface, + lineHeight = 22.sp + ), + cursorBrush = SolidColor(colors.primary), + decorationBox = { inner -> + if (body.isEmpty()) { + Text("Write your note…", color = colors.onSurfaceVariant, fontSize = 16.sp) + } + inner() + } + ) + } + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/documents/TextNoteViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/documents/TextNoteViewModel.kt new file mode 100644 index 0000000..e0b3050 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/documents/TextNoteViewModel.kt @@ -0,0 +1,147 @@ +package com.app.paperstow.presentation.documents + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.app.paperstow.data.local.InputSanitizer +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.TagRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import java.time.Instant +import java.time.LocalDate +import javax.inject.Inject + +@HiltViewModel +class TextNoteViewModel @Inject constructor( + private val fileStorage: DocumentFileStorage, + private val documentRepository: DocumentRepository, + private val tagRepository: TagRepository +) : ViewModel() { + + private val _saving = MutableStateFlow(false) + val saving: StateFlow = _saving.asStateFlow() + + private val _error = MutableStateFlow(null) + val error: StateFlow = _error.asStateFlow() + + private val _catalog = MutableStateFlow>(emptyList()) + val catalog: StateFlow> = _catalog.asStateFlow() + + init { + viewModelScope.launch { + _catalog.value = tagRepository.getAllTags("default-member") + .map { it.name } + .filter { !it.startsWith("__") } + .distinct() + .sorted() + } + } + + fun createNote(title: String, body: String, tags: List, onSaved: (Document) -> Unit) { + create(title, body, DocumentFormat.TEXT, tags, onSaved) + } + + fun createChecklist(title: String, body: String, tags: List, onSaved: (Document) -> Unit) { + create(title, body, DocumentFormat.MARKDOWN, tags, onSaved) + } + + fun updateNote(document: Document, title: String, body: String, tags: List, onSaved: (Document) -> Unit) { + updateDocument(document, title, body, tags, onSaved) + } + + fun updateDocument(document: Document, title: String, body: String, tags: List, onSaved: (Document) -> Unit) { + viewModelScope.launch { + _saving.value = true + _error.value = null + try { + val name = displayName(title, document.format, document.originalFileName) + fileStorage.replace(document.id, body.toByteArray(Charsets.UTF_8)).getOrThrow() + val updatedAt = Instant.now() + documentRepository.updateName(document.id, name, updatedAt).getOrThrow() + documentRepository.updateOcrText(document.id, body) + val applied = applyTags(document.id, document.tags, tags) + val updated = document.copy(originalFileName = name, updatedAt = updatedAt, tags = applied) + DebugLogger.i("Note", "Updated ${document.format} ${document.id}") + onSaved(updated) + } catch (e: Exception) { + DebugLogger.e("Note", "Update failed", e) + _error.value = e.message ?: "Could not save" + } finally { + _saving.value = false + } + } + } + + private fun create( + title: String, + body: String, + format: DocumentFormat, + tags: List, + onSaved: (Document) -> Unit + ) { + viewModelScope.launch { + _saving.value = true + _error.value = null + try { + val name = displayName(title, format) + val bytes = body.toByteArray(Charsets.UTF_8) + val fileId = fileStorage.store("default-member", bytes, format).getOrThrow() + val now = Instant.now() + val chosen = sanitizeTagNames(tags) + val document = Document( + id = fileId, + memberId = "default-member", + type = DocumentType.UNKNOWN, + format = format, + originalFileName = name, + metadata = emptyMap(), + tags = chosen.map { Tag(name = it, isAutoGenerated = false) }, + createdAt = now, + updatedAt = now, + extractionConfidence = 1f, + requiresManualReview = false + ) + documentRepository.insert(document).getOrThrow() + documentRepository.updateOcrText(document.id, body) + DebugLogger.i("Note", "Created ${format.name} ${document.id} ($name) tags=$chosen") + onSaved(document) + } catch (e: Exception) { + DebugLogger.e("Note", "Create failed", e) + _error.value = e.message ?: "Could not save" + } finally { + _saving.value = false + } + } + } + + private suspend fun applyTags(documentId: String, previous: List, desiredRaw: List): List { + val desired = sanitizeTagNames(desiredRaw) + val keepSystem = previous.filter { it.name.startsWith("__") } + val currentUser = previous.filter { !it.name.startsWith("__") }.map { it.name } + currentUser.filter { it !in desired }.forEach { tagRepository.removeTag(documentId, it) } + desired.filter { it !in currentUser }.forEach { tagRepository.addTag(documentId, it) } + return keepSystem + desired.map { Tag(name = it, isAutoGenerated = false) } + } + + private fun sanitizeTagNames(tags: List): List = + tags.map { InputSanitizer.sanitizeTag(it) } + .filter { it.isNotBlank() && !it.startsWith("__") } + .distinct() + + private fun displayName(title: String, format: DocumentFormat, fallback: String? = null): String { + val ext = if (format == DocumentFormat.MARKDOWN) ".md" else ".txt" + val raw = title.trim().ifBlank { fallback?.substringBeforeLast('.')?.ifBlank { null } } + ?: if (format == DocumentFormat.MARKDOWN) "Plans ${LocalDate.now()}" else "Note ${LocalDate.now()}" + val sanitized = InputSanitizer.sanitizeFilename(raw) + return if (sanitized.endsWith(ext, ignoreCase = true)) sanitized else "$sanitized$ext" + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackScreen.kt b/app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackScreen.kt new file mode 100644 index 0000000..7d19989 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackScreen.kt @@ -0,0 +1,218 @@ +package com.app.paperstow.presentation.feedback + +import android.content.Context +import android.content.Intent +import android.os.Build +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.hilt.navigation.compose.hiltViewModel +import com.app.paperstow.data.feedback.FeedbackDraft +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import java.text.DateFormat +import java.util.Date + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FeedbackScreen( + onBack: () -> Unit, + onNoteSaved: (Document) -> Unit = {}, + viewModel: FeedbackViewModel = hiltViewModel() +) { + val context = LocalContext.current + val state by viewModel.state.collectAsState() + var showShareConfirm by remember { mutableStateOf(false) } + var shareDraft by remember { mutableStateOf(null) } + + if (showShareConfirm && shareDraft != null) { + AlertDialog( + onDismissRequest = { showShareConfirm = false; shareDraft = null }, + title = { Text("Share this feedback?") }, + text = { + Text( + "Paperstow will not upload it. Another app you pick — email or share — will send it. You can still keep the draft on this phone.", + fontSize = 14.sp + ) + }, + confirmButton = { + TextButton(onClick = { + val draft = shareDraft!! + showShareConfirm = false + shareDraft = null + sendFeedback(context, draft) + viewModel.dismissMessage() + }) { Text("Yes, share") } + }, + dismissButton = { + TextButton(onClick = { showShareConfirm = false; shareDraft = null }) { Text("Keep on phone") } + } + ) + } + + Scaffold( + topBar = { + TopAppBar( + title = { Text("Feedback") }, + navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } } + ) + } + ) { padding -> + Column( + Modifier + .fillMaxSize() + .padding(padding) + .padding(16.dp) + .verticalScroll(rememberScrollState()) + ) { + Text("What worked, and what did not.", fontSize = 18.sp, fontWeight = FontWeight.SemiBold) + Spacer(Modifier.height(4.dp)) + Text( + "Typed words are saved here as draft feedback. Nothing leaves this phone until you choose to share.", + fontSize = 13.sp, + color = Color.Gray + ) + Spacer(Modifier.height(16.dp)) + OutlinedTextField( + value = state.liked, + onValueChange = viewModel::updateLiked, + label = { Text("What I liked") }, + placeholder = { Text("A feature, a moment, something that helped") }, + modifier = Modifier.fillMaxWidth().height(140.dp) + ) + Spacer(Modifier.height(12.dp)) + OutlinedTextField( + value = state.disliked, + onValueChange = viewModel::updateDisliked, + label = { Text("What I did not like") }, + placeholder = { Text("Something confusing, missing, or broken") }, + modifier = Modifier.fillMaxWidth().height(140.dp) + ) + Spacer(Modifier.height(8.dp)) + Text("Draft saved on this phone.", fontSize = 12.sp, color = Color.Gray) + if (state.message != null) { + Spacer(Modifier.height(8.dp)) + Text(state.message!!, fontSize = 13.sp, color = MaterialTheme.colorScheme.primary) + } + Spacer(Modifier.height(16.dp)) + Button( + onClick = { + val draft = viewModel.currentDraft() + if (draft.isBlank()) return@Button + shareDraft = draft + showShareConfirm = true + }, + enabled = !state.liked.isBlank() || !state.disliked.isBlank(), + modifier = Modifier.fillMaxWidth() + ) { Text("Submit") } + Spacer(Modifier.height(8.dp)) + OutlinedButton(onClick = viewModel::newDraft, modifier = Modifier.fillMaxWidth()) { + Text("New draft") + } + + val drafts = state.drafts.filter { !it.isBlank() } + if (drafts.isNotEmpty()) { + Spacer(Modifier.height(24.dp)) + Text("Draft feedback on this phone", fontWeight = FontWeight.SemiBold, fontSize = 16.sp) + Spacer(Modifier.height(8.dp)) + drafts.forEach { draft -> + val current = draft.id == state.current?.id + Card( + Modifier.fillMaxWidth().padding(bottom = 8.dp).clickable { viewModel.openDraft(draft.id) }, + colors = CardDefaults.cardColors( + containerColor = if (current) MaterialTheme.colorScheme.primaryContainer + else MaterialTheme.colorScheme.surfaceVariant + ) + ) { + Column(Modifier.padding(12.dp)) { + val whenWritten = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) + .format(Date(draft.updatedAt)) + Text(if (current) "Current draft" else "Draft", fontSize = 12.sp, color = Color.Gray) + Text(whenWritten, fontWeight = FontWeight.Medium, fontSize = 14.sp) + Text(draft.preview(), fontSize = 13.sp, maxLines = 2) + Spacer(Modifier.height(8.dp)) + Row(horizontalArrangement = Arrangement.spacedBy(4.dp)) { + TextButton(onClick = { + viewModel.openDraft(draft.id) + shareDraft = draft + showShareConfirm = true + }) { Text("Send") } + TextButton(onClick = { + viewModel.openDraft(draft.id) + viewModel.saveAsNote(onNoteSaved) + }) { Text("Save as note") } + TextButton(onClick = { viewModel.deleteDraft(draft.id) }) { Text("Delete") } + } + } + } + } + } + } + } +} + +private fun sendFeedback(context: Context, draft: FeedbackDraft) { + val body = buildString { + appendLine("Paperstow feedback") + appendLine() + append(draft.asNoteBody()) + appendLine() + appendLine("--- Device (optional context) ---") + appendLine("Device: ${Build.MANUFACTURER} ${Build.MODEL}") + appendLine("Android: ${Build.VERSION.RELEASE}") + try { + val info = context.packageManager.getPackageInfo(context.packageName, 0) + appendLine("App: ${info.versionName}") + } catch (_: Exception) { + } + } + val intent = Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_SUBJECT, "Paperstow — User Feedback") + putExtra(Intent.EXTRA_TEXT, body) + } + try { + context.startActivity( + Intent.createChooser(intent, "Share feedback").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + ) + DebugLogger.i("Feedback", "Share sheet opened") + } catch (e: Exception) { + DebugLogger.e("Feedback", "Share failed", e) + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackViewModel.kt new file mode 100644 index 0000000..7049a23 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/feedback/FeedbackViewModel.kt @@ -0,0 +1,166 @@ +package com.app.paperstow.presentation.feedback + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.app.paperstow.data.feedback.FeedbackDraft +import com.app.paperstow.data.feedback.FeedbackDraftStore +import com.app.paperstow.data.local.InputSanitizer +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.DocumentFormat +import com.app.paperstow.domain.model.DocumentType +import com.app.paperstow.domain.model.Tag +import com.app.paperstow.domain.repository.DocumentFileStorage +import com.app.paperstow.domain.repository.DocumentRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch +import java.time.Instant +import java.time.LocalDate +import javax.inject.Inject + +const val APP_FEEDBACK_TAG = "App Feedbacks" + +data class FeedbackUiState( + val current: FeedbackDraft? = null, + val drafts: List = emptyList(), + val liked: String = "", + val disliked: String = "", + val message: String? = null, + val busy: Boolean = false +) + +@HiltViewModel +class FeedbackViewModel @Inject constructor( + private val store: FeedbackDraftStore, + private val fileStorage: DocumentFileStorage, + private val documentRepository: DocumentRepository +) : ViewModel() { + + private val _state = MutableStateFlow(FeedbackUiState()) + val state: StateFlow = _state.asStateFlow() + + init { + val current = store.currentOrNew() + _state.value = FeedbackUiState( + current = current, + drafts = store.draftsNewestFirst(), + liked = current.liked, + disliked = current.disliked + ) + } + + fun updateLiked(value: String) { + _state.value = _state.value.copy(liked = value) + persist() + } + + fun updateDisliked(value: String) { + _state.value = _state.value.copy(disliked = value) + persist() + } + + fun openDraft(id: String) { + persist() + store.setCurrent(id) + val draft = store.get(id) ?: return + _state.value = _state.value.copy( + current = draft, + drafts = store.draftsNewestFirst(), + liked = draft.liked, + disliked = draft.disliked, + message = null + ) + } + + fun newDraft() { + persist() + val draft = store.startNew() + _state.value = _state.value.copy( + current = draft, + drafts = store.draftsNewestFirst(), + liked = draft.liked, + disliked = draft.disliked, + message = "Started a new draft. Earlier drafts are still on this phone." + ) + } + + fun deleteDraft(id: String) { + store.delete(id) + val current = store.currentOrNew() + _state.value = _state.value.copy( + current = current, + drafts = store.draftsNewestFirst(), + liked = current.liked, + disliked = current.disliked, + message = "Draft deleted. It stayed on this phone only." + ) + } + + fun saveAsNote(onSaved: (Document) -> Unit) { + persist() + val draft = store.currentOrNew() + if (draft.isBlank()) { + _state.value = _state.value.copy(message = "Write something first.") + return + } + viewModelScope.launch { + _state.value = _state.value.copy(busy = true, message = null) + try { + val title = "Feedback ${LocalDate.now()}" + val name = InputSanitizer.sanitizeFilename(title).let { + if (it.endsWith(".txt", true)) it else "$it.txt" + } + val bytes = draft.asNoteBody().toByteArray(Charsets.UTF_8) + val fileId = fileStorage.store("default-member", bytes, DocumentFormat.TEXT).getOrThrow() + val now = Instant.now() + val document = Document( + id = fileId, + memberId = "default-member", + type = DocumentType.UNKNOWN, + format = DocumentFormat.TEXT, + originalFileName = name, + metadata = emptyMap(), + tags = listOf( + Tag(name = "Notes", isAutoGenerated = false), + Tag(name = APP_FEEDBACK_TAG, isAutoGenerated = false) + ), + createdAt = now, + updatedAt = now, + extractionConfidence = 1f, + requiresManualReview = false + ) + documentRepository.insert(document).getOrThrow() + store.delete(draft.id) + val current = store.currentOrNew() + _state.value = FeedbackUiState( + current = current, + drafts = store.draftsNewestFirst(), + liked = current.liked, + disliked = current.disliked, + message = "Saved as a note in $APP_FEEDBACK_TAG." + ) + onSaved(document) + } catch (e: Exception) { + DebugLogger.e("Feedback", "Save as note failed", e) + _state.value = _state.value.copy(busy = false, message = e.message ?: "Could not save as a note") + } + } + } + + fun dismissMessage() { + _state.value = _state.value.copy(message = null) + } + + fun currentDraft(): FeedbackDraft = store.saveCurrent(_state.value.liked, _state.value.disliked) + + private fun persist() { + val draft = store.saveCurrent(_state.value.liked, _state.value.disliked) + _state.value = _state.value.copy( + current = draft, + drafts = store.draftsNewestFirst() + ) + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/onboarding/.gitkeep b/app/src/main/java/com/app/paperstow/presentation/onboarding/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/presentation/onboarding/.gitkeep rename to app/src/main/java/com/app/paperstow/presentation/onboarding/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/presentation/onboarding/DisclaimerScreen.kt b/app/src/main/java/com/app/paperstow/presentation/onboarding/DisclaimerScreen.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/presentation/onboarding/DisclaimerScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/onboarding/DisclaimerScreen.kt index fd2f60e..a52b4ce 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/onboarding/DisclaimerScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/onboarding/DisclaimerScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.onboarding +package com.app.paperstow.presentation.onboarding import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -51,7 +51,7 @@ fun DisclaimerScreen(onAccepted: (telemetryConsent: Boolean) -> Unit) { Column(Modifier.padding(14.dp)) { Text("Your Data, Your Responsibility", fontWeight = FontWeight.SemiBold, fontSize = 14.sp) Spacer(Modifier.height(4.dp)) - Text("Certain features such as sharing, cloud backup, and external viewing can move your documents off your phone to third-party services or other apps. Please exercise caution when using these features and understand that once data leaves this device, it is subject to the privacy policies of those external services.", fontSize = 12.sp, color = Color(0xFF1A237E)) + Text("Sharing a document or exporting a password-protected backup can move files off this phone to another app or folder you choose. Once data leaves this device, it is subject to that destination's policies.", fontSize = 12.sp, color = Color(0xFF1A237E)) } } @@ -62,7 +62,7 @@ fun DisclaimerScreen(onAccepted: (telemetryConsent: Boolean) -> Unit) { Column(Modifier.padding(14.dp)) { Text("Privacy", fontWeight = FontWeight.SemiBold, fontSize = 14.sp) Spacer(Modifier.height(4.dp)) - Text("This application has no intent to collect, access, or transmit your personal documents or their content. All documents are stored locally on your device with encryption. No server, cloud service, or third party receives your document content unless you explicitly use sharing or backup features.", fontSize = 12.sp, color = Color(0xFF1B5E20)) + Text("This application has no intent to collect, access, or transmit your personal documents or their content. Your papers stay encrypted on this phone. Only you can open them. Nothing is sent off the device unless you share or archive it.", fontSize = 12.sp, color = Color(0xFF1B5E20)) } } diff --git a/app/src/main/java/com/app/traveldocs/presentation/onboarding/EulaScreen.kt b/app/src/main/java/com/app/paperstow/presentation/onboarding/EulaScreen.kt similarity index 86% rename from app/src/main/java/com/app/traveldocs/presentation/onboarding/EulaScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/onboarding/EulaScreen.kt index 7cb0d9f..1cf5b4a 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/onboarding/EulaScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/onboarding/EulaScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.onboarding +package com.app.paperstow.presentation.onboarding import android.content.Context import androidx.compose.foundation.layout.Column @@ -30,7 +30,7 @@ import androidx.compose.ui.unit.sp * End User License Agreement screen. * * Shown on first launch BEFORE anything else. User must accept to proceed. - * If declined, the app closes. Acceptance is persisted with timestamp and GPS location. + * If declined, the app closes. Acceptance is persisted with a timestamp. * Accessible later via Settings menu to review the signed agreement. */ @Composable @@ -66,6 +66,16 @@ fun EulaScreen(onAccepted: () -> Unit, onDeclined: () -> Unit) { } } + Spacer(Modifier.height(8.dp)) + val privacyUrl = androidx.compose.ui.res.stringResource(com.app.paperstow.R.string.privacy_policy_url) + val eulaContext = LocalContext.current + OutlinedButton( + onClick = { + eulaContext.startActivity(android.content.Intent(android.content.Intent.ACTION_VIEW, android.net.Uri.parse(privacyUrl))) + }, + modifier = Modifier.fillMaxWidth() + ) { Text("Privacy Policy") } + Spacer(Modifier.height(16.dp)) Row(modifier = Modifier.fillMaxWidth()) { @@ -105,8 +115,6 @@ fun EulaViewScreen(onBack: () -> Unit) { val context = LocalContext.current val prefs = context.getSharedPreferences("eula_prefs", Context.MODE_PRIVATE) val acceptedTimestamp = prefs.getLong("accepted_timestamp", 0L) - val acceptedLocation = prefs.getString("accepted_location", "Not available") ?: "Not available" - val dateStr = if (acceptedTimestamp > 0) { java.text.SimpleDateFormat("EEEE, dd MMMM yyyy 'at' HH:mm:ss z", java.util.Locale.getDefault()) .format(java.util.Date(acceptedTimestamp)) @@ -126,7 +134,6 @@ fun EulaViewScreen(onBack: () -> Unit) { Text("Agreement Status: ACCEPTED", fontWeight = FontWeight.SemiBold, color = Color(0xFF2E7D32), fontSize = 14.sp) Spacer(Modifier.height(4.dp)) Text("Date & Time: $dateStr", fontSize = 12.sp) - Text("Location: $acceptedLocation", fontSize = 12.sp) } } @@ -150,7 +157,7 @@ fun EulaViewScreen(onBack: () -> Unit) { private fun EulaText() { val sections = listOf( "1. ACCEPTANCE OF TERMS" to """ -By downloading, installing, accessing, or using the Document Manager application ("the App"), you ("User") acknowledge that you have read, understood, and agree to be legally bound by this End User License Agreement ("Agreement"). If you do not agree to these terms, you must immediately uninstall the App and discontinue all use. +By downloading, installing, accessing, or using the Paperstow application ("the App"), you ("User") acknowledge that you have read, understood, and agree to be legally bound by this End User License Agreement ("Agreement"). If you do not agree to these terms, you must immediately uninstall the App and discontinue all use. This Agreement constitutes a legally binding contract between you and the developer(s) of the App ("Developer"). Your continued use of the App following any modifications to this Agreement constitutes acceptance of those modifications. """.trimIndent(), @@ -158,7 +165,7 @@ This Agreement constitutes a legally binding contract between you and the develo "2. LICENSE GRANT" to """ Subject to your compliance with this Agreement, Developer grants you a limited, non-exclusive, non-transferable, revocable license to use the App on a single device owned or controlled by you, solely for your personal, non-commercial purposes. -This license does not grant you any rights to the source code, except as separately provided under the Apache 2.0 open source license governing the source repository. +This license does not grant you any rights to the source code, except as separately provided under the Apache 2.0 open source license governing the source repository. Third-party libraries bundled with the App (including AndroidX, Bouncy Castle, Zip4j, and Google ML Kit / Play services) remain under their own licenses and terms, which are listed in the repository NOTICE and docs/THIRD_PARTY_LICENSES.md. """.trimIndent(), "3. DISCLAIMER OF WARRANTIES" to """ @@ -208,11 +215,11 @@ You further acknowledge that this App was built and tested with the assistance o "6. DATA AND PRIVACY" to """ The App stores all user data locally on your device. Developer does not operate servers, collect user data, or have access to your documents, metadata, or personal information. -If you enable optional features (cloud backup, sharing), you acknowledge that data will leave your device at your explicit direction. Developer bears no responsibility for data once it leaves the App's local encrypted storage. +If you share a document or export a password-protected backup, you acknowledge that data will leave your device at your explicit direction. Developer bears no responsibility for data once it leaves the App's local encrypted storage. -If you enable anonymous telemetry (opt-in only), only non-identifying usage statistics are collected. No document content, personal information, or location data is transmitted. +If you enable anonymous telemetry (opt-in only), only non-identifying usage counts are stored locally. No document content or personal information is collected. -GPS logging, if enabled by you, is stored exclusively on your device. Developer has no access to your location history. +Optional My Trail: if you start it, unique places from the last 24 hours stay on this device, including battery level at each save. Locations are not uploaded. You may share Maps links yourself. """.trimIndent(), "7. ENCRYPTION AND SECURITY" to """ @@ -224,19 +231,7 @@ The App uses encryption (AES-256-GCM) to protect stored documents. You acknowled • You are responsible for maintaining physical security of your device """.trimIndent(), - "7B. PER-DOCUMENT PIN PROTECTION" to """ -The App offers an optional per-document PIN lock feature ("Secure Docs"). You acknowledge and accept that: - -• Per-document PINs are derived into encryption keys using PBKDF2-SHA256. The PIN itself is never stored. -• IF YOU FORGET A PER-DOCUMENT PIN, THE PROTECTED DOCUMENT IS PERMANENTLY AND IRREVERSIBLY INACCESSIBLE. There is no recovery mechanism, no master key, and no backdoor. -• Developer has no ability whatsoever to recover, decrypt, or access PIN-protected documents. This is by design. -• This feature is a personal privacy tool. It does not exempt you from legal obligations. -• If compelled by lawful court order, government authority, or law enforcement to disclose document contents, you bear sole responsibility for compliance. Developer cannot assist in decryption. -• You must not use this feature to conceal evidence, obstruct justice, or violate any applicable law. -• Developer bears zero liability for data loss resulting from forgotten PINs. - """.trimIndent(), - - "8. INDEMNIFICATION" to """ + "7. ENCRYPTION AND SECURITY" to """ You agree to indemnify, defend, and hold harmless Developer, its affiliates, officers, agents, and licensors from and against any and all claims, damages, obligations, losses, liabilities, costs, or debt, and expenses (including reasonable attorneys' fees) arising from: • Your use of and access to the App @@ -313,7 +308,7 @@ No failure or delay by Developer in exercising any right under this Agreement sh } Text( - "Last updated: August 2026\n© 2026 Document Manager Developer. All rights reserved.", + "Last updated: September 2026\n© 2026 Paperstow Contributors. All rights reserved.", fontSize = 11.sp, color = Color.Gray, textAlign = TextAlign.Center, diff --git a/app/src/main/java/com/app/paperstow/presentation/onboarding/SplashScreen.kt b/app/src/main/java/com/app/paperstow/presentation/onboarding/SplashScreen.kt new file mode 100644 index 0000000..71a610a --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/onboarding/SplashScreen.kt @@ -0,0 +1,123 @@ +package com.app.paperstow.presentation.onboarding + +import android.content.res.Configuration +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Button +import androidx.compose.material3.Checkbox +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.app.paperstow.R + +@Composable +fun SplashScreen(onContinue: (skipInFuture: Boolean) -> Unit) { + var skipInFuture by remember { mutableStateOf(false) } + val landscape = LocalConfiguration.current.orientation == Configuration.ORIENTATION_LANDSCAPE + val bodyAlign = if (landscape) TextAlign.Start else TextAlign.Center + + Column( + modifier = Modifier + .fillMaxSize() + .background(Color(0xFF0C2041)) + .verticalScroll(rememberScrollState()) + .padding(if (landscape) 20.dp else 32.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + if (landscape) { + Row(Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Image( + painter = painterResource(R.drawable.ic_launcher_foreground), + contentDescription = "Paperstow", + modifier = Modifier.size(88.dp) + ) + Spacer(Modifier.width(16.dp)) + Column(Modifier.weight(1f)) { + Text("Paperstow", fontSize = 24.sp, fontWeight = FontWeight.Bold, color = Color.White) + Text( + "A pocket for the family’s travel papers.", + fontSize = 14.sp, + color = Color.White.copy(alpha = 0.9f) + ) + } + } + Spacer(Modifier.height(12.dp)) + } else { + Spacer(Modifier.height(36.dp)) + Image( + painter = painterResource(R.drawable.ic_launcher_foreground), + contentDescription = "Paperstow", + modifier = Modifier.size(112.dp) + ) + Spacer(Modifier.height(16.dp)) + Text("Paperstow", fontSize = 28.sp, fontWeight = FontWeight.Bold, color = Color.White) + Spacer(Modifier.height(8.dp)) + Text( + "A pocket for the family’s travel papers.", + fontSize = 16.sp, + color = Color.White.copy(alpha = 0.9f), + textAlign = TextAlign.Center + ) + Spacer(Modifier.height(16.dp)) + } + Text( + "Passports, visas, tickets, and insurance stay encrypted on this phone. No account. No Paperstow servers.", + fontSize = 15.sp, + color = Color.White.copy(alpha = 0.92f), + textAlign = bodyAlign, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(if (landscape) 10.dp else 16.dp)) + Text( + "Unlock with this phone’s fingerprint, face, or screen lock. Find a page by tag or text — even in airplane mode at the gate.", + fontSize = 14.sp, + color = Color.White.copy(alpha = 0.82f), + textAlign = bodyAlign, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(if (landscape) 10.dp else 16.dp)) + Text( + "Nothing leaves unless you share a file or export an archive. Suggested names and tags are only a helper — always check the original page.", + fontSize = 13.sp, + color = Color.White.copy(alpha = 0.72f), + textAlign = bodyAlign, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(if (landscape) 12.dp else 20.dp)) + Row(verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth()) { + Checkbox(checked = skipInFuture, onCheckedChange = { skipInFuture = it }) + Text("Don’t show this again", color = Color.White.copy(alpha = 0.95f), fontSize = 14.sp) + } + Spacer(Modifier.height(if (landscape) 12.dp else 20.dp)) + Button( + onClick = { onContinue(skipInFuture) }, + modifier = Modifier.fillMaxWidth().height(48.dp) + ) { + Text("Continue", fontSize = 16.sp) + } + Spacer(Modifier.height(16.dp)) + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/review/ReviewScreen.kt b/app/src/main/java/com/app/paperstow/presentation/review/ReviewScreen.kt similarity index 99% rename from app/src/main/java/com/app/traveldocs/presentation/review/ReviewScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/review/ReviewScreen.kt index 90ce83d..02a093c 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/review/ReviewScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/review/ReviewScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.review +package com.app.paperstow.presentation.review import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -51,7 +51,7 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel -import com.app.traveldocs.domain.model.Document +import com.app.paperstow.domain.model.Document /** * Two-tab review screen: diff --git a/app/src/main/java/com/app/traveldocs/presentation/review/ReviewViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/review/ReviewViewModel.kt similarity index 91% rename from app/src/main/java/com/app/traveldocs/presentation/review/ReviewViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/review/ReviewViewModel.kt index 5d39cf0..cae1a83 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/review/ReviewViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/review/ReviewViewModel.kt @@ -1,12 +1,12 @@ -package com.app.traveldocs.presentation.review +package com.app.paperstow.presentation.review import android.content.Context import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.TagRepository +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.repository.DocumentRepository +import com.app.paperstow.domain.repository.TagRepository import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.flow.MutableStateFlow diff --git a/app/src/main/java/com/app/paperstow/presentation/safety/AutoStartTrail.kt b/app/src/main/java/com/app/paperstow/presentation/safety/AutoStartTrail.kt new file mode 100644 index 0000000..f5ab459 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/safety/AutoStartTrail.kt @@ -0,0 +1,71 @@ +package com.app.paperstow.presentation.safety + +import android.Manifest +import android.content.pm.PackageManager +import android.os.Build +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalContext +import androidx.core.content.ContextCompat +import com.app.paperstow.data.safety.SafetyTrailPreferences +import com.app.paperstow.data.safety.SafetyTrailService + +@Composable +fun AutoStartTrailIfWanted() { + val context = LocalContext.current + val running by SafetyTrailPreferences.running.collectAsState() + var requested by remember { mutableStateOf(false) } + + fun start() { + SafetyTrailService.start(context.applicationContext) + } + + fun hasLocation(): Boolean { + val fine = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) + val coarse = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) + return fine == PackageManager.PERMISSION_GRANTED || coarse == PackageManager.PERMISSION_GRANTED + } + + fun needsNotification(): Boolean = + Build.VERSION.SDK_INT >= 33 && + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED + + val notificationLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestPermission() + ) { start() } + + val locationLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { grants -> + val granted = grants[Manifest.permission.ACCESS_FINE_LOCATION] == true || + grants[Manifest.permission.ACCESS_COARSE_LOCATION] == true + if (!granted) { + SafetyTrailPreferences.setWantsTrail(context, false) + return@rememberLauncherForActivityResult + } + if (needsNotification()) { + notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } else { + start() + } + } + + LaunchedEffect(running) { + if (requested || running || !SafetyTrailPreferences.wantsTrail(context)) return@LaunchedEffect + requested = true + when { + hasLocation() && needsNotification() -> notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + hasLocation() -> start() + else -> locationLauncher.launch( + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION) + ) + } + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsScreen.kt b/app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsScreen.kt new file mode 100644 index 0000000..fabb3b3 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsScreen.kt @@ -0,0 +1,338 @@ +package com.app.paperstow.presentation.safety + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.net.Uri +import android.os.Build +import android.provider.Settings +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.MyLocation +import androidx.compose.material.icons.filled.Share +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import androidx.core.content.ContextCompat +import androidx.hilt.navigation.compose.hiltViewModel +import com.app.paperstow.R +import com.app.paperstow.domain.safety.SafetyPlace +import com.app.paperstow.domain.safety.UniqueLocations +import java.text.DateFormat +import java.util.Date + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SafetyLocationsScreen( + onBack: () -> Unit, + viewModel: SafetyLocationsViewModel = hiltViewModel() +) { + val colors = MaterialTheme.colorScheme + val context = LocalContext.current + val places by viewModel.places.collectAsState() + val running by viewModel.running.collectAsState() + var showDisclosure by remember { mutableStateOf(false) } + var showClearConfirm by remember { mutableStateOf(false) } + var permissionDenied by remember { mutableStateOf(false) } + + val notificationLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestPermission() + ) { viewModel.startTrail(context) } + + val locationLauncher = rememberLauncherForActivityResult( + ActivityResultContracts.RequestMultiplePermissions() + ) { grants -> + val granted = grants[Manifest.permission.ACCESS_FINE_LOCATION] == true || + grants[Manifest.permission.ACCESS_COARSE_LOCATION] == true + if (!granted) { + permissionDenied = true + return@rememberLauncherForActivityResult + } + permissionDenied = false + if (Build.VERSION.SDK_INT >= 33 && + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED + ) { + notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } else { + viewModel.startTrail(context) + } + } + + fun requestStart() { + val fine = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) + val coarse = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) + if (fine == PackageManager.PERMISSION_GRANTED || coarse == PackageManager.PERMISSION_GRANTED) { + if (Build.VERSION.SDK_INT >= 33 && + ContextCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED + ) { + notificationLauncher.launch(Manifest.permission.POST_NOTIFICATIONS) + } else { + viewModel.startTrail(context) + } + } else { + showDisclosure = true + } + } + + if (showDisclosure) { + AlertDialog( + onDismissRequest = { showDisclosure = false }, + title = { Text(stringResource(R.string.safety_disclosure_title)) }, + text = { Text(stringResource(R.string.safety_disclosure_body), fontSize = 14.sp) }, + confirmButton = { + TextButton(onClick = { + showDisclosure = false + locationLauncher.launch( + arrayOf( + Manifest.permission.ACCESS_FINE_LOCATION, + Manifest.permission.ACCESS_COARSE_LOCATION + ) + ) + }) { Text(stringResource(R.string.safety_allow_location)) } + }, + dismissButton = { + TextButton(onClick = { showDisclosure = false }) { Text(stringResource(R.string.btn_cancel)) } + } + ) + } + + if (showClearConfirm) { + AlertDialog( + onDismissRequest = { showClearConfirm = false }, + title = { Text(stringResource(R.string.safety_clear_title)) }, + text = { Text(stringResource(R.string.safety_clear_body)) }, + confirmButton = { + TextButton(onClick = { + showClearConfirm = false + viewModel.clearPlaces() + }) { Text(stringResource(R.string.safety_clear)) } + }, + dismissButton = { + TextButton(onClick = { showClearConfirm = false }) { Text(stringResource(R.string.btn_cancel)) } + } + ) + } + + Scaffold( + topBar = { + TopAppBar( + title = { Text(stringResource(R.string.safety_title)) }, + navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, stringResource(R.string.btn_back)) } } + ) + } + ) { padding -> + Column( + Modifier + .fillMaxSize() + .padding(padding) + .padding(horizontal = 16.dp) + ) { + Text( + stringResource(R.string.safety_intro), + fontSize = 14.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + Card( + Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant) + ) { + Column(Modifier.padding(16.dp)) { + Text( + if (running) stringResource(R.string.safety_status_on) else stringResource(R.string.safety_status_off), + fontWeight = FontWeight.SemiBold, + fontSize = 15.sp + ) + Spacer(Modifier.height(4.dp)) + Text( + if (running) stringResource(R.string.safety_status_on_hint) else stringResource(R.string.safety_status_off_hint), + fontSize = 12.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + if (running) { + OutlinedButton(onClick = { viewModel.stopTrail(context) }, modifier = Modifier.fillMaxWidth()) { + Text(stringResource(R.string.safety_stop)) + } + } else { + Button(onClick = { requestStart() }, modifier = Modifier.fillMaxWidth()) { + Text(stringResource(R.string.safety_start)) + } + } + if (permissionDenied) { + Spacer(Modifier.height(8.dp)) + Text(stringResource(R.string.safety_permission_denied), fontSize = 12.sp, color = colors.error) + TextButton(onClick = { + context.startActivity( + Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", context.packageName, null)) + ) + }) { Text(stringResource(R.string.safety_open_settings)) } + } + } + } + Spacer(Modifier.height(16.dp)) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(8.dp)) { + OutlinedButton( + onClick = { + val text = viewModel.shareLastKnownText() ?: return@OutlinedButton + shareText(context, text) + }, + enabled = places.isNotEmpty(), + modifier = Modifier.weight(1f) + ) { Text(stringResource(R.string.safety_share_last), fontSize = 13.sp) } + OutlinedButton( + onClick = { shareText(context, viewModel.shareAllText()) }, + enabled = places.isNotEmpty(), + modifier = Modifier.weight(1f) + ) { Text(stringResource(R.string.safety_share_all), fontSize = 13.sp) } + } + Spacer(Modifier.height(8.dp)) + Row( + Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + stringResource(R.string.safety_list_title, places.size), + fontWeight = FontWeight.Bold, + fontSize = 16.sp, + modifier = Modifier.weight(1f) + ) + if (places.isNotEmpty()) { + TextButton(onClick = { showClearConfirm = true }) { + Text(stringResource(R.string.safety_clear)) + } + } + } + if (places.isEmpty()) { + Column( + Modifier.fillMaxWidth().padding(vertical = 32.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Icon(Icons.Filled.MyLocation, null, Modifier.size(48.dp), tint = colors.onSurfaceVariant) + Spacer(Modifier.height(8.dp)) + Text(stringResource(R.string.safety_empty), fontSize = 14.sp, color = colors.onSurfaceVariant) + } + } else { + LazyColumn { + itemsIndexed(places) { index, place -> + PlaceCard( + place = place, + isLastKnown = index == 0, + onOpenMaps = { openMaps(context, place) }, + onShare = { shareText(context, UniqueLocationsShare(place)) } + ) + Spacer(Modifier.height(8.dp)) + } + } + } + } + } +} + +private fun UniqueLocationsShare(place: SafetyPlace): String = + com.app.paperstow.domain.safety.UniqueLocations.shareLastKnown(place) + +@Composable +private fun PlaceCard( + place: SafetyPlace, + isLastKnown: Boolean, + onOpenMaps: () -> Unit, + onShare: () -> Unit +) { + val colors = MaterialTheme.colorScheme + val time = remember(place.timestamp) { + DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT).format(Date(place.timestamp)) + } + Card( + Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = if (isLastKnown) colors.primaryContainer else colors.surfaceVariant + ) + ) { + Column(Modifier.padding(12.dp)) { + Text( + if (isLastKnown) stringResource(R.string.safety_last_known) else stringResource(R.string.safety_earlier_place), + fontSize = 12.sp, + fontWeight = FontWeight.SemiBold, + color = colors.onSurfaceVariant + ) + Text(time, fontWeight = FontWeight.Medium, fontSize = 15.sp) + Text( + "%.5f, %.5f".format(place.latitude, place.longitude), + fontSize = 12.sp, + color = colors.onSurfaceVariant + ) + UniqueLocations.batteryLabel(place.batteryPercent)?.let { label -> + Text(label, fontSize = 12.sp, color = colors.onSurfaceVariant) + } + Spacer(Modifier.height(8.dp)) + Row { + TextButton(onClick = onOpenMaps) { Text(stringResource(R.string.safety_open_maps)) } + Spacer(Modifier.width(4.dp)) + TextButton(onClick = onShare) { + Icon(Icons.Filled.Share, null, Modifier.size(16.dp)) + Spacer(Modifier.width(4.dp)) + Text(stringResource(R.string.share_document)) + } + } + } + } +} + +private fun shareText(context: android.content.Context, text: String) { + val intent = Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, text) + putExtra(Intent.EXTRA_SUBJECT, context.getString(R.string.safety_share_subject)) + } + context.startActivity(Intent.createChooser(intent, context.getString(R.string.safety_share_subject))) +} + +private fun openMaps(context: android.content.Context, place: SafetyPlace) { + val geo = Uri.parse("geo:${place.latitude},${place.longitude}?q=${place.latitude},${place.longitude}") + val maps = Intent(Intent.ACTION_VIEW, geo) + try { + context.startActivity(maps) + } catch (_: Exception) { + context.startActivity( + Intent(Intent.ACTION_VIEW, Uri.parse(com.app.paperstow.domain.safety.UniqueLocations.mapsUrl(place.latitude, place.longitude))) + ) + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsViewModel.kt new file mode 100644 index 0000000..63b0c33 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/safety/SafetyLocationsViewModel.kt @@ -0,0 +1,50 @@ +package com.app.paperstow.presentation.safety + +import android.content.Context +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.app.paperstow.data.safety.SafetyLocationRepository +import com.app.paperstow.data.safety.SafetyTrailPreferences +import com.app.paperstow.data.safety.SafetyTrailService +import com.app.paperstow.domain.safety.SafetyPlace +import com.app.paperstow.domain.safety.UniqueLocations +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SafetyLocationsViewModel @Inject constructor( + private val repository: SafetyLocationRepository +) : ViewModel() { + + val places: StateFlow> = repository.observeLast24Hours() + .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), emptyList()) + + val running: StateFlow = SafetyTrailPreferences.running + + init { + viewModelScope.launch { repository.pruneExpired() } + } + + fun startTrail(context: Context) { + SafetyTrailService.start(context.applicationContext) + } + + fun stopTrail(context: Context) { + SafetyTrailService.stop(context.applicationContext) + } + + fun clearPlaces() { + viewModelScope.launch { repository.clearAll() } + } + + fun shareAllText(): String = UniqueLocations.shareAll(places.value) + + fun shareLastKnownText(): String? { + val last = places.value.firstOrNull() ?: return null + return UniqueLocations.shareLastKnown(last) + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/search/.gitkeep b/app/src/main/java/com/app/paperstow/presentation/search/.gitkeep similarity index 100% rename from app/src/main/java/com/app/traveldocs/presentation/search/.gitkeep rename to app/src/main/java/com/app/paperstow/presentation/search/.gitkeep diff --git a/app/src/main/java/com/app/traveldocs/presentation/search/SearchScreen.kt b/app/src/main/java/com/app/paperstow/presentation/search/SearchScreen.kt similarity index 93% rename from app/src/main/java/com/app/traveldocs/presentation/search/SearchScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/search/SearchScreen.kt index 27c4b27..1fa39d8 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/search/SearchScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/search/SearchScreen.kt @@ -1,4 +1,4 @@ -package com.app.traveldocs.presentation.search +package com.app.paperstow.presentation.search import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -33,8 +33,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.hilt.navigation.compose.hiltViewModel -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.model.SearchResult +import com.app.paperstow.domain.model.Document +import com.app.paperstow.domain.model.SearchResult @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -44,7 +44,7 @@ fun SearchScreen(onBack: () -> Unit, onDocumentClick: (Document) -> Unit = {}, v Scaffold(topBar = { TopAppBar(title = { Text("Search Documents") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> Column(modifier = Modifier.fillMaxSize().padding(padding).padding(16.dp)) { - OutlinedTextField(value = query, onValueChange = { query = it; viewModel.search(it) }, modifier = Modifier.fillMaxWidth(), placeholder = { Text("Search by tag, name, or ask a question...") }, leadingIcon = { Icon(Icons.Filled.Search, null) }, singleLine = true) + OutlinedTextField(value = query, onValueChange = { query = it; viewModel.search(it) }, modifier = Modifier.fillMaxWidth(), placeholder = { Text("Search tags, file names, or text from the page") }, leadingIcon = { Icon(Icons.Filled.Search, null) }, singleLine = true) Spacer(Modifier.height(16.dp)) when (val r = results) { diff --git a/app/src/main/java/com/app/traveldocs/presentation/search/SearchViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/search/SearchViewModel.kt similarity index 87% rename from app/src/main/java/com/app/traveldocs/presentation/search/SearchViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/search/SearchViewModel.kt index 11cc263..97cb141 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/search/SearchViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/search/SearchViewModel.kt @@ -1,10 +1,10 @@ -package com.app.traveldocs.presentation.search +package com.app.paperstow.presentation.search import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.SearchResult -import com.app.traveldocs.domain.repository.SearchEngine +import com.app.paperstow.debug.DebugLogger +import com.app.paperstow.domain.model.SearchResult +import com.app.paperstow.domain.repository.SearchEngine import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -32,7 +32,7 @@ class SearchViewModel @Inject constructor( if (query.isBlank()) { _results.value = null; return } searchJob = viewModelScope.launch { delay(300) - com.app.traveldocs.debug.UsageTelemetry.action("Search", "query") + com.app.paperstow.debug.UsageTelemetry.action("Search", "query") DebugLogger.i("SearchVM", "Searching: '$query'") try { val result = searchEngine.searchNaturalLanguage("default-member", query) diff --git a/app/src/main/java/com/app/paperstow/presentation/settings/SearchIndexViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/settings/SearchIndexViewModel.kt new file mode 100644 index 0000000..971989a --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/settings/SearchIndexViewModel.kt @@ -0,0 +1,19 @@ +package com.app.paperstow.presentation.settings + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.app.paperstow.data.local.SearchIndexRebuilder +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SearchIndexViewModel @Inject constructor( + private val rebuilder: SearchIndexRebuilder +) : ViewModel() { + val state = rebuilder.state + + fun rebuild() { + viewModelScope.launch { rebuilder.rebuild() } + } +} diff --git a/app/src/main/java/com/app/paperstow/presentation/settings/SettingsScreen.kt b/app/src/main/java/com/app/paperstow/presentation/settings/SettingsScreen.kt new file mode 100644 index 0000000..525e075 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/settings/SettingsScreen.kt @@ -0,0 +1,267 @@ +package com.app.paperstow.presentation.settings + +import android.content.Intent +import android.net.Uri +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.material.icons.filled.RestartAlt +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LinearProgressIndicator +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.app.paperstow.R +import com.app.paperstow.debug.UsageTelemetry + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SettingsScreen(onBack: () -> Unit, onReset: () -> String, indexViewModel: SearchIndexViewModel = hiltViewModel()) { + val context = LocalContext.current + val colors = MaterialTheme.colorScheme + val index by indexViewModel.state.collectAsState() + var showResetDialog by remember { mutableStateOf(false) } + var resetStep by remember { mutableIntStateOf(0) } + var resetReport by remember { mutableStateOf("") } + + if (showResetDialog) { + AlertDialog( + onDismissRequest = { showResetDialog = false; resetStep = 0 }, + icon = { Icon(Icons.Filled.RestartAlt, null, tint = Color(0xFFF44336)) }, + title = { Text(if (resetStep < 2) "Reset App?" else "ARE YOU SURE?") }, + text = { + Column { + if (resetStep == 3) { + Text("Reset complete. Details:", fontWeight = FontWeight.SemiBold, fontSize = 14.sp) + Spacer(Modifier.height(8.dp)) + Text(resetReport, fontSize = 11.sp, fontFamily = FontFamily.Monospace, color = Color.Gray) + Spacer(Modifier.height(12.dp)) + Text("Tap Restart App to start fresh.", fontSize = 13.sp) + } else if (resetStep < 2) { + Text("This will PERMANENTLY DELETE:", fontWeight = FontWeight.Bold, fontSize = 14.sp) + Spacer(Modifier.height(8.dp)) + Text("• All imported documents (encrypted files)", fontSize = 13.sp) + Text("• All tags and metadata", fontSize = 13.sp) + Text("• All settings and preferences", fontSize = 13.sp) + Text("• My Trail places on this phone", fontSize = 13.sp) + Text("• EULA acceptance (will show again)", fontSize = 13.sp) + Text("• Debug logs and telemetry", fontSize = 13.sp) + Spacer(Modifier.height(12.dp)) + Text( + "This CANNOT be undone. The app will restart as freshly installed.", + fontWeight = FontWeight.Bold, + color = Color(0xFFF44336), + fontSize = 13.sp + ) + } else { + Text("Last chance. Tap Delete Everything to proceed.", fontSize = 14.sp, color = Color(0xFFF44336)) + Spacer(Modifier.height(8.dp)) + Text("All data will be permanently erased.", fontSize = 13.sp) + } + } + }, + confirmButton = { + if (resetStep < 2) { + TextButton(onClick = { resetStep = 2 }) { Text("I understand, continue", color = Color(0xFFF44336)) } + } else if (resetStep == 2) { + TextButton(onClick = { resetReport = onReset(); resetStep = 3 }) { + Text("DELETE EVERYTHING", color = Color(0xFFF44336), fontWeight = FontWeight.Bold) + } + } else { + TextButton(onClick = { android.os.Process.killProcess(android.os.Process.myPid()) }) { Text("Restart App") } + } + }, + dismissButton = { TextButton(onClick = { showResetDialog = false; resetStep = 0 }) { Text("Cancel") } } + ) + } + + Scaffold(topBar = { TopAppBar(title = { Text("Settings") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }) }) { padding -> + Column(modifier = Modifier.fillMaxSize().padding(padding).verticalScroll(rememberScrollState()).padding(16.dp)) { + Text("Personalization", fontWeight = FontWeight.Bold, fontSize = 16.sp) + Spacer(Modifier.height(8.dp)) + Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Column(modifier = Modifier.padding(16.dp)) { + Text("Home Page Title", fontSize = 14.sp) + Spacer(Modifier.height(4.dp)) + var homeTitle by remember { mutableStateOf(context.getSharedPreferences("app_settings", 0).getString("home_title", "Paperstow") ?: "Paperstow") } + OutlinedTextField( + value = homeTitle, + onValueChange = { homeTitle = it }, + label = { Text("Title") }, + singleLine = true, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(8.dp)) + Button(onClick = { context.getSharedPreferences("app_settings", 0).edit().putString("home_title", homeTitle).apply() }, modifier = Modifier.fillMaxWidth()) { Text("Save") } + } + } + + Spacer(Modifier.height(16.dp)) + Text("Privacy", fontWeight = FontWeight.Bold, fontSize = 16.sp) + Spacer(Modifier.height(8.dp)) + Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Column(modifier = Modifier.padding(16.dp)) { + var telemetryEnabled by remember { + mutableStateOf( + context.getSharedPreferences("app_settings", 0).getBoolean("telemetry_enabled", false) || + context.getSharedPreferences("disclaimer_prefs", 0).getBoolean("telemetry_consented", false) + ) + } + ToggleRow("Collect usage telemetry (local only)", telemetryEnabled) { + telemetryEnabled = it + context.getSharedPreferences("app_settings", 0).edit().putBoolean("telemetry_enabled", it).apply() + context.getSharedPreferences("disclaimer_prefs", 0).edit().putBoolean("telemetry_consented", it).apply() + UsageTelemetry.setConsent(it) + } + Spacer(Modifier.height(4.dp)) + Text( + "When enabled, anonymous usage counts stay on this device. Nothing is sent automatically.", + fontSize = 11.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + val privacyUrl = stringResource(R.string.privacy_policy_url) + OutlinedButton( + onClick = { + context.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(privacyUrl))) + }, + modifier = Modifier.fillMaxWidth() + ) { Text("Privacy Policy") } + } + } + + Spacer(Modifier.height(16.dp)) + Text("Appearance", fontWeight = FontWeight.Bold, fontSize = 16.sp) + Spacer(Modifier.height(8.dp)) + Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Column(modifier = Modifier.padding(16.dp)) { + var darkMode by remember { mutableStateOf(context.getSharedPreferences("app_settings", 0).getBoolean("dark_mode", false)) } + ToggleRow("Dark Theme", darkMode) { + darkMode = it + context.getSharedPreferences("app_settings", 0).edit().putBoolean("dark_mode", it).apply() + (context as? android.app.Activity)?.recreate() + } + Spacer(Modifier.height(12.dp)) + var showTips by remember { mutableStateOf(context.getSharedPreferences("app_settings", 0).getBoolean("show_tips", true)) } + ToggleRow("Show tips", showTips) { + showTips = it + context.getSharedPreferences("app_settings", 0).edit().putBoolean("show_tips", it).apply() + } + Spacer(Modifier.height(4.dp)) + Text("Home walkthrough cards. Hide tips on Home remembers this.", fontSize = 11.sp, color = colors.onSurfaceVariant) + } + } + + Spacer(Modifier.height(16.dp)) + Text("Search index", fontWeight = FontWeight.Bold, fontSize = 16.sp) + Spacer(Modifier.height(8.dp)) + Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Column(modifier = Modifier.padding(16.dp)) { + Text( + "Rebuild reads each paper on this phone, extracts page text (ML Kit for photos and PDFs), and keeps it for Search. Nothing is uploaded.", + fontSize = 12.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + Button( + onClick = { indexViewModel.rebuild() }, + enabled = !index.running, + modifier = Modifier.fillMaxWidth() + ) { Text(if (index.running) "Rebuilding…" else "Rebuild search index") } + if (index.running || index.done || index.error != null) { + Spacer(Modifier.height(12.dp)) + if (index.total > 0) { + LinearProgressIndicator( + progress = { index.current.toFloat() / index.total.coerceAtLeast(1) }, + modifier = Modifier.fillMaxWidth() + ) + Spacer(Modifier.height(6.dp)) + Text("${index.current} / ${index.total} ${index.fileName}", fontSize = 12.sp) + } + if (index.error != null) { + Text(index.error!!, fontSize = 12.sp, color = colors.error) + } else if (index.done && !index.running) { + Text("Index rebuilt.", fontSize = 12.sp, color = colors.primary) + } + if (index.excerpt.isNotBlank()) { + Spacer(Modifier.height(8.dp)) + Text("Extracted text", fontSize = 12.sp, fontWeight = FontWeight.SemiBold) + Text( + index.excerpt.take(2000), + fontSize = 11.sp, + fontFamily = FontFamily.Monospace, + color = colors.onSurfaceVariant + ) + } + } + } + } + + Spacer(Modifier.height(16.dp)) + Text("Danger zone", fontWeight = FontWeight.Bold, fontSize = 16.sp, color = Color(0xFFF44336)) + Spacer(Modifier.height(8.dp)) + Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = colors.surfaceVariant)) { + Column(modifier = Modifier.padding(16.dp)) { + Text("Reset App", fontSize = 14.sp, fontWeight = FontWeight.SemiBold) + Spacer(Modifier.height(4.dp)) + Text( + "Permanently deletes papers, tags, settings, and My Trail on this phone. This cannot be undone.", + fontSize = 12.sp, + color = colors.onSurfaceVariant + ) + Spacer(Modifier.height(12.dp)) + Button( + onClick = { resetStep = 0; resetReport = ""; showResetDialog = true }, + modifier = Modifier.fillMaxWidth(), + colors = ButtonDefaults.buttonColors(containerColor = Color(0xFFF44336)) + ) { Text("Reset App") } + } + } + } + } +} + +@Composable +private fun ToggleRow(label: String, checked: Boolean, onChanged: (Boolean) -> Unit) { + Row(modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically) { + Text(label, modifier = Modifier.weight(1f), fontSize = 14.sp) + Switch(checked = checked, onCheckedChange = onChanged) + } +} diff --git a/app/src/main/java/com/app/traveldocs/presentation/tags/TagManagementScreen.kt b/app/src/main/java/com/app/paperstow/presentation/tags/TagManagementScreen.kt similarity index 66% rename from app/src/main/java/com/app/traveldocs/presentation/tags/TagManagementScreen.kt rename to app/src/main/java/com/app/paperstow/presentation/tags/TagManagementScreen.kt index ca40688..fead924 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/tags/TagManagementScreen.kt +++ b/app/src/main/java/com/app/paperstow/presentation/tags/TagManagementScreen.kt @@ -1,10 +1,10 @@ -package com.app.traveldocs.presentation.tags +package com.app.paperstow.presentation.tags +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer @@ -22,8 +22,11 @@ import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Edit +import androidx.compose.material.icons.filled.Image import androidx.compose.material.icons.filled.Label +import androidx.compose.material.icons.filled.Refresh import androidx.compose.material.icons.filled.SortByAlpha +import androidx.compose.material.icons.filled.Visibility import androidx.compose.material3.AlertDialog import androidx.compose.material3.Badge import androidx.compose.material3.Card @@ -33,21 +36,22 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Scaffold +import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.key import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.foundation.layout.FlowRow import androidx.compose.ui.graphics.Color -import com.app.traveldocs.data.local.TagColorStore +import com.app.paperstow.data.local.TagColorStore import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.compose.ui.platform.LocalContext @@ -56,7 +60,11 @@ import androidx.hilt.navigation.compose.hiltViewModel @OptIn(ExperimentalMaterial3Api::class) @Composable -fun TagManagementScreen(onBack: () -> Unit, viewModel: TagManagementViewModel = hiltViewModel()) { +fun TagManagementScreen( + onBack: () -> Unit, + onViewDocs: (String) -> Unit = {}, + viewModel: TagManagementViewModel = hiltViewModel() +) { val tags by viewModel.tags.collectAsState() val sortByCount by viewModel.sortByCount.collectAsState() var showCreateDialog by remember { mutableStateOf(false) } @@ -127,6 +135,9 @@ fun TagManagementScreen(onBack: () -> Unit, viewModel: TagManagementViewModel = title = { Text("Manage Tags") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.Filled.ArrowBack, "Back") } }, actions = { + IconButton(onClick = { viewModel.refresh() }) { + Icon(Icons.Filled.Refresh, "Refresh tags") + } IconButton(onClick = { viewModel.toggleSort() }) { Icon(Icons.Filled.SortByAlpha, "Sort", tint = if (sortByCount) Color(0xFF1565C0) else Color.Gray) } @@ -148,10 +159,16 @@ fun TagManagementScreen(onBack: () -> Unit, viewModel: TagManagementViewModel = } else { LazyColumn(modifier = Modifier.fillMaxSize().padding(padding).padding(horizontal = 16.dp)) { item { - Text("${tags.size} tags (sorted ${if (sortByCount) "by usage" else "alphabetically"})", fontSize = 12.sp, color = Color.Gray, modifier = Modifier.padding(vertical = 8.dp)) + Text("${tags.size} tags (sorted ${if (sortByCount) "by usage" else "alphabetically"}). Turn Home off to hide a folder on the start screen.", fontSize = 12.sp, color = Color.Gray, modifier = Modifier.padding(vertical = 8.dp)) } - items(tags) { tag -> - TagListItem(tag = tag, onRename = { tagToRename = tag }, onDelete = { tagToDelete = tag }) + items(tags, key = { it.name }) { tag -> + TagListItem( + tag = tag, + onRename = { tagToRename = tag }, + onDelete = { tagToDelete = tag }, + onViewDocs = { onViewDocs(tag.name) }, + onShowOnHome = { viewModel.setShowOnHome(tag.name, it) } + ) Spacer(Modifier.height(6.dp)) } } @@ -159,60 +176,76 @@ fun TagManagementScreen(onBack: () -> Unit, viewModel: TagManagementViewModel = } } -@OptIn(ExperimentalLayoutApi::class) @Composable -private fun TagListItem(tag: TagInfo, onRename: () -> Unit, onDelete: () -> Unit) { +private fun TagListItem( + tag: TagInfo, + onRename: () -> Unit, + onDelete: () -> Unit, + onViewDocs: () -> Unit, + onShowOnHome: (Boolean) -> Unit +) { val context = LocalContext.current - val colorStore = remember { com.app.traveldocs.data.local.TagColorStore(context) } - var showColorPicker by remember { mutableStateOf(false) } - var currentColor by remember { mutableStateOf(Color(colorStore.getColor(tag.name))) } + val colorStore = remember { TagColorStore(context) } + var showPhotoDialog by remember { mutableStateOf(false) } + var askPhotoConsent by remember { mutableStateOf(false) } + var lookTick by remember { mutableIntStateOf(0) } + + val photoPicker = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri -> + if (uri != null && colorStore.saveImage(tag.name, uri)) lookTick++ + } + + if (askPhotoConsent) { + AlertDialog( + onDismissRequest = { askPhotoConsent = false }, + title = { Text("Use a photo?") }, + text = { Text("This picture stays on this phone and is only used as the folder image for “${tag.name}”.", fontSize = 14.sp) }, + confirmButton = { + TextButton(onClick = { askPhotoConsent = false; photoPicker.launch("image/*") }) { Text("Choose photo") } + }, + dismissButton = { TextButton(onClick = { askPhotoConsent = false }) { Text("Cancel") } } + ) + } - if (showColorPicker) { + if (showPhotoDialog) { AlertDialog( - onDismissRequest = { showColorPicker = false }, - title = { Text("Pick color for \"${tag.name}\"") }, + onDismissRequest = { showPhotoDialog = false }, + title = { Text("Folder image for “${tag.name}”") }, text = { - // Simple palette grid - FlowRow( - horizontalArrangement = Arrangement.spacedBy(8.dp), - modifier = Modifier.fillMaxWidth() - ) { - TagColorStore.PALETTE.forEach { colorInt -> - val c = Color(colorInt) - Box( - modifier = Modifier - .size(40.dp) - .padding(4.dp) - .background(c, shape = RoundedCornerShape(8.dp)) - .clickable { - colorStore.setColor(tag.name, colorInt) - currentColor = c - showColorPicker = false - } - ) + Column { + Text("A photo fills this tag’s folder on Home. It stays on this phone.", fontSize = 13.sp, color = Color.Gray) + Spacer(Modifier.height(8.dp)) + TextButton(onClick = { showPhotoDialog = false; askPhotoConsent = true }) { + Icon(Icons.Filled.Image, null, Modifier.size(18.dp)) + Spacer(Modifier.width(6.dp)) + Text("Choose photo") } + TextButton(onClick = { + colorStore.clearImage(tag.name) + lookTick++ + showPhotoDialog = false + }) { Text("Remove photo") } } }, - confirmButton = { TextButton(onClick = { showColorPicker = false }) { Text("Cancel") } } + confirmButton = { TextButton(onClick = { showPhotoDialog = false }) { Text("Done") } } ) } Card(modifier = Modifier.fillMaxWidth(), shape = RoundedCornerShape(10.dp), elevation = CardDefaults.cardElevation(defaultElevation = 1.dp)) { Row(modifier = Modifier.fillMaxWidth().padding(12.dp), verticalAlignment = Alignment.CenterVertically) { - // Tap the color circle to change tag color - Box( - modifier = Modifier - .size(24.dp) - .background(currentColor, shape = RoundedCornerShape(12.dp)) - .clickable { showColorPicker = true } - ) + Box(Modifier.clickable { showPhotoDialog = true }) { + key(lookTick) { TagMark(tag.name, colorStore, size = 36.dp) } + } Spacer(Modifier.width(12.dp)) Column(modifier = Modifier.weight(1f)) { Text(tag.name, fontWeight = FontWeight.Medium, fontSize = 14.sp) - Text(if (tag.isAutoGenerated) "Auto-generated" else "Custom", fontSize = 11.sp, color = Color.Gray) + Text("Tap the mark to set a folder photo", fontSize = 11.sp, color = Color.Gray) + Row(verticalAlignment = Alignment.CenterVertically) { + Text("Home", fontSize = 12.sp, color = Color.Gray, modifier = Modifier.padding(end = 6.dp)) + Switch(checked = tag.showOnHome, onCheckedChange = onShowOnHome) + } } Badge(containerColor = Color(0xFFE3F2FD)) { Text("${tag.usageCount}", fontSize = 11.sp) } - Spacer(Modifier.width(8.dp)) + IconButton(onClick = onViewDocs, modifier = Modifier.size(32.dp)) { Icon(Icons.Filled.Visibility, "View documents", tint = Color(0xFF1565C0), modifier = Modifier.size(20.dp)) } IconButton(onClick = onRename, modifier = Modifier.size(32.dp)) { Icon(Icons.Filled.Edit, "Rename", tint = Color(0xFF757575), modifier = Modifier.size(18.dp)) } IconButton(onClick = onDelete, modifier = Modifier.size(32.dp)) { Icon(Icons.Filled.Delete, "Delete", tint = Color(0xFFBDBDBD), modifier = Modifier.size(18.dp)) } } diff --git a/app/src/main/java/com/app/traveldocs/presentation/tags/TagManagementViewModel.kt b/app/src/main/java/com/app/paperstow/presentation/tags/TagManagementViewModel.kt similarity index 71% rename from app/src/main/java/com/app/traveldocs/presentation/tags/TagManagementViewModel.kt rename to app/src/main/java/com/app/paperstow/presentation/tags/TagManagementViewModel.kt index cc36511..3905370 100644 --- a/app/src/main/java/com/app/traveldocs/presentation/tags/TagManagementViewModel.kt +++ b/app/src/main/java/com/app/paperstow/presentation/tags/TagManagementViewModel.kt @@ -1,9 +1,9 @@ -package com.app.traveldocs.presentation.tags +package com.app.paperstow.presentation.tags import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.app.traveldocs.data.local.TagRepositoryImpl -import com.app.traveldocs.debug.DebugLogger +import com.app.paperstow.data.local.TagRepositoryImpl +import com.app.paperstow.debug.DebugLogger import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow @@ -11,11 +11,17 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject -data class TagInfo(val name: String, val usageCount: Int, val isAutoGenerated: Boolean) +data class TagInfo( + val name: String, + val usageCount: Int, + val isAutoGenerated: Boolean, + val showOnHome: Boolean = true +) @HiltViewModel class TagManagementViewModel @Inject constructor( - private val tagRepository: TagRepositoryImpl + private val tagRepository: TagRepositoryImpl, + private val tagLooks: com.app.paperstow.data.local.TagColorStore ) : ViewModel() { private val _tags = MutableStateFlow>(emptyList()) @@ -33,22 +39,21 @@ class TagManagementViewModel @Inject constructor( val allTags = tagRepository.getAllTags(memberId).filter { !it.name.startsWith("__") } val tagInfos = allTags.map { tag -> val count = tagRepository.getTagUsageCount(memberId, tag.name) - TagInfo(tag.name, count, tag.isAutoGenerated) + TagInfo(tag.name, count, tag.isAutoGenerated, tagLooks.isShownOnHome(tag.name)) } _tags.value = if (_sortByCount.value) tagInfos.sortedByDescending { it.usageCount } else tagInfos.sortedBy { it.name } DebugLogger.d("TagMgmt", "Loaded ${tagInfos.size} tags") } } + fun refresh() = loadTags() + fun createTag(name: String) { if (name.isBlank()) return viewModelScope.launch { DebugLogger.i("TagMgmt", "Creating tag: '$name'") - // Creating a tag without a document — we'll add it to a placeholder - // Actually tags only exist when associated with documents in our schema - // So "create" here means it's ready for use but not yet assigned - // For now we log it and reload — it will appear when assigned - DebugLogger.d("TagMgmt", "Tag '$name' created (will appear when assigned to a document)") + val result = tagRepository.createStandaloneTag(memberId, name.trim()) + result.onFailure { DebugLogger.e("TagMgmt", "Create tag failed: ${it.message}") } loadTags() } } @@ -58,6 +63,7 @@ class TagManagementViewModel @Inject constructor( viewModelScope.launch { DebugLogger.i("TagMgmt", "Renaming tag '$oldName' -> '$newName'") tagRepository.renameTag(memberId, oldName, newName) + tagLooks.renameLook(oldName, newName) loadTags() } } @@ -66,6 +72,7 @@ class TagManagementViewModel @Inject constructor( viewModelScope.launch { DebugLogger.w("TagMgmt", "Deleting tag '$tagName' globally") tagRepository.deleteTagGlobally(memberId, tagName) + tagLooks.clearLook(tagName) loadTags() } } @@ -77,6 +84,11 @@ class TagManagementViewModel @Inject constructor( } } + fun setShowOnHome(tagName: String, shown: Boolean) { + tagLooks.setShownOnHome(tagName, shown) + _tags.value = _tags.value.map { if (it.name == tagName) it.copy(showOnHome = shown) else it } + } + fun toggleSort() { _sortByCount.value = !_sortByCount.value val current = _tags.value diff --git a/app/src/main/java/com/app/paperstow/presentation/tags/TagMark.kt b/app/src/main/java/com/app/paperstow/presentation/tags/TagMark.kt new file mode 100644 index 0000000..df713f3 --- /dev/null +++ b/app/src/main/java/com/app/paperstow/presentation/tags/TagMark.kt @@ -0,0 +1,85 @@ +package com.app.paperstow.presentation.tags + +import android.graphics.BitmapFactory +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Folder +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import com.app.paperstow.data.local.TagColorStore + +@Composable +fun TagMark( + tagName: String, + store: TagColorStore, + size: Dp = 32.dp, + rounded: Boolean = true +) { + val image = remember(tagName, store.imageFile(tagName)?.length()) { + store.imageFile(tagName)?.let { BitmapFactory.decodeFile(it.absolutePath) } + } + val shape = if (rounded) CircleShape else RoundedCornerShape(8.dp) + if (image != null) { + Image( + bitmap = image.asImageBitmap(), + contentDescription = tagName, + modifier = Modifier.size(size).clip(shape), + contentScale = ContentScale.Crop + ) + } else { + Box( + Modifier.size(size).clip(shape).background(Color(0xFFE8EEF5)), + contentAlignment = Alignment.Center + ) { + Icon(Icons.Filled.Folder, tagName, tint = Color(0xFF5C6B7A), modifier = Modifier.size(size * 0.55f)) + } + } +} + +/** Full-bleed cover for a folder tile — photo if set, otherwise a folder mark. */ +@Composable +fun TagCover( + tagName: String, + store: TagColorStore, + modifier: Modifier = Modifier, + untagged: Boolean = false +) { + val image = remember(tagName, store.imageFile(tagName)?.length()) { + if (untagged) null else store.imageFile(tagName)?.let { BitmapFactory.decodeFile(it.absolutePath) } + } + + BoxWithConstraints(modifier.fillMaxSize()) { + val icon = minOf(maxWidth, maxHeight) * 0.42f + if (image != null) { + Image( + bitmap = image.asImageBitmap(), + contentDescription = tagName, + modifier = Modifier.fillMaxSize(), + contentScale = ContentScale.Crop + ) + } else { + Box( + Modifier.fillMaxSize().background(Color(0xFFE8EEF5)), + contentAlignment = Alignment.Center + ) { + Icon(Icons.Filled.Folder, tagName, tint = Color(0xFF5C6B7A), modifier = Modifier.size(icon)) + } + } + } +} diff --git a/app/src/main/java/com/app/traveldocs/data/backup/BackupManager.kt b/app/src/main/java/com/app/traveldocs/data/backup/BackupManager.kt deleted file mode 100644 index 06054ca..0000000 --- a/app/src/main/java/com/app/traveldocs/data/backup/BackupManager.kt +++ /dev/null @@ -1,199 +0,0 @@ -package com.app.traveldocs.data.backup - -import android.content.Context -import com.app.traveldocs.BuildConfig -import com.app.traveldocs.debug.DebugLogger -import net.lingala.zip4j.ZipFile -import net.lingala.zip4j.model.ZipParameters -import net.lingala.zip4j.model.enums.AesKeyStrength -import net.lingala.zip4j.model.enums.CompressionLevel -import net.lingala.zip4j.model.enums.CompressionMethod -import net.lingala.zip4j.model.enums.EncryptionMethod -import org.json.JSONArray -import org.json.JSONObject -import java.io.File -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import javax.crypto.Cipher -import javax.crypto.spec.GCMParameterSpec -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class BackupManager @Inject constructor() { - - data class BackupResult(val zipFile: File, val fileCount: Int, val totalBytes: Long) - - /** - * Creates a password-protected ZIP with DECRYPTED document contents. - * The ZIP uses AES-256 encryption with the user's backup PIN. - * Contents inside are plaintext — making the backup transportable to any device. - */ - fun createBackupZip(context: Context, backupPin: String? = null): BackupResult { - DebugLogger.i("Backup", "Creating transportable backup archive...") - val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) - val zipPath = File(context.cacheDir, "backup_$timestamp.zip") - val tempDir = File(context.cacheDir, "backup_staging_$timestamp") - tempDir.mkdirs() - - var fileCount = 0 - var totalBytes = 0L - val fileManifest = JSONArray() - - // 1. Decrypt document files and stage them - val docsDir = File(context.filesDir, "docs") - if (docsDir.exists()) { - docsDir.walkTopDown().filter { it.isFile && it.name.endsWith(".enc") }.forEach { encFile -> - try { - val decrypted = decryptFile(context, encFile) - if (decrypted != null) { - val relativePath = encFile.relativeTo(docsDir).path.replace(".enc", "") - val fileId = encFile.nameWithoutExtension - val outFile = File(tempDir, "docs/$relativePath") - outFile.parentFile?.mkdirs() - - // Check if this doc has a PIN — if so, store PIN-encrypted (portable) - val pinPrefs = context.getSharedPreferences("secure_doc_pins", 0) - val pinSalt = pinPrefs.getString("pin_salt_$fileId", null) - val pinHash = pinPrefs.getString("pin_hash_$fileId", null) - if (pinSalt != null && pinHash != null) { - // Store as PIN-encrypted: the file can only be opened with the original PIN - // We re-encrypt with a key derived from a known marker + salt - // Actually just store plaintext — the PIN verification is in the prefs - // The prefs (hash+salt) will be stored in a separate backup metadata file - outFile.writeBytes(decrypted) - // Store PIN metadata for this file - val pinMetaFile = File(tempDir, "pin_metadata/$fileId.json") - pinMetaFile.parentFile?.mkdirs() - pinMetaFile.writeText(org.json.JSONObject().apply { - put("fileId", fileId) - put("pinHash", pinHash) - put("pinSalt", pinSalt) - put("pinSetTime", pinPrefs.getLong("pin_set_time_$fileId", 0)) - }.toString(2)) - } else { - outFile.writeBytes(decrypted) - } - - fileCount++ - totalBytes += decrypted.size - // Compute SHA-256 hash for integrity verification - val hash = java.security.MessageDigest.getInstance("SHA-256") - .digest(decrypted).joinToString("") { "%02x".format(it) } - // Get document metadata from DB for tags and PIN info - val docTags = try { - val db = context.getDatabasePath("traveldocs.db") - // Tags will be captured from the database copy - emptyList() - } catch (_: Exception) { emptyList() } - val hasPinSet = context.getSharedPreferences("secure_doc_pins", 0) - .contains("pin_hash_$fileId") - - fileManifest.put(JSONObject().apply { - put("path", "docs/$relativePath") - put("size", decrypted.size) - put("sha256", hash) - put("hasPinProtection", hasPinSet) - put("originalFileId", fileId) - }) - } - } catch (e: Exception) { - DebugLogger.e("Backup", "Failed to decrypt ${encFile.name}", e) - } - } - } - - // 2. Export database (checkpoint WAL first to ensure all data is in main file) - val dbFile = context.getDatabasePath("traveldocs.db") - if (dbFile.exists()) { - try { - val checkpointDb = android.database.sqlite.SQLiteDatabase.openDatabase(dbFile.path, null, android.database.sqlite.SQLiteDatabase.OPEN_READWRITE) - checkpointDb.rawQuery("PRAGMA wal_checkpoint(TRUNCATE)", null).close() - checkpointDb.close() - DebugLogger.i("Backup", "WAL checkpoint complete — DB consistent for backup") - } catch (e: Exception) { - DebugLogger.w("Backup", "WAL checkpoint before backup failed: ${e.message}") - } - val destDb = File(tempDir, "database/traveldocs.db") - destDb.parentFile?.mkdirs() - dbFile.copyTo(destDb, overwrite = true) - fileCount++ - totalBytes += dbFile.length() - } - - // 3. Write manifest with schema, hashes, tags, and PIN status - val manifest = JSONObject().apply { - put("schemaVersion", 2) - put("timestamp", timestamp) - put("appVersion", BuildConfig.VERSION_NAME) - put("fileCount", fileCount) - put("totalSizeBytes", totalBytes) - put("encrypted", backupPin != null) - put("transportable", true) - put("files", fileManifest) - } - File(tempDir, "manifest.json").writeText(manifest.toString(2)) - - // 4. Create ZIP (password-protected if PIN provided) - if (backupPin != null && backupPin.length >= 4) { - val zipFile = ZipFile(zipPath, backupPin.toCharArray()) - val params = ZipParameters().apply { - compressionMethod = CompressionMethod.DEFLATE - compressionLevel = CompressionLevel.NORMAL - isEncryptFiles = true - encryptionMethod = EncryptionMethod.AES - aesKeyStrength = AesKeyStrength.KEY_STRENGTH_256 - } - tempDir.walkTopDown().filter { it.isFile }.forEach { file -> - val entryName = file.relativeTo(tempDir).path - params.fileNameInZip = entryName - zipFile.addFile(file, params) - } - } else { - // No password — plain ZIP - val zipFile = ZipFile(zipPath) - tempDir.walkTopDown().filter { it.isFile }.forEach { file -> - val entryName = file.relativeTo(tempDir).path - val params = ZipParameters().apply { fileNameInZip = entryName } - zipFile.addFile(file, params) - } - } - - // 5. Cleanup staging - tempDir.deleteRecursively() - - DebugLogger.i("Backup", "Backup created: ${zipPath.name}, $fileCount files, ${totalBytes / 1024}KB, protected=${backupPin != null}") - return BackupResult(zipPath, fileCount, totalBytes) - } - - /** - * Decrypt a .enc file using the same key from Android KeyStore. - */ - private fun decryptFile(context: Context, encFile: File): ByteArray? { - return try { - val encData = encFile.readBytes() - if (encData.size <= 12) return null - val iv = encData.copyOfRange(0, 12) - val ciphertext = encData.copyOfRange(12, encData.size) - - val keyStore = java.security.KeyStore.getInstance("AndroidKeyStore") - keyStore.load(null) - val key = (keyStore.getEntry("travel_docs_file_encryption_key", null) as java.security.KeyStore.SecretKeyEntry).secretKey - - val cipher = Cipher.getInstance("AES/GCM/NoPadding") - cipher.init(Cipher.DECRYPT_MODE, key, GCMParameterSpec(128, iv)) - cipher.doFinal(ciphertext) - } catch (e: Exception) { - DebugLogger.e("Backup", "Decrypt failed: ${encFile.name}", e) - null - } - } - - fun suggestedFolderName(): String = "TravelDocs_Backup" - - fun suggestedFileName(): String { - val ts = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) - return "traveldocs_backup_$ts.zip" - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/backup/DriveBackupUploader.kt b/app/src/main/java/com/app/traveldocs/data/backup/DriveBackupUploader.kt deleted file mode 100644 index dc1c906..0000000 --- a/app/src/main/java/com/app/traveldocs/data/backup/DriveBackupUploader.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.app.traveldocs.data.backup - -import android.content.Context -import com.app.traveldocs.data.drive.DriveServiceProvider -import com.app.traveldocs.debug.DebugLogger -import com.google.api.client.http.FileContent -import com.google.api.services.drive.model.File as DriveFile -import java.io.File -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class DriveBackupUploader @Inject constructor( - private val driveServiceProvider: DriveServiceProvider -) { - fun upload(context: Context, zipFile: File, fileName: String): Result { - return try { - val service = driveServiceProvider.getDriveService() - ?: return Result.failure(Exception("Google Drive not authenticated. Please sign in to Google in device settings.")) - - DebugLogger.i("DriveBackup", "Uploading $fileName (${zipFile.length() / 1024}KB) to Drive...") - - val metadata = DriveFile().apply { - name = fileName - mimeType = "application/zip" - parents = listOf("appDataFolder") - } - - val content = FileContent("application/zip", zipFile) - val uploaded = service.files().create(metadata, content) - .setFields("id,name,size") - .execute() - - DebugLogger.i("DriveBackup", "Upload complete: id=${uploaded.id}, name=${uploaded.name}") - Result.success("Uploaded to Google Drive: ${uploaded.name}") - } catch (e: Exception) { - DebugLogger.e("DriveBackup", "Upload failed", e) - Result.failure(Exception("Drive upload failed: ${e.message}")) - } - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/backup/S3BackupUploader.kt b/app/src/main/java/com/app/traveldocs/data/backup/S3BackupUploader.kt deleted file mode 100644 index 95e989c..0000000 --- a/app/src/main/java/com/app/traveldocs/data/backup/S3BackupUploader.kt +++ /dev/null @@ -1,57 +0,0 @@ -package com.app.traveldocs.data.backup - -import com.app.traveldocs.debug.DebugLogger -import java.io.File -import java.net.HttpURLConnection -import java.net.URL -import java.security.MessageDigest -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.TimeZone -import javax.crypto.Mac -import javax.crypto.spec.SecretKeySpec - -data class S3Config(val endpoint: String, val bucket: String, val accessKey: String, val secretKey: String, val region: String = "us-east-1") - -object S3BackupUploader { - fun upload(zipFile: File, fileName: String, config: S3Config): Result { - return try { - DebugLogger.i("S3Backup", "Uploading $fileName (${zipFile.length()/1024}KB) to ${config.endpoint}/${config.bucket}") - val bytes = zipFile.readBytes() - val contentHash = sha256Hex(bytes) - val now = Date() - val dateStamp = SimpleDateFormat("yyyyMMdd", Locale.US).apply { timeZone = TimeZone.getTimeZone("UTC") }.format(now) - val amzDate = SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.US).apply { timeZone = TimeZone.getTimeZone("UTC") }.format(now) - val host = URL(config.endpoint).host - val path = "/${config.bucket}/$fileName" - val url = "${config.endpoint}$path" - val headers = "content-type:application/zip\nhost:$host\nx-amz-content-sha256:$contentHash\nx-amz-date:$amzDate\n" - val signedHeaders = "content-type;host;x-amz-content-sha256;x-amz-date" - val canonical = "PUT\n$path\n\n$headers\n$signedHeaders\n$contentHash" - val scope = "$dateStamp/${config.region}/s3/aws4_request" - val stringToSign = "AWS4-HMAC-SHA256\n$amzDate\n$scope\n${sha256Hex(canonical.toByteArray())}" - val kDate = hmac("AWS4${config.secretKey}".toByteArray(), dateStamp) - val kRegion = hmac(kDate, config.region) - val kService = hmac(kRegion, "s3") - val kSigning = hmac(kService, "aws4_request") - val signature = hmac(kSigning, stringToSign).joinToString("") { "%02x".format(it) } - val authorization = "AWS4-HMAC-SHA256 Credential=${config.accessKey}/$scope, SignedHeaders=$signedHeaders, Signature=$signature" - val conn = (URL(url).openConnection() as HttpURLConnection).apply { - requestMethod = "PUT"; doOutput = true - setRequestProperty("Content-Type", "application/zip") - setRequestProperty("Host", host) - setRequestProperty("x-amz-content-sha256", contentHash) - setRequestProperty("x-amz-date", amzDate) - setRequestProperty("Authorization", authorization) - setRequestProperty("Content-Length", bytes.size.toString()) - } - conn.outputStream.use { it.write(bytes) } - val code = conn.responseCode - if (code in 200..299) { DebugLogger.i("S3Backup", "Success: HTTP $code"); Result.success("Uploaded to S3: HTTP $code") } - else { val err = conn.errorStream?.bufferedReader()?.readText() ?: "HTTP $code"; DebugLogger.e("S3Backup", err); Result.failure(Exception(err)) } - } catch (e: Exception) { DebugLogger.e("S3Backup", "Failed", e); Result.failure(e) } - } - private fun sha256Hex(data: ByteArray) = MessageDigest.getInstance("SHA-256").digest(data).joinToString("") { "%02x".format(it) } - private fun hmac(key: ByteArray, data: String): ByteArray { val m = Mac.getInstance("HmacSHA256"); m.init(SecretKeySpec(key, "HmacSHA256")); return m.doFinal(data.toByteArray()) } -} diff --git a/app/src/main/java/com/app/traveldocs/data/drive/DriveServiceProvider.kt b/app/src/main/java/com/app/traveldocs/data/drive/DriveServiceProvider.kt deleted file mode 100644 index a914e2b..0000000 --- a/app/src/main/java/com/app/traveldocs/data/drive/DriveServiceProvider.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.app.traveldocs.data.drive - -import com.google.api.services.drive.Drive - -/** - * Provides an authenticated Google Drive service instance. - * Returns null if the user is not authenticated or credentials are invalid. - */ -interface DriveServiceProvider { - /** - * Returns an authenticated Drive service, or null if authentication is unavailable. - */ - fun getDriveService(): Drive? -} diff --git a/app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveImporter.kt b/app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveImporter.kt deleted file mode 100644 index 30aec24..0000000 --- a/app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveImporter.kt +++ /dev/null @@ -1,179 +0,0 @@ -package com.app.traveldocs.data.drive - -import com.app.traveldocs.debug.DebugLogger -import android.content.ContentResolver -import android.content.Context -import android.net.Uri -import android.provider.OpenableColumns -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.ImportedDocument -import dagger.hilt.android.qualifiers.ApplicationContext -import java.io.ByteArrayOutputStream -import java.io.IOException -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Handles importing documents from Google Drive or local content URIs. - * - * For content URIs (from Drive Picker activity results), uses ContentResolver to read bytes directly. - * For Drive file IDs, uses the Drive REST API to download the file. - */ -@Singleton -class GoogleDriveImporter @Inject constructor( - @ApplicationContext private val context: Context, - private val driveServiceProvider: DriveServiceProvider -) { - - /** - * Imports a document from a content URI (e.g., from Google Drive Picker result). - * Reads the file content, determines format, and returns an ImportedDocument. - */ - suspend fun importFromUri(uri: Uri): Result { - DebugLogger.i("Drive", "importFromUri: uri=$uri") - return try { - val contentResolver = context.contentResolver - - val mimeType = contentResolver.getType(uri) - val fileName = getFileName(contentResolver, uri) - val format = resolveFormatFromMimeType(mimeType) - ?: resolveFormatFromFileName(fileName) - ?: return Result.failure( - IOException( - "Unsupported document format. Only PDF, JPG, and PNG files are supported. MIME type: $mimeType" - ) - ) - - val rawBytes = readBytesFromUri(contentResolver, uri) - - Result.success( - ImportedDocument( - rawBytes = rawBytes, - format = format, - originalFileName = fileName - ) - ) - } catch (e: IOException) { - Result.failure( - IOException( - "Failed to import document: ${e.message}. Please check your network connection and try again.", - e - ) - ) - } catch (e: SecurityException) { - Result.failure( - IOException( - "Access denied. Please re-authorize Google Drive access and try again.", - e - ) - ) - } catch (e: Exception) { - Result.failure( - IOException( - "An unexpected error occurred during document import: ${e.message}", - e - ) - ) - } - } - - /** - * Imports a document from Google Drive using a file ID. - * Uses the Drive REST API to download the file content. - */ - suspend fun importFromDriveFileId(fileId: String): Result { - DebugLogger.i("Drive", "importFromDriveFileId: fileId=$fileId") - return try { - val driveService = driveServiceProvider.getDriveService() - ?: return Result.failure( - IOException( - "Google Drive authentication failed. Please sign in to Google Drive and try again." - ) - ) - - val file = driveService.files().get(fileId) - .setFields("name,mimeType") - .execute() - - val mimeType = file.mimeType - val fileName = file.name - val format = resolveFormatFromMimeType(mimeType) - ?: resolveFormatFromFileName(fileName) - ?: return Result.failure( - IOException( - "Unsupported document format. Only PDF, JPG, and PNG files are supported. File: $fileName, MIME type: $mimeType" - ) - ) - - val outputStream = ByteArrayOutputStream() - driveService.files().get(fileId).executeMediaAndDownloadTo(outputStream) - val rawBytes = outputStream.toByteArray() - - Result.success( - ImportedDocument( - rawBytes = rawBytes, - format = format, - originalFileName = fileName - ) - ) - } catch (e: IOException) { - Result.failure( - IOException( - "Failed to download file from Google Drive: ${e.message}. Please check your network connection and try again.", - e - ) - ) - } catch (e: SecurityException) { - Result.failure( - IOException( - "Google Drive access denied. Please re-authorize and try again.", - e - ) - ) - } catch (e: Exception) { - Result.failure( - IOException( - "An unexpected error occurred while downloading from Google Drive: ${e.message}", - e - ) - ) - } - } - - private fun readBytesFromUri(contentResolver: ContentResolver, uri: Uri): ByteArray { - return contentResolver.openInputStream(uri)?.use { inputStream -> - inputStream.readBytes() - } ?: throw IOException("Unable to open document. The file may have been moved or deleted.") - } - - private fun getFileName(contentResolver: ContentResolver, uri: Uri): String? { - var name: String? = null - contentResolver.query(uri, null, null, null, null)?.use { cursor -> - val nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME) - if (nameIndex >= 0 && cursor.moveToFirst()) { - name = cursor.getString(nameIndex) - } - } - return name - } - - internal fun resolveFormatFromMimeType(mimeType: String?): DocumentFormat? { - return when (mimeType?.lowercase()) { - "application/pdf" -> DocumentFormat.PDF - "image/jpeg", "image/jpg" -> DocumentFormat.JPG - "image/png" -> DocumentFormat.PNG - else -> null - } - } - - internal fun resolveFormatFromFileName(fileName: String?): DocumentFormat? { - if (fileName == null) return null - val extension = fileName.substringAfterLast('.', "").lowercase() - return when (extension) { - "pdf" -> DocumentFormat.PDF - "jpg", "jpeg" -> DocumentFormat.JPG - "png" -> DocumentFormat.PNG - else -> null - } - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveServiceProvider.kt b/app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveServiceProvider.kt deleted file mode 100644 index 55875d8..0000000 --- a/app/src/main/java/com/app/traveldocs/data/drive/GoogleDriveServiceProvider.kt +++ /dev/null @@ -1,40 +0,0 @@ -package com.app.traveldocs.data.drive - -import android.content.Context -import com.google.android.gms.auth.api.signin.GoogleSignIn -import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential -import com.google.api.client.http.javanet.NetHttpTransport -import com.google.api.client.json.gson.GsonFactory -import com.google.api.services.drive.Drive -import com.google.api.services.drive.DriveScopes -import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Provides an authenticated Google Drive service using the currently signed-in Google account. - * Returns null if no Google account is signed in. - */ -@Singleton -class GoogleDriveServiceProvider @Inject constructor( - @ApplicationContext private val context: Context -) : DriveServiceProvider { - - override fun getDriveService(): Drive? { - val account = GoogleSignIn.getLastSignedInAccount(context) ?: return null - - val credential = GoogleAccountCredential.usingOAuth2( - context, - listOf(DriveScopes.DRIVE_READONLY) - ) - credential.selectedAccount = account.account ?: return null - - return Drive.Builder( - NetHttpTransport(), - GsonFactory.getDefaultInstance(), - credential - ) - .setApplicationName("TravelDocs") - .build() - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/local/FeatureFlags.kt b/app/src/main/java/com/app/traveldocs/data/local/FeatureFlags.kt deleted file mode 100644 index 6763a10..0000000 --- a/app/src/main/java/com/app/traveldocs/data/local/FeatureFlags.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.app.traveldocs.data.local - -import android.content.Context - -/** - * Simple SharedPreferences-backed feature flags. - * - * No server, no remote config, no complexity. Toggle in Settings, persists across restarts. - * All flags default to OFF — users only see stable features until they explicitly opt in. - * - * Why not a proper feature flag service? Because this app has no backend. - * The whole point is zero network dependency for core functionality. - */ -object FeatureFlags { - private const val PREFS = "feature_flags" - - fun isExperimentalEnabled(context: Context) = prefs(context).getBoolean("experimental", false) - fun isGoogleDriveEnabled(context: Context) = prefs(context).getBoolean("google_drive", false) - fun isS3Enabled(context: Context) = prefs(context).getBoolean("s3_storage", false) - fun isGpsTrackingEnabled(context: Context) = prefs(context).getBoolean("gps_tracking", false) - fun setGpsTracking(context: Context, v: Boolean) = prefs(context).edit().putBoolean("gps_tracking", v).apply() - - fun isBackupRestoreEnabled(context: Context) = prefs(context).getBoolean("backup_restore", false) - fun isWifiShareEnabled(context: Context) = prefs(context).getBoolean("wifi_share", false) - fun setWifiShare(context: Context, v: Boolean) = prefs(context).edit().putBoolean("wifi_share", v).apply() - - fun isAudioPlaybackEnabled(context: Context) = prefs(context).getBoolean("audio_playback", false) - fun setAudioPlayback(context: Context, v: Boolean) = prefs(context).edit().putBoolean("audio_playback", v).apply() - - fun isExtendedFormatsEnabled(context: Context) = prefs(context).getBoolean("extended_formats", false) - fun setExtendedFormats(context: Context, v: Boolean) = prefs(context).edit().putBoolean("extended_formats", v).apply() - - fun setExperimental(context: Context, v: Boolean) = prefs(context).edit().putBoolean("experimental", v).apply() - fun setGoogleDrive(context: Context, v: Boolean) = prefs(context).edit().putBoolean("google_drive", v).apply() - fun setS3(context: Context, v: Boolean) = prefs(context).edit().putBoolean("s3_storage", v).apply() - fun setBackupRestore(context: Context, v: Boolean) = prefs(context).edit().putBoolean("backup_restore", v).apply() - - /** - * Per-format toggles. Each extended image format can be individually enabled/disabled. - * Defaults to ON when extended formats master toggle is enabled. - */ - fun isFormatEnabled(context: Context, format: String) = prefs(context).getBoolean("format_$format", true) - fun setFormatEnabled(context: Context, format: String, v: Boolean) = prefs(context).edit().putBoolean("format_$format", v).apply() - - private fun prefs(context: Context) = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) -} diff --git a/app/src/main/java/com/app/traveldocs/data/local/GpxExporter.kt b/app/src/main/java/com/app/traveldocs/data/local/GpxExporter.kt deleted file mode 100644 index 24b9a18..0000000 --- a/app/src/main/java/com/app/traveldocs/data/local/GpxExporter.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.app.traveldocs.data.local - -import com.app.traveldocs.data.local.entity.GpsTrackEntity -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import java.util.TimeZone - -object GpxExporter { - fun export(tracks: List): String { - val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US) - dateFormat.timeZone = TimeZone.getTimeZone("UTC") - - val sb = StringBuilder() - sb.appendLine("") - sb.appendLine("") - sb.appendLine(" ") - sb.appendLine(" Travel Track") - sb.appendLine(" ") - for (t in tracks) { - val time = dateFormat.format(Date(t.timestamp)) - sb.appendLine(" ") - sb.appendLine(" ") - sb.appendLine(" ${t.accuracy}") - sb.appendLine(" ") - } - sb.appendLine(" ") - sb.appendLine(" ") - sb.appendLine("") - return sb.toString() - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/local/SecureDocumentManager.kt b/app/src/main/java/com/app/traveldocs/data/local/SecureDocumentManager.kt deleted file mode 100644 index e02b87a..0000000 --- a/app/src/main/java/com/app/traveldocs/data/local/SecureDocumentManager.kt +++ /dev/null @@ -1,169 +0,0 @@ -package com.app.traveldocs.data.local - -import android.content.Context -import com.app.traveldocs.debug.DebugLogger -import java.security.MessageDigest -import javax.crypto.Cipher -import javax.crypto.SecretKeyFactory -import javax.crypto.spec.GCMParameterSpec -import javax.crypto.spec.PBEKeySpec -import javax.crypto.spec.SecretKeySpec -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Per-document PIN protection. - * - * How it works: - * - When user sets a PIN on a document, we derive a key from that PIN using PBKDF2 - * - The document's file bytes are re-encrypted with this PIN-derived key (on top of the - * existing device-level AES-256-GCM encryption) - * - The PIN hash is stored in SharedPreferences so we can verify attempts - * - The actual decryption key exists ONLY when the correct PIN is entered - * - * Important guarantees: - * - Developer cannot recover PIN-protected documents (no backdoor, no master key) - * - If user forgets the PIN, the document is permanently inaccessible - * - This is a privacy feature — user bears full responsibility - * - * Tagged with system tag "__PIN_PROTECTED" for folder grouping on home screen. - */ -@Singleton -class SecureDocumentManager @Inject constructor( - @dagger.hilt.android.qualifiers.ApplicationContext private val context: Context -) { - companion object { - const val SECURE_TAG = "__PIN_PROTECTED" - const val SECURE_FOLDER_DISPLAY_NAME = "Secure Docs" - private const val PREFS_NAME = "secure_doc_pins" - private const val PBKDF2_ITERATIONS = 10000 - private const val KEY_LENGTH_BITS = 256 - private const val GCM_TAG_LENGTH = 128 - } - - private fun prefs() = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE) - - /** - * Check if a document has a PIN set. - */ - fun hasPinSet(documentId: String): Boolean { - return prefs().contains("pin_hash_$documentId") - } - - /** - * Set a PIN on a document. Stores the hash for verification. - * Returns the derived encryption key (caller uses it to re-encrypt the file). - */ - fun setPin(documentId: String, pin: String): ByteArray { - val salt = generateSalt() - val pinHash = hashPin(pin, salt) - prefs().edit() - .putString("pin_hash_$documentId", pinHash) - .putString("pin_salt_$documentId", salt.toHexString()) - .putLong("pin_set_time_$documentId", System.currentTimeMillis()) - .apply() - DebugLogger.i("SecureDoc", "PIN set for document ${documentId.take(8)}...") - return deriveKey(pin, salt) - } - - /** - * Verify a PIN attempt. Returns the derived key if correct, null if wrong. - */ - fun verifyPin(documentId: String, pin: String): ByteArray? { - val storedHash = prefs().getString("pin_hash_$documentId", null) ?: return null - val saltHex = prefs().getString("pin_salt_$documentId", null) ?: return null - val salt = saltHex.hexToByteArray() - val attemptHash = hashPin(pin, salt) - return if (attemptHash == storedHash) { - deriveKey(pin, salt) - } else { - DebugLogger.w("SecureDoc", "PIN verification failed for ${documentId.take(8)}...") - null - } - } - - /** - * Remove PIN protection from a document. - */ - fun removePin(documentId: String) { - prefs().edit() - .remove("pin_hash_$documentId") - .remove("pin_salt_$documentId") - .remove("pin_set_time_$documentId") - .apply() - DebugLogger.i("SecureDoc", "PIN removed for document ${documentId.take(8)}...") - } - - /** - * Get all document IDs that have PINs set. - */ - fun getAllSecuredDocumentIds(): Set { - return prefs().all.keys - .filter { it.startsWith("pin_hash_") } - .map { it.removePrefix("pin_hash_") } - .toSet() - } - - /** - * Encrypt bytes with a PIN-derived key (AES-256-GCM). - */ - fun encryptWithPin(data: ByteArray, pinKey: ByteArray): ByteArray { - val cipher = Cipher.getInstance("AES/GCM/NoPadding") - val keySpec = SecretKeySpec(pinKey, "AES") - cipher.init(Cipher.ENCRYPT_MODE, keySpec) - val iv = cipher.iv // GCM generates a random IV - val encrypted = cipher.doFinal(data) - // Prepend IV (12 bytes) to ciphertext - return iv + encrypted - } - - /** - * Decrypt bytes with a PIN-derived key (AES-256-GCM). - */ - fun decryptWithPin(data: ByteArray, pinKey: ByteArray): ByteArray? { - return try { - if (data.size < 12) return null - val iv = data.copyOfRange(0, 12) - val ciphertext = data.copyOfRange(12, data.size) - val cipher = Cipher.getInstance("AES/GCM/NoPadding") - val keySpec = SecretKeySpec(pinKey, "AES") - val gcmSpec = GCMParameterSpec(GCM_TAG_LENGTH, iv) - cipher.init(Cipher.DECRYPT_MODE, keySpec, gcmSpec) - cipher.doFinal(ciphertext) - } catch (e: Exception) { - DebugLogger.e("SecureDoc", "Decryption failed (wrong PIN or corrupted data)", e) - null - } - } - - // --- Internal crypto helpers --- - - private fun deriveKey(pin: String, salt: ByteArray): ByteArray { - val spec = PBEKeySpec(pin.toCharArray(), salt, PBKDF2_ITERATIONS, KEY_LENGTH_BITS) - val factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256") - return factory.generateSecret(spec).encoded - } - - private fun hashPin(pin: String, salt: ByteArray): String { - val key = deriveKey(pin, salt) - val digest = MessageDigest.getInstance("SHA-256") - return digest.digest(key).toHexString() - } - - private fun generateSalt(): ByteArray { - val salt = ByteArray(16) - java.security.SecureRandom().nextBytes(salt) - return salt - } - - private fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) } - - private fun String.hexToByteArray(): ByteArray { - val len = length - val data = ByteArray(len / 2) - for (i in 0 until len step 2) { - data[i / 2] = ((Character.digit(this[i], 16) shl 4) + Character.digit(this[i + 1], 16)).toByte() - } - return data - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/local/TagColorStore.kt b/app/src/main/java/com/app/traveldocs/data/local/TagColorStore.kt deleted file mode 100644 index 48dde53..0000000 --- a/app/src/main/java/com/app/traveldocs/data/local/TagColorStore.kt +++ /dev/null @@ -1,64 +0,0 @@ -package com.app.traveldocs.data.local - -import android.content.Context -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Stores tag-to-color mappings in SharedPreferences. - * - * Colors are stored as ARGB hex integers (e.g., 0xFFE3F2FD). - * Each tag can have its own color for visual differentiation in the UI. - * If no color is set, a default palette color is derived from the tag name hash. - */ -@Singleton -class TagColorStore @Inject constructor( - @dagger.hilt.android.qualifiers.ApplicationContext private val context: Context -) { - companion object { - private const val PREFS = "tag_colors" - - // Predefined palette — visually distinct, accessible on white backgrounds - val PALETTE = listOf( - 0xFFE3F2FD.toInt(), // Light Blue - 0xFFE8F5E9.toInt(), // Light Green - 0xFFFFF3E0.toInt(), // Light Orange - 0xFFFCE4EC.toInt(), // Light Pink - 0xFFEDE7F6.toInt(), // Light Purple - 0xFFFFFDE7.toInt(), // Light Yellow - 0xFFE0F7FA.toInt(), // Light Cyan - 0xFFF3E5F5.toInt(), // Light Lavender - 0xFFEFEBE9.toInt(), // Light Brown - 0xFFE8EAF6.toInt(), // Light Indigo - 0xFFF1F8E9.toInt(), // Lime tint - 0xFFFFF8E1.toInt(), // Amber tint - ) - } - - private fun prefs() = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE) - - /** - * Get the color for a tag. Falls back to a deterministic palette color based on name hash. - */ - fun getColor(tagName: String): Int { - val stored = prefs().getInt("color_$tagName", -1) - if (stored != -1) return stored - // Deterministic fallback from name hash - val idx = (tagName.hashCode().and(0x7FFFFFFF)) % PALETTE.size - return PALETTE[idx] - } - - /** - * Set a specific color for a tag. - */ - fun setColor(tagName: String, color: Int) { - prefs().edit().putInt("color_$tagName", color).apply() - } - - /** - * Remove stored color (revert to auto-derived). - */ - fun clearColor(tagName: String) { - prefs().edit().remove("color_$tagName").apply() - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/local/TravelDocsDatabase.kt b/app/src/main/java/com/app/traveldocs/data/local/TravelDocsDatabase.kt deleted file mode 100644 index 21bf9d0..0000000 --- a/app/src/main/java/com/app/traveldocs/data/local/TravelDocsDatabase.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.app.traveldocs.data.local - -import androidx.room.Database -import androidx.room.RoomDatabase -import com.app.traveldocs.data.local.dao.DocumentDao -import com.app.traveldocs.data.local.dao.DocumentMetadataDao -import com.app.traveldocs.data.local.dao.DocumentTagDao -import com.app.traveldocs.data.local.dao.FamilyMemberDao -import com.app.traveldocs.data.local.dao.GpsTrackDao -import com.app.traveldocs.data.local.entity.DocumentEntity -import com.app.traveldocs.data.local.entity.DocumentMetadataEntity -import com.app.traveldocs.data.local.entity.DocumentTagEntity -import com.app.traveldocs.data.local.entity.FamilyMemberEntity -import com.app.traveldocs.data.local.entity.GpsTrackEntity - -@Database( - entities = [ - DocumentEntity::class, - DocumentMetadataEntity::class, - DocumentTagEntity::class, - FamilyMemberEntity::class, - GpsTrackEntity::class - ], - version = 2, - exportSchema = false -) -abstract class TravelDocsDatabase : RoomDatabase() { - abstract fun documentDao(): DocumentDao - abstract fun documentMetadataDao(): DocumentMetadataDao - abstract fun documentTagDao(): DocumentTagDao - abstract fun familyMemberDao(): FamilyMemberDao - abstract fun gpsTrackDao(): GpsTrackDao -} diff --git a/app/src/main/java/com/app/traveldocs/data/local/auth/SecurityAlertService.kt b/app/src/main/java/com/app/traveldocs/data/local/auth/SecurityAlertService.kt deleted file mode 100644 index 3df0a8e..0000000 --- a/app/src/main/java/com/app/traveldocs/data/local/auth/SecurityAlertService.kt +++ /dev/null @@ -1,84 +0,0 @@ -package com.app.traveldocs.data.local.auth - -import android.Manifest -import android.app.NotificationChannel -import android.app.NotificationManager -import android.content.Context -import android.content.pm.PackageManager -import android.location.LocationManager -import android.os.Build -import androidx.core.app.NotificationCompat -import androidx.core.content.ContextCompat -import com.app.traveldocs.debug.DebugLogger -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Handles security alerts on PIN lockout events. - * Instead of sending SMS (which requires SEND_SMS restricted permission), - * we show a local notification and log the event. The user can view - * the alert history in Settings. - * - * We originally used SMS for alerts but Google Play requires a Permissions Declaration Form - * for SEND_SMS and will reject document-manager apps that request it. Local notifications - * accomplish the same thing without the permission headache. - */ -@Singleton -class SecurityAlertService @Inject constructor( - @dagger.hilt.android.qualifiers.ApplicationContext - private val context: Context, - private val securityPreferences: SecurityPreferences -) { - fun onLockoutTriggered() { - if (!securityPreferences.smsAlertsEnabled || !securityPreferences.isConfigured()) { - DebugLogger.w("SecurityAlert", "Alerts disabled or not configured") - return - } - val timestamp = SimpleDateFormat("HH:mm dd-MMM-yyyy", Locale.US).format(Date()) - val location = getLocationString() - val message = "Document Manager alert: PIN failed 3 times at $timestamp. $location" - showSecurityNotification(message) - securityPreferences.lastAlertTime = System.currentTimeMillis() - DebugLogger.i("SecurityAlert", "Lockout alert dispatched at $timestamp") - } - - private fun showSecurityNotification(message: String) { - try { - val channelId = "security_alerts" - val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - val channel = NotificationChannel(channelId, "Security Alerts", NotificationManager.IMPORTANCE_HIGH) - channel.description = "Alerts when PIN lockout is triggered" - notificationManager.createNotificationChannel(channel) - } - - val notification = NotificationCompat.Builder(context, channelId) - .setSmallIcon(android.R.drawable.ic_dialog_alert) - .setContentTitle("Security Alert") - .setContentText(message) - .setStyle(NotificationCompat.BigTextStyle().bigText(message)) - .setAutoCancel(true) - .setPriority(NotificationCompat.PRIORITY_HIGH) - .build() - - notificationManager.notify(8888, notification) - DebugLogger.i("SecurityAlert", "Security notification shown") - } catch (e: Exception) { - DebugLogger.e("SecurityAlert", "Failed to show notification", e) - } - } - - @Suppress("MissingPermission") - private fun getLocationString(): String { - return try { - if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) return "Location: n/a" - val lm = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager - val loc = lm.getLastKnownLocation(LocationManager.FUSED_PROVIDER) ?: lm.getLastKnownLocation(LocationManager.GPS_PROVIDER) - if (loc != null) "Location: ${loc.latitude},${loc.longitude}" else "Location: n/a" - } catch (_: Exception) { "Location: n/a" } - } -} diff --git a/app/src/main/java/com/app/traveldocs/data/scanner/CameraDocumentScanner.kt b/app/src/main/java/com/app/traveldocs/data/scanner/CameraDocumentScanner.kt deleted file mode 100644 index 0b40ef2..0000000 --- a/app/src/main/java/com/app/traveldocs/data/scanner/CameraDocumentScanner.kt +++ /dev/null @@ -1,153 +0,0 @@ -package com.app.traveldocs.data.scanner - -import android.content.Context -import android.content.Intent -import android.net.Uri -import com.app.traveldocs.domain.model.DocumentFormat -import com.app.traveldocs.domain.model.ImportedDocument -import com.google.mlkit.vision.documentscanner.GmsDocumentScanner -import com.google.mlkit.vision.documentscanner.GmsDocumentScannerOptions -import com.google.mlkit.vision.documentscanner.GmsDocumentScannerOptions.RESULT_FORMAT_JPEG -import com.google.mlkit.vision.documentscanner.GmsDocumentScannerOptions.SCANNER_MODE_FULL -import com.google.mlkit.vision.documentscanner.GmsDocumentScanning -import com.google.mlkit.vision.documentscanner.GmsDocumentScanningResult -import dagger.hilt.android.qualifiers.ApplicationContext -import java.io.IOException -import javax.inject.Inject -import javax.inject.Singleton - -/** - * Camera-based document scanner that wraps ML Kit's Document Scanner API. - * - * ML Kit Document Scanner provides edge detection, perspective correction, - * and image enhancement automatically. This class configures the scanner - * for single-page document capture in FULL mode and processes results - * into [ImportedDocument] instances. - */ -@Singleton -class CameraDocumentScanner @Inject constructor( - @ApplicationContext private val context: Context -) { - - private val scannerOptions: GmsDocumentScannerOptions = GmsDocumentScannerOptions.Builder() - .setPageLimit(1) - .setGalleryImportAllowed(false) - .setResultFormats(RESULT_FORMAT_JPEG) - .setScannerMode(SCANNER_MODE_FULL) - .build() - - /** - * Creates and returns the ML Kit Document Scanner client configured for - * single-page scanning in FULL mode with JPEG output. - */ - fun getScanner(): GmsDocumentScanner { - return GmsDocumentScanning.getClient(scannerOptions) - } - - /** - * Processes the scanning result from the Activity result callback. - * - * Reads the first scanned page URI and converts it into an [ImportedDocument] - * with raw JPEG bytes. - * - * @param resultCode The Activity result code from the scanner intent - * @param data The Intent data returned from the scanner activity - * @return Result containing the ImportedDocument on success or an error on failure - */ - fun processResult(resultCode: Int, data: Intent?): Result { - return try { - val scanningResult = GmsDocumentScanningResult.fromActivityResultIntent(data) - ?: return Result.failure( - ScannerException("Document scanning was cancelled or returned no result") - ) - - val pages = scanningResult.pages - if (pages.isNullOrEmpty()) { - return Result.failure( - ScannerException("No pages were captured during scanning") - ) - } - - val pageUri = pages[0].imageUri - val rawBytes = readBytesFromUri(pageUri) - - Result.success( - ImportedDocument( - rawBytes = rawBytes, - format = DocumentFormat.JPG, - originalFileName = "scanned_document.jpg" - ) - ) - } catch (e: IOException) { - Result.failure( - ScannerException("Failed to read scanned document: ${e.message}", e) - ) - } catch (e: SecurityException) { - Result.failure( - ScannerException("Permission denied when reading scanned document: ${e.message}", e) - ) - } catch (e: Exception) { - Result.failure( - ScannerException("Unexpected error processing scan result: ${e.message}", e) - ) - } - } - - /** - * Processes a scanning result directly from [GmsDocumentScanningResult]. - * - * @param scanningResult The result object from ML Kit Document Scanner - * @return Result containing the ImportedDocument on success or an error on failure - */ - fun processResult(scanningResult: GmsDocumentScanningResult): Result { - return try { - val pages = scanningResult.pages - if (pages.isNullOrEmpty()) { - return Result.failure( - ScannerException("No pages were captured during scanning") - ) - } - - val pageUri = pages[0].imageUri - val rawBytes = readBytesFromUri(pageUri) - - Result.success( - ImportedDocument( - rawBytes = rawBytes, - format = DocumentFormat.JPG, - originalFileName = "scanned_document.jpg" - ) - ) - } catch (e: IOException) { - Result.failure( - ScannerException("Failed to read scanned document: ${e.message}", e) - ) - } catch (e: SecurityException) { - Result.failure( - ScannerException("Permission denied when reading scanned document: ${e.message}", e) - ) - } catch (e: Exception) { - Result.failure( - ScannerException("Unexpected error processing scan result: ${e.message}", e) - ) - } - } - - /** - * Reads raw bytes from a content URI using the application's content resolver. - */ - internal fun readBytesFromUri(uri: Uri): ByteArray { - return context.contentResolver.openInputStream(uri)?.use { inputStream -> - inputStream.readBytes() - } ?: throw IOException("Unable to open input stream for URI: $uri") - } -} - -/** - * Exception type for document scanning errors, providing descriptive messages - * about what went wrong during the scanning process. - */ -class ScannerException( - message: String, - cause: Throwable? = null -) : Exception(message, cause) diff --git a/app/src/main/java/com/app/traveldocs/data/webserver/DocumentWebServer.kt b/app/src/main/java/com/app/traveldocs/data/webserver/DocumentWebServer.kt deleted file mode 100644 index 162be0d..0000000 --- a/app/src/main/java/com/app/traveldocs/data/webserver/DocumentWebServer.kt +++ /dev/null @@ -1,228 +0,0 @@ -package com.app.traveldocs.data.webserver - -import android.content.Context -import android.net.wifi.WifiManager -import com.app.traveldocs.debug.DebugLogger -import com.app.traveldocs.domain.model.Document -import com.app.traveldocs.domain.repository.DocumentFileStorage -import com.app.traveldocs.domain.repository.DocumentRepository -import com.app.traveldocs.domain.repository.TagRepository -import fi.iki.elonen.NanoHTTPD -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.runBlocking -import java.io.ByteArrayInputStream - -/** - * Embedded HTTP server for WiFi document management. - * - * Serves a full interactive web UI with: - * - Browse documents by tags (folder view) - * - Download files (decrypted, streamed for large files) - * - Upload files (multipart, supports large files via NanoHTTPD temp files) - * - Rename documents inline - * - Add/remove tags (single or bulk) - * - Bulk select + bulk tag assignment - * - Token-based auth (random per session, shown in app) - * - * Large file handling: - * - Downloads: served via NanoHTTPD's chunked response (no full-file buffering for response) - * - Uploads: NanoHTTPD writes multipart data to temp files on disk (not RAM), then we read - */ -class DocumentWebServer( - private val context: Context, - private val documentRepository: DocumentRepository, - private val fileStorage: DocumentFileStorage, - private val tagRepository: TagRepository, - port: Int = 8080 -) : NanoHTTPD(port) { - - companion object { - private const val TAG = "WebServer" - // NanoHTTPD default tmp dir handles large uploads to disk - private const val MAX_REQUEST_SIZE = 200 * 1024 * 1024 // 200MB - } - - val accessToken: String = java.util.UUID.randomUUID().toString().take(8) - - init { - // Increase NanoHTTPD temp file threshold for large uploads - setTempFileManagerFactory { NanoHTTPD.DefaultTempFileManager() } - } - - override fun serve(session: IHTTPSession): Response { - val uri = session.uri - val method = session.method - DebugLogger.d(TAG, "${method.name} $uri") - - // Auth: token required for all endpoints except index (which shows the login form) - val token = session.parms?.get("token") ?: session.headers?.get("x-access-token") - if (token != accessToken && uri != "/" && uri != "/favicon.ico") { - return newFixedLengthResponse(Response.Status.UNAUTHORIZED, "text/html", - "