├── .gitmodules ├── fastlane ├── metadata │ ├── de-DE │ │ ├── name.txt │ │ ├── promotional_text.txt │ │ ├── apple_tv_privacy_policy.txt │ │ ├── subtitle.txt │ │ ├── marketing_url.txt │ │ ├── support_url.txt │ │ ├── privacy_url.txt │ │ ├── keywords.txt │ │ └── release_notes.txt │ ├── en-US │ │ ├── name.txt │ │ ├── promotional_text.txt │ │ ├── apple_tv_privacy_policy.txt │ │ ├── subtitle.txt │ │ ├── marketing_url.txt │ │ ├── support_url.txt │ │ ├── privacy_url.txt │ │ ├── keywords.txt │ │ └── release_notes.txt │ ├── primary_first_sub_category.txt │ ├── primary_second_sub_category.txt │ ├── review_information │ │ ├── demo_user.txt │ │ ├── demo_password.txt │ │ ├── first_name.txt │ │ ├── last_name.txt │ │ ├── phone_number.txt │ │ ├── email_address.txt │ │ └── notes.txt │ ├── secondary_first_sub_category.txt │ ├── secondary_second_sub_category.txt │ ├── copyright.txt │ ├── primary_category.txt │ ├── secondary_category.txt │ ├── trade_representative_contact_information │ │ ├── state.txt │ │ ├── address_line2.txt │ │ ├── address_line3.txt │ │ ├── country.txt │ │ ├── city_name.txt │ │ ├── first_name.txt │ │ ├── last_name.txt │ │ ├── postal_code.txt │ │ ├── trade_name.txt │ │ ├── address_line1.txt │ │ ├── is_displayed_on_app_store.txt │ │ ├── phone_number.txt │ │ └── email_address.txt │ └── app_icon.jpg ├── Pluginfile ├── screenshots │ ├── de-DE │ │ ├── 1_ipadPro_1.12.9-inch Screenshot 1.png │ │ ├── 1_iphone35_1.3.5-inch Screenshot 1.png │ │ ├── 1_iphone4_1.4-inch Screenshot 1.png │ │ ├── 1_iphone58_1.5.8-inch Screenshot 1.png │ │ ├── 1_iphone65_1.6.5-inch Screenshot 1.png │ │ ├── 1_iphone6_1.4.7-inch Screenshot 1.png │ │ ├── 2_ipadPro_2.12.9-inch Screenshot 2.png │ │ ├── 2_iphone35_2.3.5-inch Screenshot 2.png │ │ ├── 2_iphone4_2.4-inch Screenshot 2.png │ │ ├── 2_iphone58_2.5.8-inch Screenshot 2.png │ │ ├── 2_iphone65_2.6.5-inch Screenshot 2.png │ │ ├── 2_iphone6_2.4.7-inch Screenshot 2.png │ │ ├── 3_ipadPro_3.12.9-inch Screenshot 3.png │ │ ├── 3_iphone35_3.3.5-inch Screenshot 3.png │ │ ├── 3_iphone4_3.4-inch Screenshot 3.png │ │ ├── 3_iphone58_3.5.8-inch Screenshot 3.png │ │ ├── 3_iphone65_3.6.5-inch Screenshot 3.png │ │ ├── 3_iphone6_3.4.7-inch Screenshot 3.png │ │ ├── 4_ipadPro_4.12.9-inch Screenshot 4.png │ │ ├── 4_iphone35_4.3.5-inch Screenshot 4.png │ │ ├── 4_iphone4_4.4-inch Screenshot 4.png │ │ ├── 4_iphone58_4.5.8-inch Screenshot 4.png │ │ ├── 4_iphone65_4.6.5-inch Screenshot 4.png │ │ ├── 4_iphone6_4.4.7-inch Screenshot 4.png │ │ ├── 5_ipadPro_5.12.9-inch Screenshot 5.png │ │ ├── 5_iphone35_5.3.5-inch Screenshot 5.png │ │ ├── 5_iphone4_5.4-inch Screenshot 5.png │ │ ├── 5_iphone58_5.5.8-inch Screenshot 5.png │ │ ├── 5_iphone65_5.6.5-inch Screenshot 5.png │ │ ├── 5_iphone6_5.4.7-inch Screenshot 5.png │ │ ├── 1_ipadPro129_1.12.9-inch Screenshot 1.png │ │ ├── 1_iphone6Plus_1.5.5-inch Screenshot 1.png │ │ ├── 2_ipadPro129_2.12.9-inch Screenshot 2.png │ │ ├── 2_iphone6Plus_2.5.5-inch Screenshot 2.png │ │ ├── 3_ipadPro129_3.12.9-inch Screenshot 3.png │ │ ├── 3_iphone6Plus_3.5.5-inch Screenshot 3.png │ │ ├── 4_ipadPro129_4.12.9-inch Screenshot 4.png │ │ ├── 4_iphone6Plus_4.5.5-inch Screenshot 4.png │ │ ├── 5_ipadPro129_5.12.9-inch Screenshot 5.png │ │ └── 5_iphone6Plus_5.5.5-inch Screenshot 5.png │ └── en-US │ │ ├── 1_ipadPro_1.12.9-inch Screenshot 1.png │ │ ├── 1_iphone35_1.3.5-inch Screenshot 1.png │ │ ├── 1_iphone4_1.4-inch Screenshot 1.png │ │ ├── 1_iphone58_1.5.8-inch Screenshot 1.png │ │ ├── 1_iphone65_1.6.5-inch Screenshot 1.png │ │ ├── 1_iphone6_1.4.7-inch Screenshot 1.png │ │ ├── 2_ipadPro_2.12.9-inch Screenshot 2.png │ │ ├── 2_iphone35_2.3.5-inch Screenshot 2.png │ │ ├── 2_iphone4_2.4-inch Screenshot 2.png │ │ ├── 2_iphone58_2.5.8-inch Screenshot 2.png │ │ ├── 2_iphone65_2.6.5-inch Screenshot 2.png │ │ ├── 2_iphone6_2.4.7-inch Screenshot 2.png │ │ ├── 3_ipadPro_3.12.9-inch Screenshot 3.png │ │ ├── 3_iphone35_3.3.5-inch Screenshot 3.png │ │ ├── 3_iphone4_3.4-inch Screenshot 3.png │ │ ├── 3_iphone58_3.5.8-inch Screenshot 3.png │ │ ├── 3_iphone65_3.6.5-inch Screenshot 3.png │ │ ├── 3_iphone6_3.4.7-inch Screenshot 3.png │ │ ├── 4_ipadPro_4.12.9-inch Screenshot 4.png │ │ ├── 4_iphone35_4.3.5-inch Screenshot 4.png │ │ ├── 4_iphone4_4.4-inch Screenshot 4.png │ │ ├── 4_iphone58_4.5.8-inch Screenshot 4.png │ │ ├── 4_iphone65_4.6.5-inch Screenshot 4.png │ │ ├── 4_iphone6_4.4.7-inch Screenshot 4.png │ │ ├── 5_ipadPro_5.12.9-inch Screenshot 5.png │ │ ├── 5_iphone35_5.3.5-inch Screenshot 5.png │ │ ├── 5_iphone4_5.4-inch Screenshot 5.png │ │ ├── 5_iphone58_5.5.8-inch Screenshot 5.png │ │ ├── 5_iphone65_5.6.5-inch Screenshot 5.png │ │ ├── 5_iphone6_5.4.7-inch Screenshot 5.png │ │ ├── 1_ipadPro129_1.12.9-inch Screenshot 1.png │ │ ├── 1_iphone6Plus_1.5.5-inch Screenshot 1.png │ │ ├── 2_ipadPro129_2.12.9-inch Screenshot 2.png │ │ ├── 2_iphone6Plus_2.5.5-inch Screenshot 2.png │ │ ├── 3_ipadPro129_3.12.9-inch Screenshot 3.png │ │ ├── 3_iphone6Plus_3.5.5-inch Screenshot 3.png │ │ ├── 4_ipadPro129_4.12.9-inch Screenshot 4.png │ │ ├── 4_iphone6Plus_4.5.5-inch Screenshot 4.png │ │ ├── 5_ipadPro129_5.12.9-inch Screenshot 5.png │ │ └── 5_iphone6Plus_5.5.5-inch Screenshot 5.png ├── Deliverfile ├── Appfile ├── Gymfile └── Snapfile ├── .gitattributes ├── ArchiveCore ├── README.md ├── Tests │ ├── ArchiveBackendTests │ │ ├── assets │ │ │ ├── document1.jpg │ │ │ ├── document1.pdf │ │ │ ├── document1.png │ │ │ └── AVB_PlusGarantie_EP_Zurich_01102019.pdf │ │ ├── helper │ │ │ └── Bundle.swift │ │ ├── ArrayUrlTests.swift │ │ └── FuzzyMatchingTests.swift │ ├── ArchiveSharedConstantsTests │ │ └── Helper │ │ │ └── URL.swift │ └── ArchiveViewsTests │ │ └── StatisticsTests.swift ├── Sources │ ├── ArchiveBackend │ │ ├── ArchiveBackend.swift │ │ ├── ArchiveStore+Error.swift │ │ ├── PathManager │ │ │ └── PathManager+PathError.swift │ │ ├── Storage │ │ │ └── StorageError.swift │ │ ├── Protocols │ │ │ └── SearchScope.swift │ │ ├── ImageConverterAPI.swift │ │ ├── Helpers │ │ │ ├── DateFormatter.swift │ │ │ ├── Atomic.swift │ │ │ ├── UserNotification.swift │ │ │ ├── SortDescriptors.swift │ │ │ ├── OrientationInfo.swift │ │ │ └── TagParser.swift │ │ ├── Models │ │ │ ├── Document+TaggingStatus.swift │ │ │ ├── TagIndex.swift │ │ │ ├── Document+Hashable+Comparable.swift │ │ │ └── FileChange+DownloadStatus.swift │ │ ├── Extensions │ │ │ ├── FileManager.swift │ │ │ ├── Array.swift │ │ │ └── CIImage.swift │ │ ├── FolderAccess │ │ │ ├── FolderProvider.swift │ │ │ └── FileChange.swift │ │ ├── PlatformSpecificWrapper │ │ │ └── FeedbackGenerator.swift │ │ └── Search │ │ │ ├── FilterItem+FilterCache.swift │ │ │ └── Matrix.swift │ ├── ArchiveViews │ │ ├── ArchiveViews.swift │ │ ├── Onboarding │ │ │ ├── OnboardCard.swift │ │ │ └── OnboardSet.swift │ │ ├── Helper │ │ │ ├── Extensions │ │ │ │ ├── Binding.swift │ │ │ │ ├── NSTextField.swift │ │ │ │ └── View.swift │ │ │ ├── VerticalLabelStyle.swift │ │ │ ├── ResignKeyboardOnDragGesture.swift │ │ │ ├── Design │ │ │ │ ├── WidthSyncedRow.swift │ │ │ │ ├── SubscriptionButtonStyle.swift │ │ │ │ └── FilledButtonStyle.swift │ │ │ ├── MissingViews │ │ │ │ ├── LoadingView.swift │ │ │ │ ├── PlaceholderView.swift │ │ │ │ ├── DetailRowView.swift │ │ │ │ ├── ClearButton.swift │ │ │ │ ├── InputAccessoryView.swift │ │ │ │ └── Stack.swift │ │ │ ├── PlatfromSpecific │ │ │ │ └── PhantomViewModifiers.swift │ │ │ ├── MarkdownView.swift │ │ │ └── CustomDiagnosticsReporter.swift │ │ ├── ArchiveTab │ │ │ ├── DocumentDetailViewModel.swift │ │ │ ├── PDFCustomView.swift │ │ │ └── DocumentDetailView.swift │ │ └── MoreTab │ │ │ ├── StorageSelectionView.swift │ │ │ └── AboutMeView.swift │ ├── InAppPurchases │ │ ├── IAPService+SubscriptionType.swift │ │ ├── IAPError.swift │ │ └── IAPServiceAPI.swift │ └── ArchiveSharedConstants │ │ ├── Helper │ │ └── PlatfromWrapper.swift │ │ ├── Extensions │ │ ├── CaseIterable.swift │ │ ├── URL.swift │ │ └── FileManager.swift │ │ ├── ErrorHandling │ │ ├── AlertDataModel.swift │ │ └── Alert.swift │ │ ├── Constants.swift │ │ ├── Tab.swift │ │ ├── Notification.swift │ │ ├── Color.swift │ │ ├── Logging │ │ ├── Log.swift │ │ ├── SentryBreadcrumbLogger.swift │ │ └── AppEnvironment.swift │ │ └── PathConstants.swift └── .swiftpm │ └── xcode │ └── xcshareddata │ └── xcbaselines │ └── ArchiveCoreTests.xcbaseline │ ├── Info.plist │ └── CBC450F9-0FD6-4ABA-8152-BE739023F8FC.plist ├── Shared └── Resources │ ├── Assets.xcassets │ ├── Contents.json │ ├── colors │ │ ├── Contents.json │ │ ├── Delete.colorset │ │ │ └── Contents.json │ │ ├── DarkRed.colorset │ │ │ └── Contents.json │ │ ├── LightRed.colorset │ │ │ └── Contents.json │ │ ├── KeyboardBackground.colorset │ │ │ └── Contents.json │ │ ├── PlaceholderGray.colorset │ │ │ └── Contents.json │ │ ├── LightGray.colorset │ │ │ └── Contents.json │ │ ├── White.colorset │ │ │ └── Contents.json │ │ ├── DarkGray.colorset │ │ │ └── Contents.json │ │ ├── PDFBackground.colorset │ │ │ └── Contents.json │ │ ├── Background.colorset │ │ │ └── Contents.json │ │ └── SecondaryBackground.colorset │ │ │ └── Contents.json │ ├── .DS_Store │ ├── me-photo.imageset │ │ ├── photo.jpeg │ │ └── Contents.json │ ├── IntroIcons │ │ ├── find.imageset │ │ │ ├── find.pdf │ │ │ └── Contents.json │ │ ├── scan.imageset │ │ │ ├── scan.pdf │ │ │ └── Contents.json │ │ ├── start.imageset │ │ │ ├── start.pdf │ │ │ └── Contents.json │ │ ├── tag-1.imageset │ │ │ ├── tag.pdf │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── piggy-bank.imageset │ │ │ ├── piggy-bank.pdf │ │ │ └── Contents.json │ ├── Logo.imageset │ │ ├── AppIcon.png │ │ └── Contents.json │ ├── AppIcon.appiconset │ │ ├── icon_16x16.png │ │ ├── icon_20@1x.png │ │ ├── icon_20@2x.png │ │ ├── icon_20@3x.png │ │ ├── icon_29@1x.png │ │ ├── icon_29@2x.png │ │ ├── icon_29@3x.png │ │ ├── icon_32x32.png │ │ ├── icon_40@1x.png │ │ ├── icon_40@2x.png │ │ ├── icon_40@3x.png │ │ ├── icon_60@2x.png │ │ ├── icon_60@3x.png │ │ ├── icon_76@1x.png │ │ ├── icon_76@2x.png │ │ ├── icon_1024@1x.png │ │ ├── icon_128x128.png │ │ ├── icon_128x128@2x.png │ │ ├── icon_16x16@2x.png │ │ ├── icon_256x256.png │ │ ├── icon_256x256@2x.png │ │ ├── icon_32x32@2x.png │ │ ├── icon_512x512.png │ │ ├── icon_512x512@2x.png │ │ └── icon_83.5@2x.png │ └── AccentColor.colorset │ │ └── Contents.json │ ├── example-bill.pdf │ ├── Settings.bundle │ ├── de.lproj │ │ └── Root.strings │ ├── en.lproj │ │ └── Root.strings │ ├── Root.plist │ ├── com.mono0926.LicensePlist.latest_result.txt │ └── com.mono0926.LicensePlist │ │ ├── SwiftUIX.plist │ │ ├── Diagnostics.plist │ │ ├── GraphicsRenderer.plist │ │ ├── sentry-cocoa.plist │ │ ├── TPInAppReceipt.plist │ │ ├── Parma.plist │ │ ├── DeepDiff.plist │ │ └── ASN1Swift.plist │ ├── PDFArchiver.entitlements │ ├── markdown │ ├── Base.lproj │ │ └── Privacy.md │ └── de.lproj │ │ └── Privacy.md │ └── IAP.storekit ├── AppClip ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── Assets.xcassets │ └── AppIcon.appiconset │ │ └── icon_1024@1x.png ├── AppClipApp.swift ├── AppClip.entitlements ├── AppClipIAPService.swift ├── PDFSharingViewModel.swift └── Info.plist ├── assets └── appclip.png ├── PDFArchiver.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ ├── xcbaselines │ └── 3489D72A24A3C53E0035E64F.xcbaseline │ │ ├── 7712990D-DD3E-4FB5-BF56-3FCD157BC908.plist │ │ └── Info.plist │ └── xcschemes │ └── UITests iOS.xcscheme ├── PDFArchiver.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ ├── IDEWorkspaceChecks.plist │ └── WorkspaceSettings.xcsettings ├── .github ├── workflows │ ├── chia.yml │ ├── SwiftTest.yml │ └── XcodeBuildTest.yml ├── FUNDING.yml └── ISSUE_TEMPLATE │ └── bug_report.md ├── ShareExtension ├── ShareExtension.entitlements └── Info.plist ├── README.md ├── .gitignore ├── Tests iOS ├── Info.plist └── TestsIOS.swift ├── Tests macOS ├── Info.plist └── Tests_macOS.swift ├── UITests iOS ├── Info.plist └── UITests_iOS.swift ├── PDFArchiver └── Resources │ └── Settings.bundle │ ├── com.mono0926.LicensePlist.latest_result.txt │ └── com.mono0926.LicensePlist │ ├── SwiftUIX.plist │ ├── SwiftyStoreKit.plist │ ├── Diagnostics.plist │ ├── KeyboardObserving.plist │ ├── paper-onboarding.plist │ └── sentry-cocoa.plist ├── .bartycrouch.toml ├── iOS └── PDFArchiver.entitlements └── macOS ├── macOS.entitlements └── Info.plist /.gitmodules: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/name.txt: -------------------------------------------------------------------------------- 1 | PDF Archiver 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/promotional_text.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/name.txt: -------------------------------------------------------------------------------- 1 | PDF Archiver 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/promotional_text.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/primary_first_sub_category.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/apple_tv_privacy_policy.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/apple_tv_privacy_policy.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/primary_second_sub_category.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/demo_user.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/secondary_first_sub_category.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/secondary_second_sub_category.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.png filter=lfs diff=lfs merge=lfs -text 2 | -------------------------------------------------------------------------------- /fastlane/metadata/copyright.txt: -------------------------------------------------------------------------------- 1 | © 2017-2019 Julian Kahnert 2 | -------------------------------------------------------------------------------- /fastlane/metadata/primary_category.txt: -------------------------------------------------------------------------------- 1 | MZGenre.Productivity 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/demo_password.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/first_name.txt: -------------------------------------------------------------------------------- 1 | Julian 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/last_name.txt: -------------------------------------------------------------------------------- 1 | Kahnert 2 | -------------------------------------------------------------------------------- /fastlane/metadata/secondary_category.txt: -------------------------------------------------------------------------------- 1 | MZGenre.Utilities 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/subtitle.txt: -------------------------------------------------------------------------------- 1 | Scan it. Tag it. Find it. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/subtitle.txt: -------------------------------------------------------------------------------- 1 | Scan it. Tag it. Find it. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/marketing_url.txt: -------------------------------------------------------------------------------- 1 | https://pdf-archiver.io/de/ 2 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/support_url.txt: -------------------------------------------------------------------------------- 1 | https://pdf-archiver.io/faq 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/marketing_url.txt: -------------------------------------------------------------------------------- 1 | https://pdf-archiver.io/ 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/support_url.txt: -------------------------------------------------------------------------------- 1 | https://pdf-archiver.io/faq 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/state.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/privacy_url.txt: -------------------------------------------------------------------------------- 1 | https://pdf-archiver.io/privacy 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/phone_number.txt: -------------------------------------------------------------------------------- 1 | +49 441 55979822 2 | -------------------------------------------------------------------------------- /ArchiveCore/README.md: -------------------------------------------------------------------------------- 1 | # ArchiveCore 2 | 3 | A description of this package. 4 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/privacy_url.txt: -------------------------------------------------------------------------------- 1 | https://pdf-archiver.io/de/privacy/ 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/email_address.txt: -------------------------------------------------------------------------------- 1 | mail@pdf-archiver.io 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/address_line2.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/address_line3.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/country.txt: -------------------------------------------------------------------------------- 1 | Germany 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/city_name.txt: -------------------------------------------------------------------------------- 1 | Oldenburg 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/first_name.txt: -------------------------------------------------------------------------------- 1 | Julian 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/last_name.txt: -------------------------------------------------------------------------------- 1 | Kahnert 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/postal_code.txt: -------------------------------------------------------------------------------- 1 | 26129 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/trade_name.txt: -------------------------------------------------------------------------------- 1 | Julian Kahnert 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/address_line1.txt: -------------------------------------------------------------------------------- 1 | Wechloyer Tor 7 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/is_displayed_on_app_store.txt: -------------------------------------------------------------------------------- 1 | false 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/phone_number.txt: -------------------------------------------------------------------------------- 1 | +49 441 55979822 2 | -------------------------------------------------------------------------------- /fastlane/metadata/trade_representative_contact_information/email_address.txt: -------------------------------------------------------------------------------- 1 | mail@pdf-archiver.io 2 | -------------------------------------------------------------------------------- /fastlane/metadata/review_information/notes.txt: -------------------------------------------------------------------------------- 1 | The attached video shows the functionality of the app. 2 | -------------------------------------------------------------------------------- /fastlane/metadata/app_icon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/fastlane/metadata/app_icon.jpg -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Resources/example-bill.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/example-bill.pdf -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/keywords.txt: -------------------------------------------------------------------------------- 1 | pdf,scan,scanner,archiver,pdfarchiver,archive,tag,tags,document,bill,letter,scan,finder,sort,drive 2 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/keywords.txt: -------------------------------------------------------------------------------- 1 | pdf,scan,scanner,archiver,pdfarchiver,archive,tag,tags,document,bill,letter,scan,finder,sort,drive 2 | -------------------------------------------------------------------------------- /AppClip/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | # 3 | # Ensure this file is checked in to source control! 4 | 5 | gem 'fastlane-plugin-sentry' 6 | -------------------------------------------------------------------------------- /assets/appclip.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8b29e5c715634190ff702899770335c65322acfe2673a8f7f492d1d9ba91fcae 3 | size 399374 4 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/assets/document1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/ArchiveCore/Tests/ArchiveBackendTests/assets/document1.jpg -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/assets/document1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/ArchiveCore/Tests/ArchiveBackendTests/assets/document1.pdf -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/me-photo.imageset/photo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/me-photo.imageset/photo.jpeg -------------------------------------------------------------------------------- /AppClip/Assets.xcassets/AppIcon.appiconset/icon_1024@1x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5280bc3200ba7daea92051841de5f6dbd821561d9a6bcc6fb6e84ec6ba25c9c5 3 | size 35652 4 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/assets/document1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:226c96706191cf76c692951b96c5c03eed4386e1a49adbc0f14c98c2d280e18f 3 | size 279984 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/find.imageset/find.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/IntroIcons/find.imageset/find.pdf -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/scan.imageset/scan.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/IntroIcons/scan.imageset/scan.pdf -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/start.imageset/start.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/IntroIcons/start.imageset/start.pdf -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/tag-1.imageset/tag.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/IntroIcons/tag-1.imageset/tag.pdf -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/Logo.imageset/AppIcon.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3699d2e0b928ec64b17939e326a7cb76bee56b19201b4ff647898db6678f040f 3 | size 15074 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b11d8e4f1c8e8d09033cac4ded917bc51b64050e312700ecba7e6b10e8899b8f 3 | size 3333 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_20@1x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:14faaaea19aff48265be68d2d8778086a4b5d24563ca05b5b449c74ec74d0ce3 3 | size 558 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_20@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:08e379d8b5f3dd5f213238bdcb485b489fbca915fc96bc7772756b17606839b8 3 | size 1616 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_20@3x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8ed76e1b9ae3ad4e33744abcafde86a1221373d862db479853996085e0d93b34 3 | size 1439 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_29@1x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4706f533fada86c50fa4a1d19cc3ad3de0a9c28b56101ce946f0811f03fea1f3 3 | size 729 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_29@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7c9f83701d142b0899075f4e77c5dad058073f0881d774ab5242e0ad36bdc385 3 | size 2272 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_29@3x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:37b059e9ed4ddba58cbd6fcbb6275f61cc79bdde0e542cc31dfc66da28609b29 3 | size 3504 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:97ab0f5c0932d2b6a6889cf1970cbd7487a45716476804bcfc4f801bc67a78e3 3 | size 3812 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_40@1x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:08e379d8b5f3dd5f213238bdcb485b489fbca915fc96bc7772756b17606839b8 3 | size 1616 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_40@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9cbb7b37fb0c569bb26f9299ae45ec675ca521fc646abb6d73e6e02dd9338f7c 3 | size 3243 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_40@3x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6716b7c08d6076c58476f2353b7a961a72402e0cb90bdfd0aa418d24683e0057 3 | size 4921 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_60@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6716b7c08d6076c58476f2353b7a961a72402e0cb90bdfd0aa418d24683e0057 3 | size 4921 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_60@3x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:20b3e84eed5e30e301e5b1d640041b0d9525ab62829280690e6026da4d7f0e3f 3 | size 7404 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_76@1x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:31d8f93a18f0d73b57d807f221e8814c5a36eb9e8874dce276477ab40760cdd5 3 | size 2825 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_76@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:344d0f1e91f312df1c56a07c790c9d796b7314aac1af671f5182988b889fda4a 3 | size 6434 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_ipadPro_1.12.9-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8ebfe0c324eb6f91e9138e93c47d09aaa3f69f91c9efe01adf7b7b7a75aa5166 3 | size 175342 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_iphone35_1.3.5-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:56d90bc6cea73aa59869fafefea634ebe693cdb2c0d5027b9774e1c0fd402af0 3 | size 42502 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_iphone4_1.4-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ce1b70eb9cc7a3ea1390d465f2134ab7ca6b3e985f14743b60f88135661c8b97 3 | size 72471 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_iphone58_1.5.8-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f69aa009eff4a8d96ad24deb1e6b83922120067824a31924e5f65123e8ddbd7c 3 | size 148205 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_iphone65_1.6.5-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f55d0a6cc630f8c5a3e41190f29ffc6fe647f64f4b2a61e16a43864875565781 3 | size 175323 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_iphone6_1.4.7-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2dca2b4ed0ab81e27b4fb0f97cc6d9863a7a6fbd2679ea74a15dd3c814fc8360 3 | size 65076 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_ipadPro_2.12.9-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bd5e6bf5e7ebaed290c98b04d8309ce1e23ba41585c7473d9e2324ca4feea8b1 3 | size 247601 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_iphone35_2.3.5-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:071a156b35561f226e813a37878d306d73dc3fac9f5d2acb5f70e6295223e6e7 3 | size 59973 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_iphone4_2.4-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a6509cd1c055a78330614aa59466d313dd0390eaba806eb5fb477c63b17d2c3f 3 | size 103660 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_iphone58_2.5.8-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a4d196bfd58fa9b88ebd25cd602e45b3e7a9ce1c16ee9807d50de4194bd7909d 3 | size 254988 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_iphone65_2.6.5-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:dffda50f18bbf24121d8894888667424c54a5a1d3907511558df695dac01d5c7 3 | size 191616 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_iphone6_2.4.7-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cfe57fb0e12a4c3568bab116de9a48092d38cba4321f0a4a61e7f440b2fb5b61 3 | size 92754 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_ipadPro_3.12.9-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8642f601df256651db1c8903dd46b6b8464f59cad3bc8fbdb45fe29207ec4de3 3 | size 219549 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_iphone35_3.3.5-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6e2112fe0ac6bfee35e50fe446556d033ca1d6f41a3c46d20c02cb2b4ef77798 3 | size 54131 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_iphone4_3.4-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:c6cfeba3243df378a04941b5bf912d706dccb5a2c9d0076a6d4781725d710517 3 | size 67500 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_iphone58_3.5.8-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a8daf14eaec2da481e4e30b07a98e3017f8100b11289b732db24cd4de1ae318f 3 | size 226106 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_iphone65_3.6.5-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:acbf0b528e70e2ff3206080c42bcc894859adea02d3090cac8febda36a0c6e6b 3 | size 185506 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_iphone6_3.4.7-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5a1744e9f38d92ede91933ef75f94e685fba397604d6a01d0b8146f1794a1ddb 3 | size 82452 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_ipadPro_4.12.9-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f4066b23bf04aafa64333d3c3762e952dc00f73980678b677573211caaeb24a0 3 | size 245786 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_iphone35_4.3.5-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:3907a86b7b95daace4f22c296b4fac54d7c698ae0ce907117046666d7945fe4c 3 | size 60226 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_iphone4_4.4-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:945addd493a17c4e414e3f5de3ca4c4c0c600fbf7b9d2081905371f000bf9816 3 | size 106286 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_iphone58_4.5.8-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8705d38ad4eef79655a7ece1f8ff07f0bce3bfe2e230278b9b611a507b2ee4a0 3 | size 218555 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_iphone65_4.6.5-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1309e7c98697981c76cfedabbbd98dea820b71debfc274221a1c308932923a23 3 | size 254035 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_iphone6_4.4.7-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4bb5ac965455cc182200632ffe85aebbfa58a88499a3202dc45f7c71e6f41c1a 3 | size 95337 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_ipadPro_5.12.9-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:56e73f80de402157522268377b53d84302cb917cd7027e0e2cfaed2ed1dc8b63 3 | size 252533 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_iphone35_5.3.5-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f4d8574cd8ee7c47985655c580681b4b79588c53e9587901bfe68830a77d4c2a 3 | size 64473 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_iphone4_5.4-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f5d7d6a8e5ea93650169619ee607bf175588765076f1c7c085be2cfbfac9cc0a 3 | size 79859 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_iphone58_5.5.8-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:222f0963612474808d032da97c4b2fcd2f05bee4352bd177ce2099916c69c98a 3 | size 207068 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_iphone65_5.6.5-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a7b96ef4f8fef2d6d2e25cbeb68bb4a3c2197649c87fc12629a89ce1ef7c787a 3 | size 230498 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_iphone6_5.4.7-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ac6e4eacc65afec859657d918a199e30ac4e32d3da7453c38d3a63ef354b9d94 3 | size 98025 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_ipadPro_1.12.9-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:67509a692eab14c49005156697d35d19d12806e7e9f83e40d8223207f36fb25e 3 | size 225029 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iphone35_1.3.5-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:93b877b3c92198d90df1379569f0223e4eeadcce484b8b36d230dddb722df393 3 | size 40447 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iphone4_1.4-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a7a8b2a632fbb211791e93ed5c13add1d40d18b22e4d25a010f49ce4eea0972a 3 | size 70533 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iphone58_1.5.8-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:175c12bd01a9a7e4a444c89d9ed0acc1f1179e7d1aa43775ea80c426ad940ce7 3 | size 142870 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iphone65_1.6.5-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cdc6d42386978df756e9608ea2ecf972c8992c18881e1d1647313475065c021b 3 | size 231622 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iphone6_1.4.7-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d783c2ed9a06d2d6bffc194142cf3021275e251f760e865ba1b9cd189c3aa40e 3 | size 62160 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_ipadPro_2.12.9-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:26afea37a91d10cfbcf026e5d72a3f51117f43b3ab67be72500c99cf72cac6c3 3 | size 234216 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iphone35_2.3.5-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:664888583a5137a773110f1b6451e2f4e396b794421e6a9ab566989fbe7be842 3 | size 79376 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iphone4_2.4-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:59c3ce1d2fe01a80e20fe0981963a54c2950d85daf045b6ae784177139f31a42 3 | size 99760 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iphone58_2.5.8-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7d522de63a5d0418b92d663aa9a1f305c8628a69eb127a047bbba3c3f2f76f6c 3 | size 177249 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iphone65_2.6.5-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ce33c49a28c24388bc5348589c0b68b7d83d271bc5ae7e5a74c2055952db8fe1 3 | size 185555 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iphone6_2.4.7-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:a208489cfd42f01c5f6e78710e735cd991fbdada7f885c26ff10c9917782f838 3 | size 126321 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_ipadPro_3.12.9-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:66ef3af5b601b175c64e2a46637f78ae83f6bc9ce730927201b8f0124464d2e5 3 | size 209253 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iphone35_3.3.5-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d4eff90e2f925f68ad2fa1747e5832cc7a350805deb1dec254eec35a83b21518 3 | size 51321 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iphone4_3.4-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:beaeec96937852ae0b1a2b5309cc22589cb9c387404d3e462a6ea956544128b1 3 | size 85862 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iphone58_3.5.8-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:734d414ebd3a1f22d182e3349fc1d59ffb7b9ad3a8ae74d6a12fb5dd5d272a2b 3 | size 217146 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iphone65_3.6.5-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:d79da572f0b4ef957b29399d946910e44e08289101dfa2c2d985095defa56632 3 | size 237507 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iphone6_3.4.7-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7d80d043575c7a2c20a281c13d8071b9493fb07db64617b94b53814801294975 3 | size 78631 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_ipadPro_4.12.9-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:2782a47f900197b325e9583085658457b378b685104f2ee3aa6c5fd070ef8ef9 3 | size 239085 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_iphone35_4.3.5-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f80e80e50ff3f710c84aba5d15fdf6d23e5a617f2985f405c553dad2393582a3 3 | size 83731 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_iphone4_4.4-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f4702dc8bad0638ab36c96822b5ef607b279a94a52625334ea08388291682188 3 | size 72365 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_iphone58_4.5.8-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b1300c24b8a3c8afb949ecd70b90ac4eb5fac6c4b0543b113bc42c1efe6d2cb5 3 | size 212418 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_iphone65_4.6.5-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e34a5f2d5ea2555db9ec073c9298f411816b817759f5c4d1001eb0d9b7296cad 3 | size 247748 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_iphone6_4.4.7-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f8a11bf798efeaa7ae6ca9297e5cd224aa51f3cbb5d10294fda08a79aabcc1c9 3 | size 92723 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_ipadPro_5.12.9-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:b04449c16fc1aae75aafe8643a1ab9a57ae2aa2f7e89890de021108abbb0182e 3 | size 317265 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_iphone35_5.3.5-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f40824daaf69d228f60fcfc68065b578ee943494eab1668ed733b97d75022214 3 | size 62553 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_iphone4_5.4-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8301e51c3b997e496eb8842fc6fc7e35930b518d491dcc6bf8133498e60c108a 3 | size 77774 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_iphone58_5.5.8-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:de124739e68fb6ada2fedcf78dbb9192d7b8f83934318fb56dd60f01b0997900 3 | size 203230 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_iphone65_5.6.5-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9c0e5b770ff9d4377e259284cafe99a8f602984bb286413d1c09db4bf0732eab 3 | size 225915 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_iphone6_5.4.7-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:ad8705ec82bef2091364e1e4f9cb753810403c59b0726a94ddea52cbdf57baf8 3 | size 95907 4 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/ArchiveBackend.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArchiveBackend.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 11.10.20. 6 | // 7 | 8 | @_exported import ArchiveSharedConstants 9 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_1024@1x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5280bc3200ba7daea92051841de5f6dbd821561d9a6bcc6fb6e84ec6ba25c9c5 3 | size 35652 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8f8a0d4872509e234f8a85513ff584b54623598bed2b0fd0bb3f63c94532c564 3 | size 7064 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_128x128@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6a253701d5b96fa66197caf39f1e6e741c619f74e9fcf3a95baefc16426a2ccf 3 | size 12106 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_16x16@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:97ab0f5c0932d2b6a6889cf1970cbd7487a45716476804bcfc4f801bc67a78e3 3 | size 3812 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6a253701d5b96fa66197caf39f1e6e741c619f74e9fcf3a95baefc16426a2ccf 3 | size 12106 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_256x256@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0fc1d0f76e4aea5895405de9b861c408a3fc51575bd7067143f20da89d61d405 3 | size 26354 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_32x32@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:1cc81a87663ebdc9eba859bb938758f48de22b4c676ed68e5a871416fb727547 3 | size 4869 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:0fc1d0f76e4aea5895405de9b861c408a3fc51575bd7067143f20da89d61d405 3 | size 26354 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_512x512@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:5cecc972efd2bd9c483841f7e613e50f0995d6fb93cc0d1b502935b0602b0c6e 3 | size 66410 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AppIcon.appiconset/icon_83.5@2x.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:7e8925d4e85854a928d6ebf059e04acecf5ddd496dab072dee96b91c853caa95 3 | size 6442 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "properties" : { 7 | "compression-type" : "lossless" 8 | } 9 | } -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_ipadPro129_1.12.9-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8ebfe0c324eb6f91e9138e93c47d09aaa3f69f91c9efe01adf7b7b7a75aa5166 3 | size 175342 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/1_iphone6Plus_1.5.5-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:470ba41326de3e29102e27615dc2bf29c3df87c5cca56332c238ffc54ee55f96 3 | size 129252 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_ipadPro129_2.12.9-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:bd5e6bf5e7ebaed290c98b04d8309ce1e23ba41585c7473d9e2324ca4feea8b1 3 | size 247601 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/2_iphone6Plus_2.5.5-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6e03bfc788be9d7c42128ad3b363af35258e48ae0057d6429ab71d0616fd0816 3 | size 177364 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_ipadPro129_3.12.9-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:8642f601df256651db1c8903dd46b6b8464f59cad3bc8fbdb45fe29207ec4de3 3 | size 219549 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/3_iphone6Plus_3.5.5-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9e3e0c10fbf8a935bada05d5928e0e22ea63b6823544b6a96added186e0f3402 3 | size 165823 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_ipadPro129_4.12.9-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f4066b23bf04aafa64333d3c3762e952dc00f73980678b677573211caaeb24a0 3 | size 245786 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/4_iphone6Plus_4.5.5-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:261758195f38126a3458601ad6814fc903462a188cec65073ecd682a2088971e 3 | size 200345 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_ipadPro129_5.12.9-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:56e73f80de402157522268377b53d84302cb917cd7027e0e2cfaed2ed1dc8b63 3 | size 252533 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/de-DE/5_iphone6Plus_5.5.5-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:f59c545f22f53b8a9dcb4cba6d49aeb301d63b72d85fa78fc83f9c2739015587 3 | size 251189 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_ipadPro129_1.12.9-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:67509a692eab14c49005156697d35d19d12806e7e9f83e40d8223207f36fb25e 3 | size 225029 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/1_iphone6Plus_1.5.5-inch Screenshot 1.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:20f28b798c22fff5388ee71fc3a3ede1eebfef1fc6e3e1cef6d1c8a9c833a6df 3 | size 166076 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_ipadPro129_2.12.9-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:26afea37a91d10cfbcf026e5d72a3f51117f43b3ab67be72500c99cf72cac6c3 3 | size 234216 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/2_iphone6Plus_2.5.5-inch Screenshot 2.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:aff03b49f65a5dfe315a6766be97b5623b87c15206e737e3156b9e17386dbea1 3 | size 171631 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_ipadPro129_3.12.9-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:66ef3af5b601b175c64e2a46637f78ae83f6bc9ce730927201b8f0124464d2e5 3 | size 209253 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/3_iphone6Plus_3.5.5-inch Screenshot 3.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:e08d71d4595bf3ad1c03a476f577e8b80e4d336dbcca7164c0fd35244b1da503 3 | size 212551 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_ipadPro129_4.12.9-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:6ad6e153553e9b63ea563f4ceb7be855a6fac811a1b3bc0d97a339f21361f366 3 | size 329307 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/4_iphone6Plus_4.5.5-inch Screenshot 4.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:cdf651592391d93806867020574e8ffee9821cc6ef06520c2451eedc271b4f75 3 | size 277968 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_ipadPro129_5.12.9-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:9f2cff2b05cdca2604caa1b66bb37be3c2399c0081b671e020f055975dededdc 3 | size 242984 4 | -------------------------------------------------------------------------------- /fastlane/screenshots/en-US/5_iphone6Plus_5.5.5-inch Screenshot 5.png: -------------------------------------------------------------------------------- 1 | version https://git-lfs.github.com/spec/v1 2 | oid sha256:4546a213636eb69dd7d8e0928bd50570754e4370565efc22bf5cb53696d45c33 3 | size 187067 4 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/piggy-bank.imageset/piggy-bank.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/Shared/Resources/Assets.xcassets/IntroIcons/piggy-bank.imageset/piggy-bank.pdf -------------------------------------------------------------------------------- /PDFArchiver.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/Deliverfile: -------------------------------------------------------------------------------- 1 | # The Deliverfile allows you to store various App Store Connect metadata 2 | # For more information, check out the docs 3 | # https://docs.fastlane.tools/actions/deliver/ 4 | 5 | automatic_release(false) 6 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/assets/AVB_PlusGarantie_EP_Zurich_01102019.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PDF-Archiver/PDF-Archive-Viewer/HEAD/ArchiveCore/Tests/ArchiveBackendTests/assets/AVB_PlusGarantie_EP_Zurich_01102019.pdf -------------------------------------------------------------------------------- /PDFArchiver.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/de.lproj/Root.strings: -------------------------------------------------------------------------------- 1 | 2 | /* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */ 3 | "Licenses" = "Lizenzen"; 4 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/en.lproj/Root.strings: -------------------------------------------------------------------------------- 1 | 2 | /* A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences. */ 3 | "Licenses" = "Licenses"; 4 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/ArchiveViews.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArchiveViews.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 10.10.20. 6 | // 7 | 8 | @_exported import ArchiveBackend 9 | @_exported import ArchiveSharedConstants 10 | @_exported import InAppPurchases 11 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/ArchiveStore+Error.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArchiveStore+Error.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 22.08.20. 6 | // 7 | 8 | extension ArchiveStore { 9 | public enum Error: Swift.Error { 10 | case providerNotFound 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /PDFArchiver.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /AppClip/AppClipApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppClipApp.swift 3 | // AppClip 4 | // 5 | // Created by Julian Kahnert on 10.10.20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct AppClipApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | MainContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /PDFArchiver.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/PathManager/PathManager+PathError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PathManager+PathError.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 17.11.20. 6 | // 7 | 8 | extension PathManager { 9 | public enum PathError: Error { 10 | case archiveNotSelected 11 | case iCloudDriveNotFound 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /PDFArchiver.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEWorkspaceSharedSettings_AutocreateContextsIfNeeded 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Onboarding/OnboardCard.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OnboardCard.swift 3 | // Onboarding 4 | // 5 | // Created by Stewart Lynch on 2020-06-27. 6 | // 7 | 8 | import Foundation 9 | 10 | struct OnboardCard: Identifiable, Hashable { 11 | let id = UUID() 12 | let title: String 13 | let image: String 14 | let text: String 15 | } 16 | -------------------------------------------------------------------------------- /fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("de.JulianKahnert.PDFArchiveViewer") # The bundle identifier of your app 2 | apple_id("mail@juliankahnert.de") # Your Apple email address 3 | 4 | itc_team_id("118993774") # App Store Connect Team ID 5 | team_id("87KNVHZ8C7") # Developer Portal Team ID 6 | 7 | # For more information about the Appfile, see: 8 | # https://docs.fastlane.tools/advanced/#appfile 9 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Storage/StorageError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StorageHelper+Errors.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 11.05.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | enum StorageError: Error { 12 | case jpgConversion 13 | case noPathToSave 14 | case wrongExtension(String) 15 | } 16 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/InAppPurchases/IAPService+SubscriptionType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IAPService+SubscriptionType.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 30.10.20. 6 | // 7 | 8 | extension IAPService { 9 | public enum SubscriptionType: String, CaseIterable { 10 | case monthly = "SUBSCRIPTION_MONTHLY_IOS" 11 | case yearly = "SUBSCRIPTION_YEARLY_IOS_NEW" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Helper/PlatfromWrapper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlatfromWrapper.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 07.11.20. 6 | // 7 | 8 | #if os(macOS) 9 | import AppKit 10 | #else 11 | import UIKit 12 | #endif 13 | 14 | public func open(_ url: URL) { 15 | #if os(macOS) 16 | NSWorkspace.shared.open(url) 17 | #else 18 | UIApplication.shared.open(url) 19 | #endif 20 | } 21 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/Extensions/Binding.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Binding.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 06.01.21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | extension Binding where Value == [String] { 11 | func insertAndSort(_ item: String) { 12 | var uniqueItems = Set(wrappedValue) 13 | uniqueItems.insert(item) 14 | wrappedValue = uniqueItems.sorted() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Extensions/CaseIterable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CaseIterable.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 18.11.20. 6 | // 7 | 8 | extension CaseIterable where AllCases.Element: Equatable { 9 | public static func toIndex(_ element: Self) -> Int? { 10 | guard let index = Self.allCases.firstIndex(of: element) else { return nil } 11 | return index as? Int 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/chia.yml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | 4 | name: Run Checks 5 | 6 | jobs: 7 | build: 8 | name: Chia 9 | runs-on: ubuntu-latest 10 | container: 11 | image: worldiety/chia:latest 12 | steps: 13 | - name: Checkout the repository 14 | uses: actions/checkout@master 15 | - name: Run chia cli 16 | run: chia --config https://raw.githubusercontent.com/JulianKahnert/chia-config/master/chia.yml 17 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Protocols/SearchScope.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Search.swift 3 | // ArchiveLib 4 | // 5 | // Created by Julian Kahnert on 13.11.18. 6 | // 7 | 8 | import Foundation 9 | 10 | /// Scope, which defines the documents that should be searched. 11 | public enum SearchScope { 12 | 13 | /// Search the whole archive. 14 | case all 15 | 16 | /// Search in a specific year. 17 | case year(year: String) 18 | } 19 | -------------------------------------------------------------------------------- /.github/workflows/SwiftTest.yml: -------------------------------------------------------------------------------- 1 | name: Swift Tests 2 | on: 3 | push: 4 | pull_request: 5 | jobs: 6 | macos: 7 | # runs-on: macOS-latest 8 | runs-on: macos-11.0 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v1 12 | - name: Build and Test 13 | run: cd ArchiveCore && swift test --enable-code-coverage 14 | env: 15 | DEVELOPER_DIR: /Applications/Xcode_12.2.app/Contents/Developer 16 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/Logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "AppIcon.png", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/ImageConverterAPI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageConverterAPI.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 11.10.20. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol ImageConverterAPI: class { 11 | var totalDocumentCount: Atomic { get } 12 | 13 | func handle(_ url: URL) throws 14 | func startProcessing() throws 15 | func stopProcessing() 16 | func getOperationCount() -> Int 17 | } 18 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/me-photo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "photo.jpeg", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/Delete.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "235", 13 | "alpha" : "1.000", 14 | "blue" : "61", 15 | "green" : "77" 16 | } 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /fastlane/Gymfile: -------------------------------------------------------------------------------- 1 | # For more information about this configuration visit 2 | # https://docs.fastlane.tools/actions/gym/#gymfile 3 | 4 | # In general, you can use the options available 5 | # fastlane gym --help 6 | 7 | # Remove the # in front of the line to enable the option 8 | 9 | # sdk("iphoneos9.0") 10 | 11 | silent(true) 12 | clean(true) 13 | output_directory("./build") 14 | scheme("PDFArchiver") 15 | workspace("PDFArchiver.xcworkspace") 16 | include_bitcode(true) 17 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x52", 9 | "green" : "0x4A", 10 | "red" : "0xB9" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/DarkRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x52", 9 | "green" : "0x4B", 10 | "red" : "0xBA" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/LightRed.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x67", 9 | "green" : "0x69", 10 | "red" : "0xE6" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | } 15 | ], 16 | "info" : { 17 | "author" : "xcode", 18 | "version" : 1 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/VerticalLabelStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // VerticalLabelStyle.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 18.01.21. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct VerticalLabelStyle: LabelStyle { 11 | @ViewBuilder 12 | func makeBody(configuration: Configuration) -> some View { 13 | VStack { 14 | configuration.icon 15 | configuration.title 16 | .font(.caption) 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Helpers/DateFormatter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateFormatter.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 09.09.20. 6 | // 7 | 8 | import Foundation 9 | 10 | extension DateFormatter { 11 | static func with(_ template: String) -> DateFormatter { 12 | let formatter = DateFormatter() 13 | formatter.locale = .autoupdatingCurrent 14 | formatter.setLocalizedDateFormatFromTemplate(template) 15 | return formatter 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/Extensions/NSTextField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSTextField.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 28.11.20. 6 | // 7 | 8 | #if os(macOS) 9 | import AppKit 10 | 11 | extension NSTextField { 12 | 13 | // disables the focues ring for all macOS textfields 14 | override open var focusRingType: NSFocusRingType { 15 | get { .none } 16 | // swiftlint:disable:next unused_setter_value 17 | set { } 18 | } 19 | } 20 | #endif 21 | -------------------------------------------------------------------------------- /ShareExtension/ShareExtension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.application-groups 8 | 9 | group.PDFArchiverShared 10 | 11 | com.apple.security.network.client 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /fastlane/metadata/en-US/release_notes.txt: -------------------------------------------------------------------------------- 1 | +++ "PDF Archive Viewer" becomes "PDF Archiver" +++ 2 | With this version the features of the macOS app will now land on your mobile phone! In addition, documents can now be easily scanned and processed with your iPhone. The intelligent text recognition helps you to tag the documents afterwards. It suggests tags and the date, so you only have to enter a description and archive the document. 3 | 4 | • Last view will be saved for the next app start. 5 | • Optical improvements 6 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveSharedConstantsTests/Helper/URL.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URL.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 07.01.21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension URL { 11 | func createDirectory() throws { 12 | try FileManager.default.createDirectory(at: self, withIntermediateDirectories: true, attributes: nil) 13 | } 14 | 15 | func writeFile(_ content: String = "Test") throws { 16 | try content.write(to: self, atomically: true, encoding: .utf8) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/workflows/XcodeBuildTest.yml: -------------------------------------------------------------------------------- 1 | name: Xcode Build Tests 2 | on: 3 | push: 4 | pull_request: 5 | jobs: 6 | macos: 7 | # runs-on: macOS-latest 8 | runs-on: macos-11.0 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v1 12 | - name: Build and Test 13 | run: "xcodebuild test -workspace PDFArchiver.xcworkspace -scheme iOS -destination 'platform=iOS Simulator,name=iPhone 11,OS=14.2'" 14 | env: 15 | DEVELOPER_DIR: /Applications/Xcode_12.2.app/Contents/Developer 16 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/ErrorHandling/AlertDataModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlertDataModel.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 19.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import SwiftUI 11 | 12 | public struct AlertDataModel: Identifiable { 13 | public let id = UUID() 14 | let title: LocalizedStringKey 15 | let message: LocalizedStringKey 16 | let primaryButton: Alert.Button 17 | let secondaryButton: Alert.Button? 18 | } 19 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/InAppPurchases/IAPError.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IAPError.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 28.10.20. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum IAPError: String, LocalizedError { 11 | case purchaseFailedProductNotFound 12 | 13 | public var errorDescription: String? { 14 | switch self { 15 | case .purchaseFailedProductNotFound: 16 | return NSLocalizedString("Purchase failed, because no subscription could be found.", comment: "") 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/InAppPurchases/IAPServiceAPI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IAPServiceAPI.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 28.10.20. 6 | // 7 | 8 | import Combine 9 | import StoreKit 10 | 11 | public protocol IAPServiceAPI: class { 12 | 13 | var productsPublisher: AnyPublisher, Never> { get } 14 | var appUsagePermitted: Bool { get } 15 | var appUsagePermittedPublisher: AnyPublisher { get } 16 | 17 | func buy(subscription: IAPService.SubscriptionType) throws 18 | func restorePurchases() 19 | } 20 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Extensions/URL.swift: -------------------------------------------------------------------------------- 1 | // 2 | // URL.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 03.01.21. 6 | // 7 | 8 | import Foundation 9 | 10 | extension URL { 11 | public func securityScope(closure: (URL) throws -> T) rethrows -> T { 12 | let didAccessSecurityScope = startAccessingSecurityScopedResource() 13 | defer { 14 | if didAccessSecurityScope { 15 | stopAccessingSecurityScopedResource() 16 | } 17 | } 18 | return try closure(self) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /fastlane/metadata/de-DE/release_notes.txt: -------------------------------------------------------------------------------- 1 | +++ "PDF Archive Viewer" wird zu "PDF Archiver" +++ 2 | Mit dieser Version landen nun die Feature der macOS Variante auf deinem Handy! Darüber hinaus können Dokumente nun einfach mit deinem iPhone eingescannt und verarbeitet werden. Die intelligente Texterkennung hilft dir anschließenden bei dem Taggen der Dokumente. Sie schlägt dir Tags und das Datum vor, sodass du nur noch eine Beschreibung eingeben musst und das Dokument archivieren kannst. 3 | 4 | • Die letzte App Ansicht wird für den nächsten App Start gespeichert. 5 | • Optische Anpassungen 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | 4 | 5 |
6 |
7 | 8 | 9 | 10 |

11 | 12 | The new PDF Archiver repository can be found [here](https://github.com/PDF-Archiver/PDF-Archiver). #HappyTagging :slightly_smiling_face: 13 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/find.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "find.pdf", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "template", 23 | "preserves-vector-representation" : true 24 | } 25 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/scan.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "scan.pdf", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "template", 23 | "preserves-vector-representation" : true 24 | } 25 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/tag-1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "tag.pdf", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "template", 23 | "preserves-vector-representation" : true 24 | } 25 | } -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Constants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Constants.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 14.05.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | public enum Constants { 10 | public static let sharedContainerIdentifier = "group.PDFArchiverShared" 11 | 12 | public static let documentDatePlaceholder = "PDFARCHIVER-TEMP-DATE" 13 | public static let documentDescriptionPlaceholder = "PDF-ARCHIVER-TEMP-DESCRIPTION-" 14 | public static let documentTagPlaceholder = "PDFARCHIVERTEMPTAG" 15 | } 16 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/start.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "start.pdf", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "template", 23 | "preserves-vector-representation" : true 24 | } 25 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/IntroIcons/piggy-bank.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "piggy-bank.pdf", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | }, 21 | "properties" : { 22 | "template-rendering-intent" : "template", 23 | "preserves-vector-representation" : true 24 | } 25 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | 3 | ## Build generated 4 | build/ 5 | DerivedData/ 6 | 7 | ## Various settings 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata/ 17 | 18 | ## Other 19 | *.moved-aside 20 | *.xccheckout 21 | *.xcscmblueprint 22 | 23 | ## Obj-C/Swift specific 24 | *.hmap 25 | *.ipa 26 | *.dSYM.zip 27 | *.dSYM 28 | 29 | Breakpoints_v2.xcbkptlist 30 | report.xml 31 | Preview.html 32 | screenshots.html 33 | 34 | fastlane/README.md 35 | Gemfile 36 | vendor 37 | Gemfile.lock 38 | .bundle 39 | ArchiveCore/.swiftpm 40 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/ResignKeyboardOnDragGesture.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ResignKeyboardOnDragGesture.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 15.06.20. 6 | // Copyright © 2020 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import SwiftUIX 11 | 12 | struct ResignKeyboardOnDragGesture: ViewModifier { 13 | func body(content: Content) -> some View { 14 | content.gesture( 15 | DragGesture().onChanged { _ in 16 | #if !os(macOS) 17 | Keyboard.main.dismiss() 18 | #endif 19 | } 20 | ) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Models/Document+TaggingStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Document+TaggingStatus.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 15.08.20. 6 | // 7 | 8 | extension Document { 9 | /// Tagging status of a document. 10 | /// 11 | /// - tagged: Document is already tagged. 12 | /// - untagged: Document that is not tagged. 13 | public enum TaggingStatus: String, Comparable, Codable { 14 | case tagged 15 | case untagged 16 | 17 | public static func < (lhs: TaggingStatus, rhs: TaggingStatus) -> Bool { 18 | return lhs == .untagged && rhs == .tagged 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /AppClip/AppClip.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.associated-domains 6 | 7 | appclips:pdf-archiver.io 8 | 9 | com.apple.developer.parent-application-identifiers 10 | 11 | $(AppIdentifierPrefix)de.JulianKahnert.PDFArchiveViewer 12 | 13 | com.apple.security.application-groups 14 | 15 | group.PDFArchiverShared 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/Extensions/View.swift: -------------------------------------------------------------------------------- 1 | // 2 | // View.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 10.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | extension View { 12 | func resignKeyboardOnDragGesture() -> some View { 13 | return modifier(ResignKeyboardOnDragGesture()) 14 | } 15 | 16 | @ViewBuilder 17 | func wrapNavigationView(when value: Bool) -> some View { 18 | if value { 19 | NavigationView { 20 | self 21 | } 22 | } else { 23 | self 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Extensions/FileManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileManager.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 17.11.20. 6 | // 7 | 8 | import Foundation 9 | 10 | extension FileManager { 11 | var iCloudDriveURL: URL? { 12 | url(forUbiquityContainerIdentifier: nil)?.appendingPathComponent("Documents") 13 | } 14 | 15 | #if !os(macOS) 16 | var appContainerURL: URL { 17 | urls(for: .documentDirectory, in: .userDomainMask)[0] 18 | } 19 | #endif 20 | 21 | #if os(macOS) 22 | var documentsDirectoryURL: URL { 23 | urls(for: .documentDirectory, in: .userDomainMask)[0] 24 | } 25 | #endif 26 | } 27 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Extensions/Array.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Array.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 22.08.20. 6 | // 7 | 8 | import Foundation 9 | 10 | extension Array: Log {} 11 | 12 | extension Array where Array.Element == URL { 13 | 14 | func getUniqueParents() -> [URL] { 15 | let newFolders = self.filter { currentFolder in 16 | let hasParent = self.contains { observedFolder in 17 | observedFolder != currentFolder && 18 | currentFolder.path.starts(with: observedFolder.path) 19 | } 20 | return !hasParent 21 | } 22 | return newFolders 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: JulianKahnert 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with a single custom sponsorship URL 13 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Extensions/CIImage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CIImage.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 06.11.20. 6 | // 7 | 8 | #if os(macOS) 9 | import AppKit 10 | #else 11 | import UIKit.UIImage 12 | #endif 13 | 14 | extension CIImage { 15 | func jpegData(compressionQuality quality: CGFloat) -> Data? { 16 | #if os(macOS) 17 | let bitmapRep = NSBitmapImageRep(ciImage: self) 18 | let jpegData = bitmapRep.representation(using: .jpeg, properties: [.compressionFactor: NSNumber(value: Float(quality))]) 19 | 20 | return jpegData 21 | #else 22 | return UIImage(ciImage: self).jpegData(compressionQuality: quality) 23 | #endif 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Helpers/Atomic.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Atomic.swift 3 | // ArchiveLib 4 | // 5 | // Created by Julian Kahnert on 05.01.19. 6 | // 7 | // Source from: https://www.objc.io/blog/2018/12/18/atomic-variables/ 8 | 9 | import Foundation 10 | 11 | public final class Atomic { 12 | private let queue = DispatchQueue(label: UUID().uuidString) 13 | private var _value: A 14 | public init(_ value: A) { 15 | self._value = value 16 | } 17 | 18 | public var value: A { 19 | return queue.sync { self._value } 20 | } 21 | 22 | public func mutate(_ transform: (inout A) -> Void) { 23 | queue.sync { 24 | transform(&self._value) 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /AppClip/AppClipIAPService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppClipIAPService.swift 3 | // AppClip 4 | // 5 | // Created by Julian Kahnert on 23.10.20. 6 | // 7 | 8 | import ArchiveBackend 9 | import Combine 10 | import InAppPurchases 11 | import StoreKit 12 | 13 | final class AppClipIAPService: IAPServiceAPI { 14 | 15 | var productsPublisher: AnyPublisher, Never> { 16 | Just([]).eraseToAnyPublisher() 17 | } 18 | 19 | var appUsagePermitted: Bool = true 20 | 21 | var appUsagePermittedPublisher: AnyPublisher { 22 | Just(appUsagePermitted).eraseToAnyPublisher() 23 | } 24 | 25 | func buy(subscription: IAPService.SubscriptionType) throws { } 26 | 27 | func restorePurchases() { } 28 | } 29 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/Design/WidthSyncedRow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WidthSyncedRow.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 06.06.20. 6 | // Copyright © 2020 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct WidthSyncedRow: View { 12 | private let spacing: CGFloat 13 | private let content: Content 14 | @State private var childWidth: CGFloat? 15 | 16 | init(spacing: CGFloat, @ViewBuilder content: () -> Content) { 17 | self.spacing = spacing 18 | self.content = content() 19 | } 20 | 21 | var body: some View { 22 | HStack(spacing: spacing) { 23 | content.frame(width: childWidth) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MissingViews/LoadingView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LoadingView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 25.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import SwiftUIX 11 | 12 | struct LoadingView: View { 13 | var body: some View { 14 | VStack(alignment: .center, spacing: 32.0) { 15 | ProgressView() 16 | .progressViewStyle(CircularProgressViewStyle()) 17 | .scaleEffect(2, anchor: .center) 18 | Text("Loading documents ...") 19 | } 20 | } 21 | } 22 | 23 | struct LoadingView_Previews: PreviewProvider { 24 | static var previews: some View { 25 | LoadingView() 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/FolderAccess/FolderProvider.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FolderProvider.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 16.08.20. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol FolderProvider: class, Log { 11 | typealias FolderChangeHandler = (FolderProvider, [FileChange]) -> Void 12 | 13 | static func canHandle(_ url: URL) -> Bool 14 | 15 | var baseUrl: URL { get } 16 | 17 | init(baseUrl: URL, _ handler: @escaping FolderChangeHandler) 18 | 19 | func save(data: Data, at: URL) throws 20 | func startDownload(of: URL) throws 21 | func fetch(url: URL) throws -> Data 22 | func delete(url: URL) throws 23 | func rename(from: URL, to: URL) throws 24 | func getCreationDate(of: URL) throws -> Date? 25 | } 26 | -------------------------------------------------------------------------------- /Shared/Resources/PDFArchiver.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.icloud-container-identifiers 6 | 7 | iCloud.de.JulianKahnert.PDFArchiver 8 | 9 | com.apple.developer.icloud-services 10 | 11 | CloudDocuments 12 | 13 | com.apple.developer.ubiquity-container-identifiers 14 | 15 | iCloud.de.JulianKahnert.PDFArchiver 16 | 17 | com.apple.security.application-groups 18 | 19 | group.PDFArchiverShared 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Smartphone information:** 27 | - Device: [e.g. iPhone6] 28 | - OS: [e.g. iOS8.1] 29 | - Version [e.g. 2.0.3 (5)] 30 | 31 | **Additional context** 32 | Add any other context about the problem here. 33 | -------------------------------------------------------------------------------- /PDFArchiver.xcodeproj/xcshareddata/xcbaselines/3489D72A24A3C53E0035E64F.xcbaseline/7712990D-DD3E-4FB5-BF56-3FCD157BC908.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | classNames 6 | 7 | Tests_iOS 8 | 9 | testLaunchPerformance() 10 | 11 | com.apple.dt.XCTMetric_ApplicationLaunch-ApplicationFirstFramePresentationResponsive.duration 12 | 13 | baselineAverage 14 | 2.0575 15 | baselineIntegrationDisplayName 16 | Local Baseline 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/ArchiveTab/DocumentDetailViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DocumentDetailViewModel.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 30.10.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import PDFKit 11 | 12 | final class DocumentDetailViewModel: ObservableObject { 13 | let document: Document 14 | @Published var pdfDocument: PDFDocument? 15 | @Published var showActivityView: Bool = false 16 | var activityItems: [Any] { 17 | [document.path] 18 | } 19 | 20 | init(_ document: Document) { 21 | self.document = document 22 | pdfDocument = PDFDocument(url: document.path) 23 | } 24 | 25 | func viewAppeared() { 26 | FeedbackGenerator.selectionChanged() 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/helper/Bundle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Bundle.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 02.12.20. 6 | // 7 | // swiftlint:disable force_unwrapping 8 | 9 | import Foundation 10 | 11 | extension Bundle { 12 | static let longTextPDFUrl = URL(fileURLWithPath: Bundle.module.path(forResource: "AVB_PlusGarantie_EP_Zurich_01102019", ofType: "pdf", inDirectory: "assets")!) 13 | static let billPDFUrl = URL(fileURLWithPath: Bundle.module.path(forResource: "document1", ofType: "pdf", inDirectory: "assets")!) 14 | static let billPNGUrl = URL(fileURLWithPath: Bundle.module.path(forResource: "document1", ofType: "png", inDirectory: "assets")!) 15 | static let billJPGGUrl = URL(fileURLWithPath: Bundle.module.path(forResource: "document1", ofType: "jpg", inDirectory: "assets")!) 16 | } 17 | -------------------------------------------------------------------------------- /Tests iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Tests macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /UITests iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist.latest_result.txt: -------------------------------------------------------------------------------- 1 | name: Diagnostics, nameSpecified: , owner: WeTransfer, version: 1.7.0 2 | 3 | name: KeyboardObserving, nameSpecified: , owner: nickffox, version: 0.3.0 4 | 5 | name: LoggingKit, nameSpecified: , owner: PDF-Archiver, version: 1.1.4 6 | 7 | name: LogModel, nameSpecified: , owner: PDF-Archiver, version: 0.0.4 8 | 9 | name: paper-onboarding, nameSpecified: , owner: Ramotion, version: 6.1.5 10 | 11 | name: sentry-cocoa, nameSpecified: , owner: getsentry, version: 5.1.6 12 | 13 | name: swift-log, nameSpecified: , owner: apple, version: 1.2.0 14 | 15 | name: SwiftUIX, nameSpecified: , owner: SwiftUIX, version: 16 | 17 | name: SwiftyStoreKit, nameSpecified: , owner: bizz84, version: 0.16.0 18 | 19 | add-version-numbers: true 20 | 21 | LicensePlist Version: 2.15.0 -------------------------------------------------------------------------------- /.bartycrouch.toml: -------------------------------------------------------------------------------- 1 | [update] 2 | tasks = ["interfaces", "code", "transform", "normalize"] 3 | 4 | [update.interfaces] 5 | path = "PDFArchiver/" 6 | defaultToBase = false 7 | ignoreEmptyStrings = false 8 | unstripped = false 9 | 10 | [update.code] 11 | codePath = "PDFArchiver/" 12 | localizablePath = "." 13 | defaultToKeys = false 14 | additive = true 15 | unstripped = false 16 | 17 | [update.transform] 18 | codePath = "PDFArchiver/" 19 | localizablePath = "PDFArchiver/Localizable.strings" 20 | transformer = "foundation" 21 | supportedLanguageEnumPath = "PDFArchiver/Resources/" 22 | typeName = "BartyCrouch" 23 | translateMethodName = "translate" 24 | 25 | [update.normalize] 26 | path = "PDFArchiver/" 27 | sourceLocale = "en" 28 | harmonizeWithSource = true 29 | sortByKeys = true 30 | 31 | [lint] 32 | path = "PDFArchiver/" 33 | duplicateKeys = true 34 | emptyValues = true 35 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/Root.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | DefaultValue 9 | 3.2.2 (4) 10 | Key 11 | version_preference 12 | Title 13 | Version 14 | Type 15 | PSTitleValueSpecifier 16 | 17 | 18 | File 19 | com.mono0926.LicensePlist 20 | Title 21 | Licenses 22 | Type 23 | PSChildPaneSpecifier 24 | 25 | 26 | StringsTable 27 | Root 28 | 29 | 30 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/KeyboardBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0xD0", 13 | "alpha" : "1.000", 14 | "blue" : "0xD9", 15 | "green" : "0xD3" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "28", 31 | "alpha" : "0.975", 32 | "blue" : "30", 33 | "green" : "29" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/PlaceholderGray.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.850", 13 | "alpha" : "1.000", 14 | "blue" : "0.850", 15 | "green" : "0.850" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.400", 31 | "alpha" : "1.000", 32 | "blue" : "0.400", 33 | "green" : "0.400" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/LightGray.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "display-p3", 11 | "components" : { 12 | "red" : "0.213", 13 | "alpha" : "1.000", 14 | "blue" : "0.286", 15 | "green" : "0.242" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "display-p3", 29 | "components" : { 30 | "red" : "0xD0", 31 | "alpha" : "1.000", 32 | "blue" : "0xD9", 33 | "green" : "0xD3" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/White.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "display-p3", 11 | "components" : { 12 | "red" : "0.980", 13 | "alpha" : "1.000", 14 | "blue" : "0.980", 15 | "green" : "0.980" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "display-p3", 29 | "components" : { 30 | "red" : "0.067", 31 | "alpha" : "1.000", 32 | "blue" : "0.141", 33 | "green" : "0.102" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/DarkGray.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0x3A", 9 | "green" : "0x2B", 10 | "red" : "0x21" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "display-p3", 24 | "components" : { 25 | "alpha" : "1.000", 26 | "blue" : "0.980", 27 | "green" : "0.980", 28 | "red" : "0.980" 29 | } 30 | }, 31 | "idiom" : "universal" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/PDFBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "universal", 9 | "color" : { 10 | "color-space" : "display-p3", 11 | "components" : { 12 | "red" : "0.213", 13 | "alpha" : "1.000", 14 | "blue" : "0.286", 15 | "green" : "0.242" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "universal", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "display-p3", 29 | "components" : { 30 | "red" : "0.067", 31 | "alpha" : "1.000", 32 | "blue" : "0.141", 33 | "green" : "0.102" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist.latest_result.txt: -------------------------------------------------------------------------------- 1 | name: ASN1Swift, nameSpecified: ASN1Swift, owner: tikhop, version: 1.2.4 2 | 3 | name: DeepDiff, nameSpecified: DeepDiff, owner: onmyway133, version: 2.3.1 4 | 5 | name: Diagnostics, nameSpecified: Diagnostics, owner: WeTransfer, version: 1.8.0 6 | 7 | name: Down, nameSpecified: Down, owner: iwasrobbed, version: 0.9.4 8 | 9 | name: GraphicsRenderer, nameSpecified: GraphicsRenderer, owner: shaps80, version: 1.4.4 10 | 11 | name: Parma, nameSpecified: Parma, owner: dasautoooo, version: 0.2.0 12 | 13 | name: sentry-cocoa, nameSpecified: Sentry, owner: getsentry, version: 6.1.3 14 | 15 | name: swift-log, nameSpecified: swift-log, owner: apple, version: 1.4.0 16 | 17 | name: SwiftUIX, nameSpecified: SwiftUIX, owner: SwiftUIX, version: 18 | 19 | name: TPInAppReceipt, nameSpecified: TPInAppReceipt, owner: tikhop, version: 20 | 21 | add-version-numbers: true 22 | 23 | LicensePlist Version: 3.0.5 -------------------------------------------------------------------------------- /iOS/PDFArchiver.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.icloud-container-identifiers 6 | 7 | iCloud.de.JulianKahnert.PDFArchiver 8 | 9 | com.apple.developer.icloud-services 10 | 11 | CloudDocuments 12 | 13 | com.apple.developer.ubiquity-container-identifiers 14 | 15 | iCloud.de.JulianKahnert.PDFArchiver 16 | 17 | com.apple.security.app-sandbox 18 | 19 | com.apple.security.application-groups 20 | 21 | group.PDFArchiverShared 22 | 23 | com.apple.security.device.camera 24 | 25 | com.apple.security.network.client 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/PlatfromSpecific/PhantomViewModifiers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PhantomViewModifiers.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 08.11.20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | #if os(macOS) 11 | extension View { 12 | func navigationBarHidden(_ value: Bool) -> some View { 13 | self 14 | } 15 | 16 | func navigationBarTitle(_ title: Text, displayMode: NavigationBarItem.TitleDisplayMode = .inline) -> some View { 17 | self 18 | } 19 | 20 | func navigationBarItems(leading: L, trailing: T) -> some View where L: View, T: View { 21 | self 22 | } 23 | 24 | func navigationBarItems(leading: L) -> some View where L: View { 25 | self 26 | } 27 | 28 | func navigationBarItems(trailing: T) -> some View where T: View { 29 | self 30 | } 31 | } 32 | 33 | enum NavigationBarItem { 34 | enum TitleDisplayMode { 35 | case inline 36 | } 37 | } 38 | #endif 39 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Models/TagIndex.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TagIndex.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 10.02.20. 6 | // 7 | 8 | import Foundation 9 | 10 | public struct TagIndex { 11 | private var content = [IndexElement: Set]() 12 | 13 | mutating func add(_ elements: Set, for key: IndexElement) { 14 | content[key, default: Set()].formUnion(elements) 15 | } 16 | 17 | mutating func add(_ elements: Set) { 18 | for element in elements { 19 | let otherElements = elements.subtracting(Set([element])) 20 | content[element, default: Set()].formUnion(otherElements) 21 | } 22 | } 23 | 24 | public func getElements(for key: IndexElement) -> Set { 25 | content[key] ?? Set() 26 | } 27 | 28 | public subscript(key: IndexElement) -> Set { 29 | getElements(for: key) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MissingViews/PlaceholderView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaceholderView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 14.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct PlaceholderView: View { 12 | let name: LocalizedStringKey 13 | var body: some View { 14 | VStack { 15 | Image("Logo") 16 | .resizable() 17 | .frame(width: 100.0, height: 100.0, alignment: .leading) 18 | .padding() 19 | Text(name) 20 | .font(.body) 21 | .multilineTextAlignment(.center) 22 | .frame(maxWidth: 400.0) 23 | } 24 | } 25 | } 26 | 27 | struct PlaceholderView_Previews: PreviewProvider { 28 | static var previews: some View { 29 | PlaceholderView(name: "No iCloud Drive documents found. Please scan and tag documents first.") 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/ArrayUrlTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArrayUrlTests.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 22.08.20. 6 | // 7 | // swiftlint:disable force_unwrapping 8 | 9 | @testable import ArchiveBackend 10 | import Foundation 11 | import XCTest 12 | 13 | final class ArrayURLTests: XCTestCase { 14 | 15 | override func setUp() { 16 | super.setUp() 17 | } 18 | 19 | func testParents() { 20 | let url1 = URL(string: "/test/folder1/archive/untagged")! 21 | let url2 = URL(string: "/test/folder1/archive")! 22 | let url3 = URL(string: "/test/folder2/scans")! 23 | let url4 = URL(string: "/test/folder1/archive/untagged/temp")! 24 | let url5 = URL(string: "/test/folder2")! 25 | 26 | let folders = [url1, url2, url3, url4, url5].getUniqueParents() 27 | 28 | XCTAssert(folders.contains(url2)) 29 | XCTAssert(folders.contains(url5)) 30 | XCTAssertEqual(folders.count, 2) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MarkdownView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MarkdownView.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 28.11.20. 6 | // 7 | 8 | import Parma 9 | import SwiftUI 10 | import SwiftUIX 11 | 12 | struct MarkdownView: View { 13 | var title: LocalizedStringKey 14 | var markdown: String 15 | var body: some View { 16 | NavigationLink { 17 | LazyView { 18 | ScrollView { 19 | Parma(markdown) 20 | } 21 | .padding(.horizontal, 16) 22 | } 23 | .navigationTitle(title) 24 | } label: { 25 | Text(title) 26 | } 27 | } 28 | } 29 | 30 | struct MarkdownView_Previews: PreviewProvider { 31 | static var previews: some View { 32 | MarkdownView(title: "Markdown View", markdown: """ 33 | # Title 34 | This is a test list: 35 | * item 1 36 | * item 2 37 | * item 3 38 | """) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MissingViews/DetailRowView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailRowView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 13.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct DetailRowView: View { 12 | let name: LocalizedStringKey 13 | let action: () -> Void 14 | var body: some View { 15 | Button(action: { 16 | self.action() 17 | }, label: { 18 | HStack { 19 | Text(name) 20 | // Spacer() 21 | // Image(systemName: "chevron.right") 22 | // .foregroundColor(Color(.quaternaryLabel)) 23 | // .font(.system(.headline)) 24 | }.accentColor(.primary) 25 | }) 26 | } 27 | } 28 | 29 | struct DetailRowVIew_Previews: PreviewProvider { 30 | static var previews: some View { 31 | DetailRowView(name: "Test Row") { 32 | print("Row Tapped") 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Models/Document+Hashable+Comparable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Document+Hashable+Comparable.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 15.08.20. 6 | // 7 | 8 | extension Document: Hashable, Comparable { 9 | 10 | public static func < (lhs: Document, rhs: Document) -> Bool { 11 | 12 | // first: sort by date 13 | // second: sort by filename 14 | if let lhsdate = lhs.date, 15 | let rhsdate = rhs.date, 16 | lhsdate != rhsdate { 17 | return lhsdate < rhsdate 18 | } 19 | return lhs.path.absoluteString > rhs.path.absoluteString 20 | } 21 | 22 | public static func == (lhs: Document, rhs: Document) -> Bool { 23 | // "==" and hashValue must only compare the path to avoid duplicates in sets 24 | return lhs.id == rhs.id 25 | } 26 | 27 | // "==" and hashValue must only compare the path to avoid duplicates in sets 28 | public func hash(into hasher: inout Hasher) { 29 | hasher.combine(id) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /macOS/macOS.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.developer.icloud-container-identifiers 6 | 7 | iCloud.de.JulianKahnert.PDFArchiver 8 | 9 | com.apple.developer.icloud-services 10 | 11 | CloudDocuments 12 | 13 | com.apple.developer.ubiquity-container-identifiers 14 | 15 | iCloud.de.JulianKahnert.PDFArchiver 16 | 17 | com.apple.security.app-sandbox 18 | 19 | com.apple.security.application-groups 20 | 21 | group.PDFArchiverShared 22 | 23 | com.apple.security.files.bookmarks.app-scope 24 | 25 | com.apple.security.files.user-selected.read-write 26 | 27 | com.apple.security.network.client 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Tests iOS/TestsIOS.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tests_iOS.swift 3 | // Tests iOS 4 | // 5 | // Created by Julian Kahnert on 24.06.20. 6 | // 7 | 8 | // @testable import PDFArchiver 9 | import XCTest 10 | 11 | final class TestsIOS: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | try super.setUpWithError() 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | 17 | // In UI tests it is usually best to stop immediately when a failure occurs. 18 | continueAfterFailure = false 19 | 20 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 21 | } 22 | 23 | func testLaunchPerformance() throws { 24 | // This measures how long it takes to launch your application. 25 | measure(metrics: [XCTApplicationLaunchMetric(waitUntilResponsive: true)]) { 26 | XCUIApplication().launch() 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MissingViews/ClearButton.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ClearingTextField.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 28.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ClearButton: ViewModifier { 12 | @Binding var text: String 13 | 14 | func body(content: Content) -> some View { 15 | HStack { 16 | content 17 | Spacer() 18 | // onTapGesture is better than a Button here when adding to a form 19 | Image(systemName: "multiply.circle.fill") 20 | .foregroundColor(.secondary) 21 | .opacity(text.isEmpty ? 0 : 1) 22 | .onTapGesture { self.text = "" } 23 | } 24 | } 25 | } 26 | 27 | struct ClearingTextField_Previews: PreviewProvider { 28 | @State static var text = "Test" 29 | static var previews: some View { 30 | TextField("Placeholder", text: $text) 31 | .modifier(ClearButton(text: $text)) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/ErrorHandling/Alert.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Alert.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 16.12.20. 6 | // 7 | 8 | import Logging 9 | import SwiftUI 10 | 11 | extension Alert { 12 | static var log: Logger { 13 | Logger(label: String(describing: self)) 14 | } 15 | 16 | public static func create(from viewModel: AlertDataModel) -> Alert { 17 | Self.log.error("An error was presented", metadata: ["type": "custom", "title": "\(viewModel.title)"]) 18 | 19 | if let secondaryButton = viewModel.secondaryButton { 20 | return Alert(title: Text(viewModel.title), 21 | message: Text(viewModel.message), 22 | primaryButton: viewModel.primaryButton, 23 | secondaryButton: secondaryButton) 24 | } else { 25 | return Alert(title: Text(viewModel.title), 26 | message: Text(viewModel.message), 27 | dismissButton: viewModel.primaryButton) 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Helpers/UserNotification.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 14.09.20. 6 | // 7 | 8 | import UserNotifications 9 | 10 | public enum UserNotification: Log { 11 | #if DEBUG 12 | public static func schedule(title: String, message: String) { 13 | let notificationCenter = UNUserNotificationCenter.current() 14 | 15 | let content = UNMutableNotificationContent() 16 | content.title = "[DEBUG] \(title)" 17 | content.body = message 18 | content.sound = .default 19 | 20 | let request = UNNotificationRequest( 21 | identifier: "de.JulianKahnert.PDFArchiver.notifications.debug-\(UUID().uuidString)", 22 | content: content, 23 | trigger: UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false) 24 | ) 25 | 26 | notificationCenter.add(request) { error in 27 | if error != nil { 28 | Self.log.errorAndAssert("Notification could not be scheduled.") 29 | } 30 | } 31 | } 32 | #endif 33 | } 34 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/CustomDiagnosticsReporter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CustomDiagnosticsReporter.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 07.11.20. 6 | // 7 | 8 | import Diagnostics 9 | import Foundation 10 | 11 | struct CustomDiagnosticsReporter: DiagnosticsReporting { 12 | static func report() -> DiagnosticsChapter { 13 | let documents = ArchiveStore.shared.documents 14 | let taggedCount = documents 15 | .filter { $0.taggingStatus == .tagged } 16 | .count 17 | let untaggedCount = documents.count - taggedCount 18 | 19 | let diagnostics: [String: String] = [ 20 | "Environment": AppEnvironment.get().rawValue, 21 | "Version": AppEnvironment.getFullVersion(), 22 | "Number of tagged Documents": String(taggedCount), 23 | "Number of untagged Documents": String(untaggedCount), 24 | "Subscription Expiry Date": UserDefaults.appGroup.subscriptionExpiryDate?.description ?? "NULL" 25 | ] 26 | return DiagnosticsChapter(title: "App Environment", diagnostics: diagnostics) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ArchiveCore/.swiftpm/xcode/xcshareddata/xcbaselines/ArchiveCoreTests.xcbaseline/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | runDestinationsByUUID 6 | 7 | CBC450F9-0FD6-4ABA-8152-BE739023F8FC 8 | 9 | localComputer 10 | 11 | busSpeedInMHz 12 | 400 13 | cpuCount 14 | 1 15 | cpuKind 16 | 6-Core Intel Core i7 17 | cpuSpeedInMHz 18 | 2600 19 | logicalCPUCoresPerPackage 20 | 12 21 | modelCode 22 | MacBookPro15,1 23 | physicalCPUCoresPerPackage 24 | 6 25 | platformIdentifier 26 | com.apple.platform.macosx 27 | 28 | targetArchitecture 29 | x86_64 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /fastlane/Snapfile: -------------------------------------------------------------------------------- 1 | # Uncomment the lines below you want to change by removing the # in the beginning 2 | 3 | # A list of devices you want to take the screenshots from 4 | devices([ 5 | "iPhone 8", # 4.7 inch 6 | "iPhone 8 Plus", # 5.5 inch 7 | "iPhone SE", # 4.0 inch 8 | "iPhone Xs Max", 9 | "iPhone X", 10 | "iPad Pro (12.9-inch) (2nd generation)", 11 | # "iPad Pro (9.7-inch)", 12 | # "Apple TV 1080p" 13 | ]) 14 | 15 | languages([ 16 | "en-US", 17 | "de-DE", 18 | # "it-IT", 19 | # ["pt", "pt_BR"] # Portuguese with Brazilian locale 20 | ]) 21 | 22 | # The name of the scheme which contains the UI Tests 23 | # scheme("SchemeName") 24 | 25 | # Where should the resulting screenshots be stored? 26 | output_directory("./fastlane/screenshots") 27 | 28 | # remove the '#' to clear all previously generated screenshots before creating new ones 29 | # clear_previous_screenshots(true) 30 | 31 | # Arguments to pass to the app on launch. See https://docs.fastlane.tools/actions/snapshot/#launch-arguments 32 | # launch_arguments(["-favColor red"]) 33 | 34 | # For more information about all available options run 35 | # fastlane action snapshot 36 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Tab.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tab.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 28.08.20. 6 | // 7 | 8 | import Combine 9 | import SwiftUI 10 | 11 | public enum Tab: String, CaseIterable, Identifiable, Hashable, Equatable { 12 | case scan, tag, archive 13 | #if !os(macOS) 14 | case more 15 | #endif 16 | 17 | public var id: String { rawValue } 18 | public var name: LocalizedStringKey { 19 | if self == .scan { 20 | #if os(macOS) 21 | return "Import" 22 | #else 23 | return "Scan" 24 | #endif 25 | } else { 26 | return LocalizedStringKey(rawValue.capitalized) 27 | } 28 | } 29 | public var iconName: String { 30 | switch self { 31 | case .scan: 32 | return "doc.text.viewfinder" 33 | case .tag: 34 | return "tag" 35 | case .archive: 36 | return "archivebox" 37 | #if !os(macOS) 38 | case .more: 39 | return "ellipsis" 40 | #endif 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Notification.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Notification.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 30.10.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension Notification.Name { 12 | static let introChanges = Notification.Name("intro-changes") 13 | static let imageProcessingQueue = Notification.Name("ImageConverter.queueLength") 14 | static let showSubscriptionView = Notification.Name("show-subscription-view") 15 | static let suggestionChange = Notification.Name("suggestion-change") 16 | static let foundProcessedDocument = Notification.Name("found-processed-document") 17 | static let showSendDiagnosticsReport = Notification.Name("show-send-diagnostics-report") 18 | } 19 | 20 | public extension Notification { 21 | static let introChanges = Notification(name: .introChanges) 22 | static let showSubscriptionView = Notification(name: .showSubscriptionView) 23 | static let suggestionChange = Notification(name: .suggestionChange) 24 | static let foundProcessedDocument = Notification(name: .foundProcessedDocument) 25 | } 26 | -------------------------------------------------------------------------------- /macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | PDF Archiver 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | ITSAppUsesNonExemptEncryption 24 | 25 | LSApplicationCategoryType 26 | public.app-category.productivity 27 | LSMinimumSystemVersion 28 | $(MACOSX_DEPLOYMENT_TARGET) 29 | 30 | 31 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/Design/SubscriptionButtonStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubscriptionButtonStyle.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 06.06.20. 6 | // Copyright © 2020 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | import SwiftUIX 11 | 12 | struct SubscriptionButtonStyle: ButtonStyle { 13 | 14 | private let foregroundColor: Color = .systemBackground 15 | private let backgroundColor: Color = .paDarkGray 16 | var isPreferred: Bool = false 17 | 18 | func makeBody(configuration: Self.Configuration) -> some View { 19 | configuration.label 20 | .padding(12.0) 21 | .frame(maxWidth: 350.0) 22 | .foregroundColor(isPreferred ? foregroundColor : backgroundColor) 23 | .background(isPreferred ? backgroundColor : foregroundColor) 24 | .cornerRadius(8) 25 | .overlay( 26 | RoundedRectangle(cornerRadius: 8) 27 | .stroke(isPreferred ? foregroundColor : backgroundColor, lineWidth: 1) 28 | ) 29 | .shadow(radius: isPreferred ? 4 : 0) 30 | .scaleEffect(configuration.isPressed ? 0.95 : 1.0) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /AppClip/PDFSharingViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PDFSharingViewModel.swift 3 | // AppClip 4 | // 5 | // Created by Julian Kahnert on 23.10.20. 6 | // 7 | 8 | import ArchiveSharedConstants 9 | import Combine 10 | import PDFKit 11 | import SwiftUI 12 | 13 | final class PDFSharingViewModel: ObservableObject, Equatable { 14 | static func == (lhs: PDFSharingViewModel, rhs: PDFSharingViewModel) -> Bool { 15 | lhs.pdfDocument == rhs.pdfDocument && lhs.sharingUrl == rhs.sharingUrl 16 | } 17 | 18 | @Published var error: Error? 19 | @Published var pdfDocument: PDFDocument? 20 | @Published var sharingUrl: URL? 21 | 22 | private var disposables = Set() 23 | 24 | func shareDocument() { 25 | withAnimation { 26 | self.sharingUrl = self.pdfDocument?.documentURL 27 | } 28 | } 29 | 30 | func delete() { 31 | withAnimation { 32 | self.pdfDocument = nil 33 | guard let sharingUrl = self.sharingUrl else { return } 34 | do { 35 | try FileManager.default.removeItem(at: sharingUrl) 36 | } catch { 37 | NotificationCenter.default.postAlert(error) 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/PlatformSpecificWrapper/FeedbackGenerator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FeedbackGenerator.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 07.11.20. 6 | // 7 | 8 | #if canImport(UIKit) 9 | import UIKit 10 | #endif 11 | 12 | public enum FeedbackGenerator { 13 | 14 | public enum FeedbackType { 15 | case success, warning, error 16 | } 17 | 18 | #if canImport(UIKit) 19 | private static let notificationFeedback = UINotificationFeedbackGenerator() 20 | private static let selectionFeedback = UISelectionFeedbackGenerator() 21 | #endif 22 | 23 | public static func selectionChanged() { 24 | #if canImport(UIKit) 25 | selectionFeedback.prepare() 26 | selectionFeedback.selectionChanged() 27 | #endif 28 | } 29 | 30 | public static func notify(_ status: FeedbackType) { 31 | #if canImport(UIKit) 32 | notificationFeedback.prepare() 33 | 34 | let type: UINotificationFeedbackGenerator.FeedbackType 35 | switch status { 36 | case .success: 37 | type = .success 38 | case .warning: 39 | type = .warning 40 | case .error: 41 | type = .error 42 | } 43 | notificationFeedback.notificationOccurred(type) 44 | #endif 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MissingViews/InputAccessoryView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InputAccessoryView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 08.07.20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct InputAccessoryView: View { 11 | 12 | let items: [String] 13 | let callback: (String) -> Void 14 | 15 | var body: some View { 16 | HStack { 17 | ForEach(0.. some View { 23 | configuration.label 24 | .padding(12) 25 | .frame(maxWidth: 350) 26 | .foregroundColor(isInverted ? backgroundColor : foregroundColor) 27 | .background(isInverted ? foregroundColor : backgroundColor) 28 | .cornerRadius(8) 29 | .overlay( 30 | RoundedRectangle(cornerRadius: 8) 31 | .stroke(foregroundColor, lineWidth: 1) 32 | ) 33 | .scaleEffect(configuration.isPressed ? 0.95 : 1.0) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Search/FilterItem+FilterCache.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FilterItem+FilterCache.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 09.09.20. 6 | // 7 | 8 | import Foundation 9 | 10 | extension FilterItem { 11 | public final class FilterCache { 12 | public typealias DateTriple = (year: String, yearMonth: String, yearMonthDay: String) 13 | 14 | public let yearFormatter: DateFormatter = .with("yyyy") 15 | public let yearMonthFormatter: DateFormatter = .with("yyyyMM") 16 | public let yearMonthDayFormatter: DateFormatter = .with("yyyyMMdd") 17 | 18 | private var dateMap: [Date: DateTriple] = [:] 19 | private let mapAccessQueue = DispatchQueue(label: "FilterCacheQueue") 20 | 21 | public func getTriple(for date: Date) -> DateTriple { 22 | mapAccessQueue.sync { 23 | if let triple = dateMap[date] { 24 | return triple 25 | } else { 26 | let year = yearFormatter.string(from: date) 27 | let yearMonth = yearMonthFormatter.string(from: date) 28 | let yearMonthDay = yearMonthDayFormatter.string(from: date) 29 | let triple: DateTriple = (year, yearMonth, yearMonthDay) 30 | 31 | dateMap[date] = triple 32 | return triple 33 | } 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/FolderAccess/FileChange.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileChange.swift 3 | // 4 | // Created by Julian Kahnert on 17.08.20. 5 | // 6 | 7 | import DeepDiff 8 | import Foundation 9 | 10 | public enum FileChange { 11 | case added(Details) 12 | case updated(Details) 13 | case removed(URL) 14 | 15 | public struct Details: Equatable { 16 | let url: URL 17 | let filename: String 18 | let size: Int 19 | let downloadStatus: DownloadStatus 20 | 21 | init(url: URL, filename: String, size: Int, downloadStatus: FileChange.DownloadStatus) { 22 | self.url = url 23 | self.filename = filename 24 | self.size = size 25 | self.downloadStatus = downloadStatus 26 | } 27 | 28 | /// This should only be used while testing. 29 | init(fileUrl: URL, size: Int = 42, downloadStatus: FileChange.DownloadStatus = .local) { 30 | self.url = fileUrl 31 | self.filename = fileUrl.lastPathComponent 32 | self.size = size 33 | self.downloadStatus = downloadStatus 34 | } 35 | } 36 | } 37 | 38 | extension FileChange.Details: DiffAware { 39 | public typealias DiffId = URL 40 | 41 | public var diffId: URL { 42 | url 43 | } 44 | 45 | public static func compareContent(_ lhs: FileChange.Details, _ rhs: FileChange.Details) -> Bool { 46 | lhs == rhs 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/Background.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.980", 9 | "green" : "0.980", 10 | "red" : "0.980" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "platform" : "ios", 24 | "reference" : "systemBackgroundColor" 25 | }, 26 | "idiom" : "universal" 27 | }, 28 | { 29 | "color" : { 30 | "color-space" : "display-p3", 31 | "components" : { 32 | "alpha" : "1.000", 33 | "blue" : "0.980", 34 | "green" : "0.980", 35 | "red" : "0.980" 36 | } 37 | }, 38 | "idiom" : "mac" 39 | }, 40 | { 41 | "appearances" : [ 42 | { 43 | "appearance" : "luminosity", 44 | "value" : "dark" 45 | } 46 | ], 47 | "color" : { 48 | "color-space" : "extended-gray", 49 | "components" : { 50 | "alpha" : "1.000", 51 | "white" : "0.000" 52 | } 53 | }, 54 | "idiom" : "mac" 55 | } 56 | ], 57 | "info" : { 58 | "author" : "xcode", 59 | "version" : 1 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Onboarding/OnboardSet.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OnboardSet.swift 3 | // Onboarding 4 | // 5 | // Created by Stewart Lynch on 2020-06-27. 6 | // 7 | 8 | import CoreGraphics 9 | 10 | class OnboardSet { 11 | private(set) var cards: [OnboardCard] = [] 12 | private(set) var width: CGFloat = 350 13 | private(set) var height: CGFloat = 500 14 | 15 | func dimensions(width: CGFloat, height: CGFloat) { 16 | self.width = width 17 | self.height = height 18 | } 19 | 20 | func newCard(title: String, image: String, text: String) { 21 | cards.append(OnboardCard(title: title, image: image, text: text)) 22 | } 23 | } 24 | 25 | #if DEBUG 26 | extension OnboardSet { 27 | static func previewSet() -> OnboardSet { 28 | let onboardSet = OnboardSet() 29 | onboardSet.newCard(title: "Login", image: "tag-1", text: "Enter your credentials and log in.") 30 | onboardSet.newCard(title: "Update Profile", image: "scan", text: "Make sure you update your profile and avatar.") 31 | onboardSet.newCard(title: "Participate", image: "tag-1", text: "Engage with others online. Join the community.") 32 | onboardSet.newCard(title: "Leave Feedback", image: "scan", text: "We want to hear from you so please let us know what you think.") 33 | onboardSet.newCard(title: "Your Data", image: "tag-1", text: "Your data is your own. View your stats at any time.") 34 | return onboardSet 35 | } 36 | } 37 | #endif 38 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Search/Matrix.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Matrix.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 25.08.20. 6 | // 7 | 8 | public struct Matrix { 9 | var array: [A] 10 | let width: Int 11 | private(set) var height: Int 12 | init(width: Int, height: Int, initialValue: A) { 13 | array = Array(repeating: initialValue, count: width * height) 14 | self.width = width 15 | self.height = height 16 | } 17 | 18 | private init(width: Int, height: Int, array: [A]) { 19 | self.width = width 20 | self.height = height 21 | self.array = array 22 | } 23 | 24 | subscript(column: Int, row: Int) -> A { 25 | get { array[row * width + column] } 26 | set { array[row * width + column] = newValue } 27 | } 28 | 29 | subscript(row row: Int) -> [A] { 30 | Array(array[row * width ..< (row + 1) * width]) 31 | } 32 | 33 | func map(_ transform: (A) -> B) -> Matrix { 34 | Matrix(width: width, height: height, array: array.map(transform)) 35 | } 36 | 37 | mutating func insert(row: [A], at rowIdx: Int) { 38 | assert(row.count == width) 39 | assert(rowIdx <= height) 40 | array.insert(contentsOf: row, at: rowIdx * width) 41 | height += 1 42 | } 43 | 44 | func inserting(row: [A], at rowIdx: Int) -> Matrix { 45 | var copy = self 46 | copy.insert(row: row, at: rowIdx) 47 | return copy 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/ArchiveTab/PDFCustomView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PDFView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 31.10.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import PDFKit 10 | import SwiftUI 11 | import SwiftUIX 12 | 13 | public struct PDFCustomView: AppKitOrUIKitViewRepresentable { 14 | public typealias AppKitOrUIKitViewType = PDFView 15 | 16 | private let pdfDocument: PDFDocument? 17 | 18 | public init(_ pdfDocument: PDFDocument?) { 19 | self.pdfDocument = pdfDocument 20 | } 21 | 22 | public func makeAppKitOrUIKitView(context: Context) -> PDFView { 23 | let view = PDFView() 24 | view.displayMode = .singlePageContinuous 25 | view.autoScales = true 26 | view.interpolationQuality = .low 27 | view.backgroundColor = .init(Color.paPDFBackground) 28 | // view.minScaleFactor = 0.1 29 | // view.maxScaleFactor = 4.0 30 | return view 31 | } 32 | 33 | public func updateAppKitOrUIKitView(_ view: PDFView, context: Context) { 34 | if let pdfDocument = pdfDocument { 35 | view.document = pdfDocument 36 | view.goToFirstPage(self) 37 | 38 | // show the whole document in the view 39 | view.scaleFactor = view.scaleFactorForSizeToFit 40 | } 41 | } 42 | } 43 | 44 | struct PDFCustomView_Previews: PreviewProvider { 45 | static var previews: some View { 46 | PDFCustomView(PDFDocument()) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/MoreTab/StorageSelectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StorageSelectionView.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 18.11.20. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct StorageSelectionView: View { 11 | 12 | @Binding var selection: MoreTabViewModel.StorageType 13 | 14 | var body: some View { 15 | Form { 16 | ForEach(MoreTabViewModel.StorageType.allCases) { storageType in 17 | Section(footer: storageType.descriptionView) { 18 | Button(action: { 19 | selection = storageType 20 | }) { 21 | HStack { 22 | Text(storageType.title) 23 | .foregroundColor(.label) 24 | Spacer() 25 | if selection == storageType { 26 | Image(systemName: "checkmark") 27 | } 28 | } 29 | } 30 | } 31 | #if os(macOS) 32 | Spacer(minLength: 28) 33 | #endif 34 | } 35 | } 36 | } 37 | } 38 | 39 | struct StorageSelectionView_Previews: PreviewProvider { 40 | static var previews: some View { 41 | #if os(macOS) 42 | StorageSelectionView(selection: .constant(.local)) 43 | #else 44 | StorageSelectionView(selection: .constant(.appContainer)) 45 | #endif 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/SwiftUIX.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | Copyright © 2020 Vatsal Manot 10 | 11 | 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: 12 | 13 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 14 | 15 | 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. 16 | 17 | Type 18 | PSGroupSpecifier 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist/SwiftUIX.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | Copyright © 2019 Vatsal Manot 10 | 11 | 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: 12 | 13 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 14 | 15 | 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. 16 | 17 | Type 18 | PSGroupSpecifier 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Shared/Resources/Assets.xcassets/colors/SecondaryBackground.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "display-p3", 6 | "components" : { 7 | "alpha" : "1.000", 8 | "blue" : "0.980", 9 | "green" : "0.980", 10 | "red" : "0.980" 11 | } 12 | }, 13 | "idiom" : "universal" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "platform" : "ios", 24 | "reference" : "secondarySystemBackgroundColor" 25 | }, 26 | "idiom" : "universal" 27 | }, 28 | { 29 | "color" : { 30 | "color-space" : "display-p3", 31 | "components" : { 32 | "alpha" : "1.000", 33 | "blue" : "0.980", 34 | "green" : "0.980", 35 | "red" : "0.980" 36 | } 37 | }, 38 | "idiom" : "mac" 39 | }, 40 | { 41 | "appearances" : [ 42 | { 43 | "appearance" : "luminosity", 44 | "value" : "dark" 45 | } 46 | ], 47 | "color" : { 48 | "color-space" : "extended-srgb", 49 | "components" : { 50 | "alpha" : "1.000", 51 | "blue" : "0.118", 52 | "green" : "0.110", 53 | "red" : "0.110" 54 | } 55 | }, 56 | "idiom" : "mac" 57 | } 58 | ], 59 | "info" : { 60 | "author" : "xcode", 61 | "version" : 1 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist/SwiftyStoreKit.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | Copyright (c) 2015-2016 Andrea Bizzotto bizz84@gmail.com 10 | 11 | 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: 12 | 13 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 14 | 15 | 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. 16 | 17 | Type 18 | PSGroupSpecifier 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/Diagnostics.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | MIT License 10 | 11 | Copyright (c) 2019 WeTransfer 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist/Diagnostics.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | MIT License 10 | 11 | Copyright (c) 2019 WeTransfer 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/GraphicsRenderer.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | Copyright (c) 2016 Shaps Benkau <shapsuk@me.com> 10 | 11 | Permission is hereby granted, free of charge, to any person obtaining a copy 12 | of this software and associated documentation files (the "Software"), to deal 13 | in the Software without restriction, including without limitation the rights 14 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 | copies of the Software, and to permit persons to whom the Software is 16 | furnished to do so, subject to the following conditions: 17 | 18 | The above copyright notice and this permission notice shall be included in 19 | all copies or substantial portions of the Software. 20 | 21 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 | THE SOFTWARE. 28 | 29 | Type 30 | PSGroupSpecifier 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist/KeyboardObserving.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | MIT License 10 | 11 | Copyright (c) 2019 Nick Fox 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/sentry-cocoa.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | The MIT License (MIT) 10 | 11 | Copyright (c) 2015 Sentry 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | 32 | Type 33 | PSGroupSpecifier 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist/paper-onboarding.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | The MIT License (MIT) 10 | 11 | Copyright (c) 2016 Ramotion 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /PDFArchiver/Resources/Settings.bundle/com.mono0926.LicensePlist/sentry-cocoa.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | The MIT License (MIT) 10 | 11 | Copyright (c) 2015 Sentry 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | 32 | Type 33 | PSGroupSpecifier 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/TPInAppReceipt.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | MIT License 10 | 11 | Copyright (c) 2016-present Pavel Tikhoneko 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/Parma.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | MIT License 10 | 11 | Copyright (c) 2020 Leonard Chan <wxclx98@gmail.com> 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in all 21 | copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 29 | SOFTWARE. 30 | 31 | Type 32 | PSGroupSpecifier 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Logging/Log.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Log.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 20.10.20. 6 | // 7 | 8 | import Logging 9 | 10 | public protocol Log { 11 | var log: Logger { get } 12 | } 13 | 14 | public extension Log { 15 | static var log: Logger { 16 | Logger(label: String(describing: self)) 17 | } 18 | var log: Logger { 19 | Self.log 20 | } 21 | } 22 | 23 | public extension Logger { 24 | func errorAndAssert(_ message: @autoclosure () -> Logger.Message, 25 | metadata: @autoclosure () -> Logger.Metadata? = nil, 26 | source: @autoclosure () -> String? = nil, 27 | file: StaticString = #file, 28 | function: StaticString = #function, 29 | line: UInt = #line) { 30 | self.error(message(), metadata: metadata(), file: "\(file)", function: "\(function)", line: line) 31 | assertionFailure(message().description, file: file, line: line) 32 | } 33 | 34 | func criticalAndAssert(_ message: @autoclosure () -> Logger.Message, 35 | metadata: @autoclosure () -> Logger.Metadata? = nil, 36 | source: @autoclosure () -> String? = nil, 37 | file: StaticString = #file, 38 | function: StaticString = #function, 39 | line: UInt = #line) { 40 | self.critical(message(), metadata: metadata(), file: "\(file)", function: "\(function)", line: line) 41 | assertionFailure(message().description, file: file, line: line) 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Tests macOS/Tests_macOS.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Tests_macOS.swift 3 | // Tests macOS 4 | // 5 | // Created by Julian Kahnert on 24.06.20. 6 | // 7 | 8 | import XCTest 9 | 10 | // swiftlint:disable:next type_name 11 | final class Tests_macOS: XCTestCase { 12 | 13 | override func setUpWithError() throws { 14 | try super.setUpWithError() 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | 17 | // In UI tests it is usually best to stop immediately when a failure occurs. 18 | continueAfterFailure = false 19 | 20 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 21 | } 22 | 23 | override func tearDownWithError() throws { 24 | try super.tearDownWithError() 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | } 27 | 28 | func testExample() throws { 29 | // UI tests must launch the application that they test. 30 | let app = XCUIApplication() 31 | app.launch() 32 | 33 | // Use recording to get started writing UI tests. 34 | // Use XCTAssert and related functions to verify your tests produce the correct results. 35 | } 36 | 37 | @available(OSX 11.0, *) 38 | func testLaunchPerformance() throws { 39 | // This measures how long it takes to launch your application. 40 | measure(metrics: [XCTApplicationLaunchMetric(waitUntilResponsive: true)]) { 41 | XCUIApplication().launch() 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Helpers/SortDescriptors.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SortDescriptors.swift 3 | // ArchiveLib 4 | // 5 | // Created by Julian Kahnert on 17.12.18. 6 | // 7 | // Source from: http://chris.eidhof.nl/post/sort-descriptors-in-swift/ 8 | // 9 | 10 | import Foundation 11 | 12 | /// A type that can be sorted by a NSSortDescriptor. 13 | public protocol CustomComparable { 14 | 15 | /// Compare this object with another object of this type, using a NSSortDescriptor. 16 | /// 17 | /// - Parameters: 18 | /// - other: Object that should be used for comparison. 19 | /// - sortDescriptor: NSSortDescriptor that should be used by comparison. 20 | /// - Returns: Comparison result. 21 | func isBefore(_ other: Self, _ sortDescriptor: NSSortDescriptor) throws -> Bool 22 | } 23 | 24 | /// Sort items by some sort descriptors. 25 | /// 26 | /// - Parameters: 27 | /// - items: Items that should be sorted. 28 | /// - sortDescriptors: Descriptors that specify the sorting. 29 | /// - Returns: Sorted items. 30 | public func sort(_ items: [Type], by sortDescriptors: [NSSortDescriptor]) throws -> [Type] { 31 | return try items.sorted { (lhs, rhs) -> Bool in 32 | for sortDescriptor in sortDescriptors { 33 | if try lhs.isBefore(rhs, sortDescriptor) { return true } 34 | if try rhs.isBefore(lhs, sortDescriptor) { return false } 35 | } 36 | return false 37 | } 38 | } 39 | 40 | /// Error which might be thrown in the SortDescriptor. 41 | /// 42 | /// - invalidKey: Error that will be thrown, if an invalid key was found in the sort descriptor. 43 | public enum SortDescriptorError: Error { 44 | case invalidKey 45 | } 46 | -------------------------------------------------------------------------------- /ArchiveCore/.swiftpm/xcode/xcshareddata/xcbaselines/ArchiveCoreTests.xcbaseline/CBC450F9-0FD6-4ABA-8152-BE739023F8FC.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | classNames 6 | 7 | FuzzyMatchingTests 8 | 9 | testPerformance() 10 | 11 | com.apple.XCTPerformanceMetric_WallClockTime 12 | 13 | baselineAverage 14 | 0.579 15 | baselineIntegrationDisplayName 16 | Local Baseline 17 | 18 | 19 | testPerformance1() 20 | 21 | com.apple.XCTPerformanceMetric_WallClockTime 22 | 23 | baselineAverage 24 | 0.50516 25 | baselineIntegrationDisplayName 26 | Local Baseline 27 | 28 | 29 | testPerformance2() 30 | 31 | com.apple.XCTPerformanceMetric_WallClockTime 32 | 33 | baselineAverage 34 | 0.538 35 | baselineIntegrationDisplayName 36 | Local Baseline 37 | 38 | 39 | testPerformance3() 40 | 41 | com.apple.XCTPerformanceMetric_WallClockTime 42 | 43 | baselineAverage 44 | 0.051856 45 | baselineIntegrationDisplayName 46 | Local Baseline 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /PDFArchiver.xcodeproj/xcshareddata/xcbaselines/3489D72A24A3C53E0035E64F.xcbaseline/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | runDestinationsByUUID 6 | 7 | 7712990D-DD3E-4FB5-BF56-3FCD157BC908 8 | 9 | localComputer 10 | 11 | busSpeedInMHz 12 | 400 13 | cpuCount 14 | 1 15 | cpuKind 16 | 6-Core Intel Core i7 17 | cpuSpeedInMHz 18 | 2600 19 | logicalCPUCoresPerPackage 20 | 12 21 | modelCode 22 | MacBookPro15,1 23 | physicalCPUCoresPerPackage 24 | 6 25 | platformIdentifier 26 | com.apple.platform.macosx 27 | 28 | targetArchitecture 29 | x86_64 30 | targetDevice 31 | 32 | modelCode 33 | iPod9,1 34 | platformIdentifier 35 | com.apple.platform.iphonesimulator 36 | 37 | 38 | D5EE0815-884F-4D05-A619-E6BF7D2978B9 39 | 40 | targetArchitecture 41 | arm64e 42 | targetDevice 43 | 44 | modelCode 45 | iPad8,1 46 | platformIdentifier 47 | com.apple.platform.iphoneos 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/DeepDiff.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | Licensed under the **MIT** license 10 | 11 | > Copyright (c) 2015 Khoa Pham 12 | > 13 | > Permission is hereby granted, free of charge, to any person obtaining 14 | > a copy of this software and associated documentation files (the 15 | > "Software"), to deal in the Software without restriction, including 16 | > without limitation the rights to use, copy, modify, merge, publish, 17 | > distribute, sublicense, and/or sell copies of the Software, and to 18 | > permit persons to whom the Software is furnished to do so, subject to 19 | > the following conditions: 20 | > 21 | > The above copyright notice and this permission notice shall be 22 | > included in all copies or substantial portions of the Software. 23 | > 24 | > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 | > EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 | > MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 27 | > IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 28 | > CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 29 | > TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 30 | > SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 | 32 | Type 33 | PSGroupSpecifier 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Helpers/OrientationInfo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OrientationInfo.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 25.02.20. 6 | // Copyright © 2020 Julian Kahnert. All rights reserved. 7 | // 8 | // Source: https://forums.developer.apple.com/thread/126878 9 | 10 | import SwiftUI 11 | 12 | public final class OrientationInfo: ObservableObject { 13 | public enum Orientation { 14 | case portrait 15 | case landscape 16 | } 17 | 18 | @Published public var orientation: Orientation 19 | 20 | private var _observer: NSObjectProtocol? 21 | 22 | public init() { 23 | #if canImport(UIKit) 24 | // fairly arbitrary starting value for 'flat' orientations 25 | if UIDevice.current.orientation.isLandscape { 26 | self.orientation = .landscape 27 | } else { 28 | self.orientation = .portrait 29 | } 30 | 31 | // unowned self because we unregister before self becomes invalid 32 | _observer = NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: nil) { [unowned self] note in 33 | guard let device = note.object as? UIDevice else { 34 | return 35 | } 36 | if device.orientation.isPortrait { 37 | self.orientation = .portrait 38 | } else if device.orientation.isLandscape { 39 | self.orientation = .landscape 40 | } 41 | } 42 | #else 43 | self.orientation = .landscape 44 | #endif 45 | } 46 | 47 | deinit { 48 | if let observer = _observer { 49 | NotificationCenter.default.removeObserver(observer) 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Logging/SentryBreadcrumbLogger.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SentryBreadcrumbLogger.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 19.01.21. 6 | // 7 | 8 | import Logging 9 | import Sentry 10 | 11 | public struct SentryBreadcrumbLogger: LogHandler { 12 | public var metadata: Logger.Metadata 13 | public var logLevel: Logger.Level = .info 14 | 15 | public init(metadata: Logger.Metadata, logLevel: Logger.Level = .info) { 16 | self.metadata = metadata 17 | self.logLevel = logLevel 18 | } 19 | 20 | public subscript(metadataKey metadataKey: String) -> Logger.Metadata.Value? { 21 | get { 22 | return self.metadata[metadataKey] 23 | } 24 | set { 25 | self.metadata[metadataKey] = newValue 26 | } 27 | } 28 | 29 | public func log(level: Logger.Level, message: Logger.Message, metadata: Logger.Metadata? = nil, file: String = #file, function: String = #function, line: UInt = #line) { 30 | guard level >= logLevel else { return } 31 | 32 | let sentryLevel: SentryLevel 33 | switch level { 34 | case .debug, .trace, .notice: 35 | sentryLevel = .debug 36 | case .info: 37 | sentryLevel = .info 38 | case .warning: 39 | sentryLevel = .warning 40 | case .error: 41 | sentryLevel = .error 42 | case .critical: 43 | sentryLevel = .fatal 44 | } 45 | 46 | let crumb = Breadcrumb() 47 | crumb.level = sentryLevel 48 | crumb.category = "\(file) \(function):\(line)" 49 | crumb.message = message.description 50 | crumb.timestamp = Date() 51 | SentrySDK.addBreadcrumb(crumb: crumb) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveViewsTests/StatisticsTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StatisticsTests.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 27.12.20. 6 | // 7 | 8 | @testable import ArchiveViews 9 | import Foundation 10 | import XCTest 11 | 12 | final class StatisticsTests: XCTestCase { 13 | 14 | func testEmptyDocuments() throws { 15 | let viewModel = StatisticsViewModel(documents: []) 16 | 17 | XCTAssertEqual(viewModel.untaggedDocumentCount, 0) 18 | XCTAssertEqual(viewModel.taggedDocumentCount, 0) 19 | 20 | XCTAssertEqual(viewModel.topTags.count, 0) 21 | XCTAssertEqual(viewModel.topYears.count, 0) 22 | } 23 | 24 | func testValidDocuments() throws { 25 | let viewModel = StatisticsViewModel(documents: [ 26 | Document.createWithInfo(taggingStatus: .tagged, tags: ["tag1"], folderName: "2020"), 27 | Document.createWithInfo(taggingStatus: .tagged, tags: ["tag1", "tag6"], folderName: "2020"), 28 | Document.createWithInfo(taggingStatus: .tagged, tags: ["tag1", "tag2"], folderName: "2020"), 29 | Document.createWithInfo(taggingStatus: .tagged, tags: ["tag2", "tag3"], folderName: "2020"), 30 | Document.createWithInfo(taggingStatus: .tagged, tags: ["tag5", "tag6"], folderName: "2020"), 31 | Document.createWithInfo(taggingStatus: .tagged, tags: ["tag1", "tag6"], folderName: "2021"), 32 | Document.createWithInfo(taggingStatus: .untagged, tags: ["tag1", "tag2"], folderName: "2020") 33 | ]) 34 | 35 | XCTAssertEqual(viewModel.untaggedDocumentCount, 1) 36 | XCTAssertEqual(viewModel.taggedDocumentCount, 6) 37 | 38 | XCTAssertEqual(viewModel.topTags.count, 3) 39 | XCTAssertEqual(viewModel.topTags.sorted(by: { $0.1 > $1.1 }).map(\.0), ["tag1", "tag6", "tag2"]) 40 | XCTAssertEqual(viewModel.topYears.count, 2) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /ShareExtension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | ShareExtension 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSExtension 24 | 25 | NSExtensionAttributes 26 | 27 | NSExtensionActivationRule 28 | SUBQUERY(extensionItems, $extensionItem, SUBQUERY($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image").@count >= 1).@count >= 1 29 | OR SUBQUERY(extensionItems, $extensionItem, SUBQUERY($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.url").@count >= 1).@count >= 1 30 | OR SUBQUERY(extensionItems, $extensionItem, SUBQUERY($extensionItem.attachments, $attachment, ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf").@count >= 1).@count >= 1 31 | 32 | NSExtensionMainStoryboard 33 | MainInterface 34 | NSExtensionPointIdentifier 35 | com.apple.share-services 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/ArchiveTab/DocumentDetailView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DocumentDetailView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 30.10.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUIX 10 | 11 | struct DocumentDetailView: View { 12 | @ObservedObject var viewModel: DocumentDetailViewModel 13 | var body: some View { 14 | VStack { 15 | DocumentView(viewModel: viewModel.document, showTagStatus: false, multilineTagList: true) 16 | .padding() 17 | PDFCustomView(viewModel.pdfDocument) 18 | } 19 | .navigationBarTitle(Text(""), displayMode: .inline) 20 | .navigationBarItems(trailing: shareNavigationButton) 21 | // .navigationBarItems(trailing: HStack(alignment: .bottom, spacing: 16) { 22 | // editButton 23 | // shareNavigationButton 24 | // }) 25 | .onAppear(perform: viewModel.viewAppeared) 26 | .sheet(isPresented: $viewModel.showActivityView) { 27 | #if !os(macOS) 28 | AppActivityView(activityItems: self.viewModel.activityItems) 29 | #endif 30 | } 31 | } 32 | 33 | // var editButton: some View { 34 | // Button(action: {}, label: { 35 | // Label("Edit", systemImage: "pencil") 36 | // .labelStyle(VerticalLabelStyle()) 37 | // }) 38 | // } 39 | 40 | var shareNavigationButton: some View { 41 | Button(action: { 42 | #if os(macOS) 43 | NSWorkspace.shared.activateFileViewerSelecting([viewModel.document.path]) 44 | #else 45 | self.viewModel.showActivityView = true 46 | #endif 47 | }, label: { 48 | Label("Share", systemImage: "square.and.arrow.up") 49 | .labelStyle(VerticalLabelStyle()) 50 | }) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Logging/AppEnvironment.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppEnvironment.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 20.10.20. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum AppEnvironment: String, Codable { 11 | case develop 12 | case testflight 13 | case production 14 | } 15 | 16 | public extension AppEnvironment { 17 | 18 | static func get() -> AppEnvironment { 19 | // return early, if we have a debug build 20 | #if DEBUG 21 | return .develop 22 | #else 23 | // source from: https://stackoverflow.com/a/38984554 24 | if let url = Bundle.main.appStoreReceiptURL { 25 | if url.path.contains("CoreSimulator") { 26 | return .develop 27 | } else if url.lastPathComponent == "sandboxReceipt" { 28 | return .testflight 29 | } 30 | } 31 | return .production 32 | #endif 33 | } 34 | 35 | static func getFullVersion() -> String { 36 | return "\(getVersion()) (\(getBuildNumber()))" 37 | } 38 | 39 | static func getVersion() -> String { 40 | return (Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String) ?? "" 41 | } 42 | 43 | static func getBuildNumber() -> Int { 44 | return Int((Bundle.main.infoDictionary?["CFBundleVersion"] as? String) ?? "0") ?? 0 45 | } 46 | 47 | static func getModel() -> String { 48 | var systemInfo = utsname() 49 | uname(&systemInfo) 50 | 51 | let machineMirror = Mirror(reflecting: systemInfo.machine) 52 | 53 | let identifier = machineMirror.children.reduce("") { identifier, element in 54 | guard let value = element.value as? Int8, value != 0 else { return identifier } 55 | return identifier + String(UnicodeScalar(UInt8(value))) 56 | } 57 | return identifier 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Shared/Resources/markdown/Base.lproj/Privacy.md: -------------------------------------------------------------------------------- 1 | **German Version:** [Datenschutzerklärung](https://pdf-archiver.io/de/privacy/) 2 | 3 | ## 1. An overview of data protection 4 | ### General 5 | 6 | The following gives a simple overview of what happens to your personal information when you visit our website. Personal information is any data with which you could be personally identified. Detailed information on the subject of data protection can be found in our privacy policy found below. 7 | 8 | ## 2. General information and mandatory information 9 | ### Data protection 10 | 11 | The operators of this website take the protection of your personal data very seriously. We treat your personal data as confidential and in accordance with the statutory data protection regulations and this privacy policy. 12 | 13 | If you use this website, various pieces of personal data will be collected. Personal information is any data with which you could be personally identified. This privacy policy explains what information we collect and what we use it for. It also explains how and for what purpose this happens. 14 | 15 | Please note that data transmitted via the internet (e.g. via email communication) may be subject to security breaches. Complete protection of your data from third-party access is not possible. 16 | 17 | ## 3. Data collection 18 | ### Log Data/Crash Reports 19 | 20 | The website provider/PDF Archiver/PDF Archive Viewer collect and store information that your browser/the app transmits to Sentry in "log files" or crash reports. These are: 21 | 22 | * Browser type and browser version 23 | * Device name 24 | * Operating system used 25 | * Referrer URL 26 | * Time and date of your use 27 | * IP address 28 | 29 | These data will not be combined with data from other sources. 30 | 31 | The basis for data processing is Art. 6 (1) (b) DSGVO, which allows the processing of data to fulfill a contract or for measures preliminary to a contract. 32 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/PathConstants.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PathConstants.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 18.10.20. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum PathConstants: Log { 11 | private static let appGroupContainerURL: URL = { 12 | guard let tempImageURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: Constants.sharedContainerIdentifier) else { 13 | log.criticalAndAssert("AppGroup folder could not be found.") 14 | preconditionFailure("AppGroup folder could not be found.") 15 | } 16 | return tempImageURL 17 | }() 18 | 19 | public static let tempImageURL: URL = { 20 | let tempImageURL = appGroupContainerURL.appendingPathComponent("TempImages") 21 | createFolderIfNotExists(tempImageURL, name: "TempIamges") 22 | return tempImageURL 23 | }() 24 | 25 | public static let tempPdfURL: URL = { 26 | let tempImageURL = appGroupContainerURL.appendingPathComponent("TempPDFDocuments") 27 | createFolderIfNotExists(tempImageURL, name: "TempPDFDocuments") 28 | return tempImageURL 29 | }() 30 | 31 | public static var extensionTempPdfURL: URL { 32 | appGroupContainerURL 33 | } 34 | 35 | public static var appClipTempPdfURL: URL { 36 | tempPdfURL 37 | } 38 | 39 | private static func createFolderIfNotExists(_ folder: URL?, name: StaticString) { 40 | guard let folder = folder else { 41 | Self.log.info("Folder '\(name)' does not have an URL. - Skipping!") 42 | return 43 | } 44 | do { 45 | try FileManager.default.createFolderIfNotExists(folder) 46 | } catch { 47 | log.criticalAndAssert("Failed to create '\(name)' folder.", metadata: ["error": "\(error)"]) 48 | preconditionFailure("Failed to create '\(name)' folder.") 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/MoreTab/AboutMeView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AboutMeView.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 13.11.19. 6 | // Copyright © 2019 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct AboutMeView: View { 12 | 13 | private static let profilePictureWidth: CGFloat = 120.0 14 | 15 | var body: some View { 16 | ScrollView { 17 | VStack(alignment: .center, spacing: 32.0) { 18 | headline 19 | profilePicture 20 | text 21 | } 22 | } 23 | } 24 | 25 | private var headline: some View { 26 | HStack { 27 | Image("Logo") 28 | .resizable() 29 | .frame(width: 50.0, height: 50.0, alignment: .center) 30 | VStack(alignment: .leading, spacing: 4.0) { 31 | Text("PDF Archiver") 32 | .font(.largeTitle) 33 | .fontWeight(.heavy) 34 | .foregroundColor(.paDarkGray) 35 | Text("Scan it. Tag it. Find it.") 36 | .font(.title) 37 | .foregroundColor(.paLightGray) 38 | } 39 | } 40 | } 41 | 42 | private var profilePicture: some View { 43 | Image("me-photo") 44 | .resizable() 45 | .cornerRadius(AboutMeView.profilePictureWidth / 4) 46 | .frame(width: AboutMeView.profilePictureWidth, height: AboutMeView.profilePictureWidth, alignment: .center) 47 | } 48 | 49 | private var text: some View { 50 | Text("AboutMeViewText") 51 | .padding(EdgeInsets(top: 0.0, leading: 16.0, bottom: 16.0, trailing: 16.0)) 52 | } 53 | } 54 | 55 | #if DEBUG 56 | struct AboutMeView_Previews: PreviewProvider { 57 | static var previews: some View { 58 | AboutMeView() 59 | .makeForPreviewProvider() 60 | } 61 | } 62 | #endif 63 | -------------------------------------------------------------------------------- /UITests iOS/UITests_iOS.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITests_iOS.swift 3 | // UITests iOS 4 | // 5 | // Created by Julian Kahnert on 08.01.21. 6 | // 7 | 8 | import XCTest 9 | 10 | class UITestsiOS: XCTestCase { 11 | 12 | var app: XCUIApplication! 13 | 14 | override func setUpWithError() throws { 15 | try super.setUpWithError() 16 | app = XCUIApplication() 17 | app.launchArguments.append("-demoMode") 18 | app.launchArguments.append("true") 19 | app.launchArguments.append("-tutorial-v1") 20 | app.launchArguments.append("true") 21 | setupSnapshot(app, waitForAnimations: true) 22 | app.launch() 23 | } 24 | 25 | override func tearDownWithError() throws { 26 | try super.tearDownWithError() 27 | // Put teardown code here. This method is called after the invocation of each test method in the class. 28 | } 29 | 30 | func testSelectScan() throws { 31 | let tabBar = app.tabBars.firstMatch 32 | _ = tabBar.waitForExistence(timeout: 10) 33 | tabBar.buttons[NSLocalizedString("Scan", comment: "")].tap() 34 | snapshot("01-Scan-Screen") 35 | } 36 | 37 | func testSelectTag() throws { 38 | let tabBar = app.tabBars.firstMatch 39 | _ = tabBar.waitForExistence(timeout: 10) 40 | tabBar.buttons[NSLocalizedString("Tag", comment: "")].tap() 41 | snapshot("02-Tag-Screen") 42 | } 43 | 44 | func testSelectArchive() throws { 45 | let tabBar = app.tabBars.firstMatch 46 | _ = tabBar.waitForExistence(timeout: 10) 47 | tabBar.buttons[NSLocalizedString("Archive", comment: "")].tap() 48 | snapshot("03-Archive-Screen") 49 | } 50 | 51 | func testSelectMore() throws { 52 | let tabBar = app.tabBars.firstMatch 53 | _ = tabBar.waitForExistence(timeout: 10) 54 | tabBar.buttons[NSLocalizedString("More", comment: "")].tap() 55 | snapshot("04-More-Screen") 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Shared/Resources/Settings.bundle/com.mono0926.LicensePlist/ASN1Swift.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | Copyright (c) 2020-Present, Pavel Tikhonenko. All rights reserved. 10 | 11 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 12 | 13 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 14 | 15 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 16 | 17 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 20 | 21 | Type 22 | PSGroupSpecifier 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Models/FileChange+DownloadStatus.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileChange+DownlaodStatus.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 15.08.20. 6 | // 7 | 8 | extension FileChange { 9 | 10 | /// Download status of a file. 11 | /// 12 | /// - iCloudDrive: The file is currently only in iCloud Drive available. 13 | /// - downloading: The OS downloads the file currentyl. 14 | /// - local: The file is locally available. 15 | public enum DownloadStatus: Equatable, Codable { 16 | 17 | case remote 18 | case downloading(percent: Double) 19 | case local 20 | 21 | enum CodingKeys: CodingKey { 22 | case remote, downloading, local 23 | } 24 | 25 | public init(from decoder: Decoder) throws { 26 | let container = try decoder.container(keyedBy: CodingKeys.self) 27 | 28 | if true == (try? container.decode(Bool.self, forKey: .remote)) { 29 | self = .remote 30 | } else if let value = try? container.decode(Double.self, forKey: .downloading) { 31 | self = .downloading(percent: value) 32 | } else if true == (try? container.decode(Bool.self, forKey: .local)) { 33 | self = .local 34 | } else { 35 | throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: container.codingPath, debugDescription: "Data doesn't match")) 36 | } 37 | 38 | } 39 | 40 | public func encode(to encoder: Encoder) throws { 41 | var container = encoder.container(keyedBy: CodingKeys.self) 42 | switch self { 43 | case .remote: 44 | try container.encode(true, forKey: .remote) 45 | case .local: 46 | try container.encode(true, forKey: .local) 47 | case .downloading(let percent): 48 | try container.encode(percent, forKey: .downloading) 49 | } 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveBackend/Helpers/TagParser.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TagParser.swift 3 | // ArchiveLib 4 | // 5 | // Created by Julian Kahnert on 28.12.18. 6 | // 7 | // Example from: https://developer.apple.com/documentation/naturallanguage/identifying_people_places_and_organizations 8 | 9 | import Foundation 10 | import NaturalLanguage 11 | 12 | /// Parse tags from a String. 13 | public enum TagParser { 14 | 15 | private static let seperator = "-" 16 | 17 | /// Get tag names from a string. 18 | /// 19 | /// - Parameter raw: Raw string which might contain some tags. 20 | /// - Returns: Found tag names. 21 | public static func parse(_ text: String) -> Set { 22 | var documentTags = Set() 23 | 24 | if #available(iOS 12.0, OSX 10.14, *) { 25 | let tagger = NLTagger(tagSchemes: [.nameType]) 26 | tagger.string = text 27 | let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace, .omitOther, .joinContractions] 28 | 29 | let tags: [NLTag] = [.personalName, .organizationName, .placeName] 30 | tagger.enumerateTags(in: text.startIndex.. 2 { 41 | documentTags.insert(foundTagName) 42 | } 43 | } 44 | return true 45 | } 46 | } 47 | 48 | return documentTags 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /ArchiveCore/Tests/ArchiveBackendTests/FuzzyMatchingTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FuzzyMatchingTests.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 25.08.20. 6 | // 7 | // swiftlint:disable force_unwrapping 8 | 9 | @testable import ArchiveBackend 10 | import Foundation 11 | import XCTest 12 | 13 | final class FuzzyMatchingTests: XCTestCase { 14 | 15 | private static let testFileUrl = URL(string: "https://raw.githubusercontent.com/objcio/S01E216-quick-open-optimizing-performance-part-2/master/QuickOpen/linux.txt")! 16 | private static let testFilenames: [String]? = { 17 | guard let content = try? String(contentsOf: testFileUrl) else { return nil } 18 | return content 19 | .split { $0.isNewline } 20 | .map(String.init) 21 | }() 22 | 23 | override func setUp() { 24 | super.setUp() 25 | } 26 | 27 | func testPerformance1() throws { 28 | guard let testFilenames = Self.testFilenames else { throw XCTSkip("Could not fetch linux file content.") } 29 | 30 | var results = [(item: [String.UTF8View.Element], score: Int)]() 31 | let text = testFilenames.map { Array($0.utf8) } 32 | 33 | measure { 34 | results = text.fuzzyMatch("swift") 35 | } 36 | 37 | XCTAssertTrue(!results.isEmpty) 38 | } 39 | 40 | func testPerformance2() throws { 41 | var results = [String]() 42 | guard let testFilenames = Self.testFilenames else { throw XCTSkip("Could not fetch linux file content.") } 43 | 44 | measure { 45 | results = testFilenames.fuzzyMatchSorted("swift") 46 | } 47 | 48 | XCTAssertTrue(!results.isEmpty) 49 | } 50 | 51 | func testPerformance3() throws { 52 | guard let testFilenames = Self.testFilenames else { throw XCTSkip("Could not fetch linux file content.") } 53 | var tmp = [[String.UTF8View.Element]]() 54 | 55 | measure { 56 | tmp = testFilenames.map { Array($0.utf8) } 57 | } 58 | 59 | XCTAssertTrue(!tmp.isEmpty) 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Shared/Resources/IAP.storekit: -------------------------------------------------------------------------------- 1 | { 2 | "products" : [ 3 | 4 | ], 5 | "settings" : { 6 | "_billingIssuesEnabled" : false, 7 | "_failTransactionsEnabled" : false, 8 | "_storeKitError" : 0, 9 | "_timeRate" : 0 10 | }, 11 | "subscriptionGroups" : [ 12 | { 13 | "id" : "7E21CAC7", 14 | "localizations" : [ 15 | 16 | ], 17 | "name" : "de.JulianKahnert.PDF-Archiver", 18 | "subscriptions" : [ 19 | { 20 | "adHocOffers" : [ 21 | 22 | ], 23 | "displayPrice" : "0.99", 24 | "familyShareable" : false, 25 | "groupNumber" : 1, 26 | "internalID" : "4356F141", 27 | "introductoryOffer" : null, 28 | "localizations" : [ 29 | { 30 | "description" : "", 31 | "displayName" : "Monthly Subscription", 32 | "locale" : "en_US" 33 | } 34 | ], 35 | "productID" : "SUBSCRIPTION_MONTHLY_IOS", 36 | "recurringSubscriptionPeriod" : "P1M", 37 | "referenceName" : "Monthly Subscription", 38 | "subscriptionGroupID" : "7E21CAC7", 39 | "type" : "RecurringSubscription" 40 | }, 41 | { 42 | "adHocOffers" : [ 43 | 44 | ], 45 | "displayPrice" : "9.99", 46 | "familyShareable" : false, 47 | "groupNumber" : 1, 48 | "internalID" : "97637841", 49 | "introductoryOffer" : null, 50 | "localizations" : [ 51 | { 52 | "description" : "", 53 | "displayName" : "Yearly Subscription", 54 | "locale" : "en_US" 55 | } 56 | ], 57 | "productID" : "SUBSCRIPTION_YEARLY_IOS_NEW", 58 | "recurringSubscriptionPeriod" : "P1Y", 59 | "referenceName" : "Yearly Subscription", 60 | "subscriptionGroupID" : "7E21CAC7", 61 | "type" : "RecurringSubscription" 62 | } 63 | ] 64 | } 65 | ], 66 | "version" : { 67 | "major" : 1, 68 | "minor" : 0 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /PDFArchiver.xcodeproj/xcshareddata/xcschemes/UITests iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 14 | 15 | 17 | 23 | 24 | 25 | 26 | 27 | 37 | 38 | 44 | 45 | 47 | 48 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Shared/Resources/markdown/de.lproj/Privacy.md: -------------------------------------------------------------------------------- 1 | **English Version:** [Privacy Policy](https://pdf-archiver.io/privacy) 2 | 3 | ## 1. Datenschutz auf einen Blick 4 | ### Allgemeine Hinweise 5 | 6 | Die folgenden Hinweise geben einen einfachen Überblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie unsere Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können. Ausführliche Informationen zum Thema Datenschutz entnehmen Sie unserer unter diesem Text aufgeführten Datenschutzerklärung. 7 | 8 | ## 2. Allgemeine Hinweise und Pflichtinformationen 9 | ### Datenschutz 10 | 11 | Die Betreiber dieser Seiten nehmen den Schutz Ihrer persönlichen Daten sehr ernst. Wir behandeln Ihre personenbezogenen Daten vertraulich und entsprechend der gesetzlichen Datenschutzvorschriften sowie dieser Datenschutzerklärung. 12 | 13 | Wenn Sie diese Website benutzen, werden verschiedene personenbezogene Daten erhoben. Personenbezogene Daten sind Daten, mit denen Sie persönlich identifiziert werden können. Die vorliegende Datenschutzerklärung erläutert, welche Daten wir erheben und wofür wir sie nutzen. Sie erläutert auch, wie und zu welchem Zweck das geschieht. 14 | 15 | Wir weisen darauf hin, dass die Datenübertragung im Internet (z.B. bei der Kommunikation per E-Mail) Sicherheitslücken aufweisen kann. Ein lückenloser Schutz der Daten vor dem Zugriff durch Dritte ist nicht möglich. 16 | 17 | ## 3. Datenerfassung 18 | ### Log-Daten/Absturz-Berichte 19 | 20 | Der Provider der Seiten/PDF Archiver/PDF Archive Viewer erheben und speichern Informationen in so genannten Log-Daten bzw. Crash-Reports, die Ihr Browser/die App an Sentry übermittelt. Dies sind: 21 | 22 | * Browsertyp und Browserversion 23 | * Gerätename 24 | * verwendetes Betriebssystem 25 | * Referrer URL 26 | * Uhrzeit der Serveranfrage 27 | * IP-Adresse 28 | 29 | Eine Zusammenführung dieser Daten mit anderen Datenquellen wird nicht vorgenommen. 30 | 31 | Grundlage für die Datenverarbeitung ist Art. 6 Abs. 1 lit. b DSGVO, der die Verarbeitung von Daten zur Erfüllung eines Vertrags oder vorvertraglicher Maßnahmen gestattet. 32 | 33 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveSharedConstants/Extensions/FileManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FileManager.swift 3 | // 4 | // 5 | // Created by Julian Kahnert on 22.08.20. 6 | // 7 | 8 | import Foundation 9 | 10 | extension FileManager { 11 | public func fileExists(at url: URL) -> Bool { 12 | fileExists(atPath: url.path) 13 | } 14 | 15 | public func directoryExists(at url: URL) -> Bool { 16 | var isDirectory: ObjCBool = false 17 | let exists = self.fileExists(atPath: url.path, isDirectory: &isDirectory) 18 | return exists && isDirectory.boolValue 19 | } 20 | 21 | public func createFolderIfNotExists(_ folder: URL) throws { 22 | if !directoryExists(at: folder) { 23 | try createDirectory(at: folder, withIntermediateDirectories: true, attributes: nil) 24 | } 25 | } 26 | 27 | public func moveContents(of sourceFolder: URL, to destinationFolder: URL) throws { 28 | guard directoryExists(at: sourceFolder), 29 | directoryExists(at: destinationFolder) else { 30 | preconditionFailure("Source/Destionation is no folder - this should not happen.") 31 | } 32 | 33 | let contents = try contentsOfDirectory(at: sourceFolder, includingPropertiesForKeys: nil, options: [.skipsHiddenFiles, .skipsSubdirectoryDescendants]) 34 | for folder in contents { 35 | let destination = destinationFolder.appendingPathComponent(folder.lastPathComponent) 36 | 37 | if directoryExists(at: destination) { 38 | try moveContents(of: folder, to: destination) 39 | } else { 40 | try moveItem(at: folder, to: destination) 41 | } 42 | } 43 | } 44 | 45 | public func getFilesRecursive(at url: URL, with properties: [URLResourceKey]? = nil) -> [URL] { 46 | guard let enumerator = FileManager.default.enumerator(at: url, includingPropertiesForKeys: properties) else { return [] } 47 | 48 | var files = [URL]() 49 | for case let file as URL in enumerator { 50 | guard !file.hasDirectoryPath else { continue } 51 | files.append(file) 52 | } 53 | return files 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /AppClip/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | PDFArchiver 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 19 | CFBundleShortVersionString 20 | $(MARKETING_VERSION) 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | LSRequiresIPhoneOS 24 | 25 | NSAppClip 26 | 27 | NSAppClipRequestEphemeralUserNotification 28 | 29 | NSAppClipRequestLocationConfirmation 30 | 31 | 32 | NSCameraUsageDescription 33 | $(PRODUCT_NAME) uses the camera to scan documents. 34 | UIApplicationSceneManifest 35 | 36 | UIApplicationSupportsMultipleScenes 37 | 38 | 39 | UIApplicationSupportsIndirectInputEvents 40 | 41 | UILaunchScreen 42 | 43 | UIRequiredDeviceCapabilities 44 | 45 | armv7 46 | 47 | UISupportedInterfaceOrientations 48 | 49 | UIInterfaceOrientationPortrait 50 | UIInterfaceOrientationLandscapeLeft 51 | UIInterfaceOrientationLandscapeRight 52 | 53 | UISupportedInterfaceOrientations~ipad 54 | 55 | UIInterfaceOrientationPortrait 56 | UIInterfaceOrientationPortraitUpsideDown 57 | UIInterfaceOrientationLandscapeLeft 58 | UIInterfaceOrientationLandscapeRight 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /ArchiveCore/Sources/ArchiveViews/Helper/MissingViews/Stack.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Stack.swift 3 | // PDFArchiver 4 | // 5 | // Created by Julian Kahnert on 22.02.20. 6 | // Copyright © 2020 Julian Kahnert. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct Stack: View { 12 | 13 | #if os(iOS) 14 | @Environment(\.horizontalSizeClass) private var horizontalSizeClass 15 | #endif 16 | 17 | var spacing: CGFloat 18 | var content: Content 19 | 20 | init(spacing: CGFloat = 16, @ViewBuilder content: @escaping () -> Content) { 21 | self.spacing = spacing 22 | self.content = content() 23 | } 24 | 25 | var body: some View { 26 | #if os(iOS) 27 | if horizontalSizeClass == .compact { 28 | vertical 29 | } else { 30 | horizontal 31 | } 32 | #else 33 | horizontal 34 | #endif 35 | } 36 | 37 | var vertical: some View { 38 | VStack(alignment: .center, spacing: spacing) { 39 | content 40 | } 41 | .frame(maxWidth: .infinity, maxHeight: .infinity) 42 | } 43 | 44 | var horizontal: some View { 45 | HStack(alignment: .center, spacing: spacing) { 46 | content 47 | } 48 | .frame(maxWidth: .infinity, maxHeight: .infinity) 49 | } 50 | } 51 | 52 | struct Stack_Previews: PreviewProvider { 53 | static var previews: some View { 54 | Group { 55 | Stack { 56 | Text("Text 1") 57 | .padding(.all, 20) 58 | .backgroundFill(.green) 59 | Text("Text 2") 60 | .padding(.all, 20) 61 | .backgroundFill(.blue) 62 | } 63 | .previewLayout(.fixed(width: 800.0, height: 200.0)) 64 | Stack { 65 | Text("Text 1") 66 | .padding(.all, 20) 67 | .backgroundFill(.green) 68 | Text("Text 2") 69 | .padding(.all, 20) 70 | .backgroundFill(.blue) 71 | } 72 | .previewLayout(.fixed(width: 200.0, height: 800.0)) 73 | } 74 | } 75 | } 76 | --------------------------------------------------------------------------------