diff --git a/enzevalos_iphone.xcodeproj/project.pbxproj b/enzevalos_iphone.xcodeproj/project.pbxproj index bdfaad849cc607f19adb8c8fc06bdcdcf9d439fd..b36c8f7c8e09beb0f0af269411c8e407db68dca9 100644 --- a/enzevalos_iphone.xcodeproj/project.pbxproj +++ b/enzevalos_iphone.xcodeproj/project.pbxproj @@ -23,10 +23,12 @@ 0EF73F4324237E6500932FA0 /* SMIMEHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */; }; 0EFEF0952417C0B400BB2FF7 /* CHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */; }; 12680CE3CA4B14F980A48941 /* Pods_enzevalos_iphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F2D682FEE7B85A09D7E4650 /* Pods_enzevalos_iphone.framework */; }; + 32261743260C7CE60068CBD4 /* ContactMailListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32261742260C7CE60068CBD4 /* ContactMailListView.swift */; }; 3E6B07DE2011246500E49609 /* invitationText.html in Resources */ = {isa = PBXBuildFile; fileRef = 3E6B07DD2011246500E49609 /* invitationText.html */; }; 3EB4FAA420120096001D0625 /* DialogOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB4FAA320120096001D0625 /* DialogOption.swift */; }; 3EC35F2420037651008BDF95 /* InvitationHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC35F2320037651008BDF95 /* InvitationHelper.swift */; }; 3EC35F302003838E008BDF95 /* InvitationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC35F2F2003838E008BDF95 /* InvitationTests.swift */; }; + 3F071ED32611BF6900E121F0 /* InboxRefreshModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F071ED22611BF6900E121F0 /* InboxRefreshModel.swift */; }; 3FB75DC525FFA75C00919925 /* ComposeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FB75DC425FFA75B00919925 /* ComposeView.swift */; }; 3FB75DC925FFA77800919925 /* RecipientRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FB75DC825FFA77800919925 /* RecipientRowView.swift */; }; 3FB75DCD25FFD37400919925 /* RecipientListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FB75DCC25FFD37400919925 /* RecipientListView.swift */; }; @@ -70,7 +72,7 @@ 476406822416AA6F00C7D426 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 4764060F2416AA6F00C7D426 /* LICENSE */; }; 476406952416B54D00C7D426 /* KeyRecordRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406892416B54D00C7D426 /* KeyRecordRow.swift */; }; 476406972416B54D00C7D426 /* InboxCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068B2416B54D00C7D426 /* InboxCoordinator.swift */; }; - 476406982416B54D00C7D426 /* CiricleImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068D2416B54D00C7D426 /* CiricleImage.swift */; }; + 476406982416B54D00C7D426 /* CircleImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068D2416B54D00C7D426 /* CircleImage.swift */; }; 476406992416B54D00C7D426 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068E2416B54D00C7D426 /* SearchView.swift */; }; 4764069A2416B54D00C7D426 /* MailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068F2416B54D00C7D426 /* MailView.swift */; }; 4764069C2416B54D00C7D426 /* VCSwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406922416B54D00C7D426 /* VCSwiftUIView.swift */; }; @@ -82,7 +84,6 @@ 476EEF9922A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476EEF9822A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift */; }; 476EEFA122A873A800BB4EF7 /* OnboardingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476EEFA022A873A800BB4EF7 /* OnboardingTest.swift */; }; 476EEFA722A87B9800BB4EF7 /* accounts.json in Resources */ = {isa = PBXBuildFile; fileRef = 476EEFA622A87B9800BB4EF7 /* accounts.json */; }; - 477120A8254C289B00B28C64 /* ContactTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477120A7254C289B00B28C64 /* ContactTabView.swift */; }; 477120AE254C28F900B28C64 /* TabSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477120AD254C28F900B28C64 /* TabSupport.swift */; }; 477120BC254C401E00B28C64 /* AddressRecord+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477120BB254C401E00B28C64 /* AddressRecord+CoreDataProperties.swift */; }; 477120C2254C676000B28C64 /* ContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477120C1254C676000B28C64 /* ContactView.swift */; }; @@ -296,12 +297,14 @@ 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIMEHelpers.swift; sourceTree = "<group>"; }; 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CHelpers.swift; sourceTree = "<group>"; }; 101F3BA8A4325D747C9721A1 /* Pods-enzevalos_iphoneTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.debug.xcconfig"; path = "Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.debug.xcconfig"; sourceTree = "<group>"; }; + 32261742260C7CE60068CBD4 /* ContactMailListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactMailListView.swift; sourceTree = "<group>"; }; 3E6B07DD2011246500E49609 /* invitationText.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = invitationText.html; path = Invitation/invitationText.html; sourceTree = "<group>"; }; 3E9708AD1FAC925D005825C9 /* enzevalos_iphone.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = enzevalos_iphone.entitlements; sourceTree = "<group>"; }; 3E9708AE1FAC925D005825C9 /* enzevalos-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "enzevalos-Info.plist"; sourceTree = "<group>"; }; 3EB4FAA320120096001D0625 /* DialogOption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DialogOption.swift; sourceTree = "<group>"; }; 3EC35F2320037651008BDF95 /* InvitationHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = InvitationHelper.swift; path = Invitation/InvitationHelper.swift; sourceTree = "<group>"; }; 3EC35F2F2003838E008BDF95 /* InvitationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitationTests.swift; sourceTree = "<group>"; }; + 3F071ED22611BF6900E121F0 /* InboxRefreshModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InboxRefreshModel.swift; sourceTree = "<group>"; }; 3FB75DC425FFA75B00919925 /* ComposeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeView.swift; sourceTree = "<group>"; }; 3FB75DC825FFA77800919925 /* RecipientRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipientRowView.swift; sourceTree = "<group>"; }; 3FB75DCC25FFD37400919925 /* RecipientListView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecipientListView.swift; sourceTree = "<group>"; }; @@ -456,7 +459,7 @@ 4764067D2416AA6F00C7D426 /* asn1err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1err.h; sourceTree = "<group>"; }; 476406892416B54D00C7D426 /* KeyRecordRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyRecordRow.swift; sourceTree = "<group>"; }; 4764068B2416B54D00C7D426 /* InboxCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InboxCoordinator.swift; sourceTree = "<group>"; }; - 4764068D2416B54D00C7D426 /* CiricleImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CiricleImage.swift; sourceTree = "<group>"; }; + 4764068D2416B54D00C7D426 /* CircleImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircleImage.swift; sourceTree = "<group>"; }; 4764068E2416B54D00C7D426 /* SearchView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = "<group>"; }; 4764068F2416B54D00C7D426 /* MailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailView.swift; sourceTree = "<group>"; }; 476406922416B54D00C7D426 /* VCSwiftUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VCSwiftUIView.swift; sourceTree = "<group>"; }; @@ -470,7 +473,6 @@ 476EEF9A22A872BF00BB4EF7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 476EEFA022A873A800BB4EF7 /* OnboardingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingTest.swift; sourceTree = "<group>"; }; 476EEFA622A87B9800BB4EF7 /* accounts.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = accounts.json; sourceTree = "<group>"; }; - 477120A7254C289B00B28C64 /* ContactTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactTabView.swift; sourceTree = "<group>"; }; 477120AD254C28F900B28C64 /* TabSupport.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabSupport.swift; sourceTree = "<group>"; }; 477120BB254C401E00B28C64 /* AddressRecord+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AddressRecord+CoreDataProperties.swift"; sourceTree = "<group>"; }; 477120C1254C676000B28C64 /* ContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContactView.swift; sourceTree = "<group>"; }; @@ -530,7 +532,7 @@ 47C112C92531E9B000621A07 /* AttachmentRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentRecord.swift; sourceTree = "<group>"; }; 47C22280218AFD6300BD2C2B /* AutocryptTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocryptTest.swift; sourceTree = "<group>"; }; 47C22282218B02C700BD2C2B /* autocryptSimpleExample1.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = autocryptSimpleExample1.eml; sourceTree = "<group>"; }; - 47C3490125489F52008D290C /* MailRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MailRowView.swift; path = enzevalos_iphone/SwiftUI/SupportingViews/MailRowView.swift; sourceTree = SOURCE_ROOT; }; + 47C3490125489F52008D290C /* MailRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MailRowView.swift; path = enzevalos_iphone/SwiftUI/Inbox/MailRowView.swift; sourceTree = SOURCE_ROOT; }; 47C8224324379EAE005BCE73 /* AttachmentsViewMain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AttachmentsViewMain.swift; sourceTree = "<group>"; }; 47C8224924379EAE005BCE73 /* DialogView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DialogView.swift; sourceTree = "<group>"; }; 47C8224A24379EAE005BCE73 /* FloatingActionButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FloatingActionButton.swift; sourceTree = "<group>"; }; @@ -967,6 +969,7 @@ 4750BDE02539C5FC00F6D5AB /* InboxView.swift */, 47FA8EAB254D77DE006883D0 /* MailListView.swift */, 47C3490125489F52008D290C /* MailRowView.swift */, + 3F071ED22611BF6900E121F0 /* InboxRefreshModel.swift */, ); path = Inbox; sourceTree = "<group>"; @@ -979,7 +982,7 @@ 47C822612438A81C005BCE73 /* MapView.swift */, 47EABF2A2423C20C00774A93 /* LoadingBlocker.swift */, 47EABF282423C1FB00774A93 /* KeyboardChecker.swift */, - 4764068D2416B54D00C7D426 /* CiricleImage.swift */, + 4764068D2416B54D00C7D426 /* CircleImage.swift */, 4764068E2416B54D00C7D426 /* SearchView.swift */, 4764068F2416B54D00C7D426 /* MailView.swift */, 476406902416B54D00C7D426 /* SwiftUI to UIKit */, @@ -1035,8 +1038,8 @@ 477120A6254C287B00B28C64 /* Contact */ = { isa = PBXGroup; children = ( - 477120A7254C289B00B28C64 /* ContactTabView.swift */, 477120C1254C676000B28C64 /* ContactView.swift */, + 32261742260C7CE60068CBD4 /* ContactMailListView.swift */, ); path = Contact; sourceTree = "<group>"; @@ -1872,7 +1875,6 @@ files = ( 476801DE21846A5A00F7F259 /* OutgoingMail.swift in Sources */, 47B71AAF2538354A00CA87C6 /* OnboardingValueState.swift in Sources */, - 477120A8254C289B00B28C64 /* ContactTabView.swift in Sources */, 47BCAF2A259CD5CE0008FE4B /* KeyManagementModel.swift in Sources */, 47C09C76243B3395007F74A2 /* SmallContactListView.swift in Sources */, 47EABF272423BFDD00774A93 /* AuthenticationScreen.swift in Sources */, @@ -1888,6 +1890,7 @@ 4775D7AC243F18BC0052F2CC /* SecurityBriefingView.swift in Sources */, 971D404A2428C87E002FCD31 /* BadgeCaseView.swift in Sources */, 47C8225B24379EAE005BCE73 /* MessageViewMain.swift in Sources */, + 3F071ED32611BF6900E121F0 /* InboxRefreshModel.swift in Sources */, 47FAE30E2524AA97005A1BCB /* DataModel.xcdatamodeld in Sources */, 47A5D6E22294BF3B0084F81D /* TempKey.swift in Sources */, 47C8226B2438A86B005BCE73 /* SenderViewMain.swift in Sources */, @@ -1918,6 +1921,7 @@ 47EABF2B2423C20C00774A93 /* LoadingBlocker.swift in Sources */, 475B00351F7B9565006CDD41 /* CryptoObject.swift in Sources */, 4706D661225CD21D00B3F1D3 /* ExportKeyHelper.swift in Sources */, + 32261743260C7CE60068CBD4 /* ContactMailListView.swift in Sources */, 4775D7B02443539E0052F2CC /* DialogProtocols.swift in Sources */, 475B00331F7B9565006CDD41 /* SwiftPGP.swift in Sources */, 477548E421F77BA0000B22A8 /* StudyParameterProtocol.swift in Sources */, @@ -1956,7 +1960,7 @@ 47C8225324379EAE005BCE73 /* AttachmentsViewMain.swift in Sources */, 678942612430C3D600C746D1 /* Typosquatting.swift in Sources */, 47C112CA2531E9B000621A07 /* AttachmentRecord.swift in Sources */, - 476406982416B54D00C7D426 /* CiricleImage.swift in Sources */, + 476406982416B54D00C7D426 /* CircleImage.swift in Sources */, A111F6AD1FA77B170060AFDE /* LoggerDetail.swift in Sources */, 47358D92244A5AEA000116D7 /* SelectableTextView.swift in Sources */, 0EF148052422543E00B3C198 /* Certificate.swift in Sources */, diff --git a/enzevalos_iphone.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/enzevalos_iphone.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000000000000000000000000000000000000..2b3d923d4b7a393c5e30f2d866e022de482c88ae --- /dev/null +++ b/enzevalos_iphone.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "MailCore2", + "repositoryURL": "https://github.com/MailCore/mailcore2", + "state": { + "branch": "master", + "revision": "fad23d736ed5a63cf8321469d3a98a583f55df97", + "version": null + } + } + ] + }, + "version": 1 +} diff --git a/enzevalos_iphone/Assets.xcassets/Contents.json b/enzevalos_iphone/Assets.xcassets/Contents.json index da4a164c918651cdd1e11dca5cc62c333f097601..73c00596a7fca3f3d4bdd64053b69d86745f9e10 100644 --- a/enzevalos_iphone/Assets.xcassets/Contents.json +++ b/enzevalos_iphone/Assets.xcassets/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Bob.imageset/Bob.png b/enzevalos_iphone/Assets.xcassets/Emoji/Bob.imageset/Bob.png new file mode 100644 index 0000000000000000000000000000000000000000..14aa18d366980484d11953602334f7d309526d1c Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/Emoji/Bob.imageset/Bob.png differ diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Bob.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/Emoji/Bob.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..52101c069952788e41b9075195e29e2567a92279 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/Emoji/Bob.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Bob.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Charlie.imageset/Charlie.png b/enzevalos_iphone/Assets.xcassets/Emoji/Charlie.imageset/Charlie.png new file mode 100644 index 0000000000000000000000000000000000000000..40d7f299dd23737684a80d4c20f43a4e55c460f1 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/Emoji/Charlie.imageset/Charlie.png differ diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Charlie.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/Emoji/Charlie.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..0179af56ad3d75b3c08c86f4cd07c03f71eec8cf --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/Emoji/Charlie.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Charlie.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Contents.json b/enzevalos_iphone/Assets.xcassets/Emoji/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..73c00596a7fca3f3d4bdd64053b69d86745f9e10 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/Emoji/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Dali.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/Emoji/Dali.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..92701ba28084ee6a528c78a32a3920f94575fb6d --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/Emoji/Dali.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "Dali.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/Emoji/Dali.imageset/Dali.png b/enzevalos_iphone/Assets.xcassets/Emoji/Dali.imageset/Dali.png new file mode 100644 index 0000000000000000000000000000000000000000..48ced29b177bbf0cc4bb1bf70d07d6451bf86771 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/Emoji/Dali.imageset/Dali.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..73c00596a7fca3f3d4bdd64053b69d86745f9e10 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon0.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon0.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..496e8eb0268227c198956b876ecef28b9085a3cd --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon0.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs106047397033627025.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon0.imageset/cs106047397033627025.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon0.imageset/cs106047397033627025.png new file mode 100644 index 0000000000000000000000000000000000000000..48e64f12b73d5499247817958f9ec82674ffab3a Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon0.imageset/cs106047397033627025.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon1.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon1.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..4cedc09fe6486b5ac03456955ae4dc30c50b4a0a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs1048486361028912.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon1.imageset/cs1048486361028912.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon1.imageset/cs1048486361028912.png new file mode 100644 index 0000000000000000000000000000000000000000..ad1ac1f654e2e780532742d0173485248d98985d Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon1.imageset/cs1048486361028912.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon10.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon10.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..338db8581f0597c217577ed558ae41c22f9e03bc --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon10.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs11361288859011089.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon10.imageset/cs11361288859011089.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon10.imageset/cs11361288859011089.png new file mode 100644 index 0000000000000000000000000000000000000000..d505a54998c3f5730effa737086b09409ef58397 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon10.imageset/cs11361288859011089.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon11.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon11.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..b7593b26054e4e53d665b853bdd38ef15b80c09c --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon11.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs11365107979606767.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon11.imageset/cs11365107979606767.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon11.imageset/cs11365107979606767.png new file mode 100644 index 0000000000000000000000000000000000000000..2312cd74dcd5ea24f05cfa8039bc8f8fa4f060ae Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon11.imageset/cs11365107979606767.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon12.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon12.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..6684493348f6a7b875de71facc2fa47f84567d21 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon12.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs100214067654451312.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon12.imageset/cs100214067654451312.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon12.imageset/cs100214067654451312.png new file mode 100644 index 0000000000000000000000000000000000000000..96bef50261f112caab347281c7fb28a08cf51dfc Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon12.imageset/cs100214067654451312.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon13.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon13.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..05a8819435bec81b50f2c77f07b483c7db116b42 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon13.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs100279640926771550.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon13.imageset/cs100279640926771550.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon13.imageset/cs100279640926771550.png new file mode 100644 index 0000000000000000000000000000000000000000..f877df997deb8e22605d5c08ec5aaf72c2c6ca43 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon13.imageset/cs100279640926771550.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon14.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon14.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..0c696b626f520a93a3859db3c788f841f73bf682 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon14.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs100367196602765414.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon14.imageset/cs100367196602765414.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon14.imageset/cs100367196602765414.png new file mode 100644 index 0000000000000000000000000000000000000000..c74b100d09da0bd9008e06f5ba0011bdc6117352 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon14.imageset/cs100367196602765414.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon15.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon15.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..f490b311fe8f84c03538e23ab7b6a9390731ca2d --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon15.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs100444304289930325.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon15.imageset/cs100444304289930325.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon15.imageset/cs100444304289930325.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1ddbc4c127b2d919b98c34f277800d55166e38 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon15.imageset/cs100444304289930325.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon16.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon16.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..395c24bedef29c2de5d9ea66def18da123bc7447 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon16.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs100630750052269087.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon16.imageset/cs100630750052269087.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon16.imageset/cs100630750052269087.png new file mode 100644 index 0000000000000000000000000000000000000000..5538bd7d7045830335dcc15f39d377133376eec7 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon16.imageset/cs100630750052269087.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon17.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon17.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..9a1dfe50c77304a216bad049622a49ffe88a1c2a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon17.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs101172805621739638.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon17.imageset/cs101172805621739638.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon17.imageset/cs101172805621739638.png new file mode 100644 index 0000000000000000000000000000000000000000..347634eda5fd41d28d019945218022d12f429ed3 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon17.imageset/cs101172805621739638.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon18.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon18.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..0dd2fd6e215e85f62e3a60d368f2923e4b358679 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon18.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs101724504648038815.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon18.imageset/cs101724504648038815.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon18.imageset/cs101724504648038815.png new file mode 100644 index 0000000000000000000000000000000000000000..06fcdb878ce1df261cee59be8c09d4550e35e28e Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon18.imageset/cs101724504648038815.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon19.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon19.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..3ef802f763b4576c72ed21a3b7199be9df1f3469 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon19.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs101767157496046490.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon19.imageset/cs101767157496046490.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon19.imageset/cs101767157496046490.png new file mode 100644 index 0000000000000000000000000000000000000000..e113ad31599dd6638832a7aba607359267912c8b Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon19.imageset/cs101767157496046490.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon2.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon2.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..38f52c2b2f958660a1768ea3097aa204e59092ef --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon2.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs1125646615313076.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon2.imageset/cs1125646615313076.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon2.imageset/cs1125646615313076.png new file mode 100644 index 0000000000000000000000000000000000000000..c3a55f4c1a9ff84c8df4d923f56b8c8d15c047ee Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon2.imageset/cs1125646615313076.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon20.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon20.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..8c1322604bf1150d333ed0a1c9dd05f85ad7db9b --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon20.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs101957715605808227.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon20.imageset/cs101957715605808227.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon20.imageset/cs101957715605808227.png new file mode 100644 index 0000000000000000000000000000000000000000..eaaaccb1328738274c422a15ece0dc2a521ae32d Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon20.imageset/cs101957715605808227.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon21.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon21.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..28444de308d77cea333cc814e3eb95ae51da3c49 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon21.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs102400950696764945.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon21.imageset/cs102400950696764945.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon21.imageset/cs102400950696764945.png new file mode 100644 index 0000000000000000000000000000000000000000..1b49c5a2eb373e748a0ce8ef8650c4d4b54cb2dd Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon21.imageset/cs102400950696764945.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon22.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon22.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..219fd315a0bbfe3a0cad75a11408ad8bb06c105f --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon22.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs102422236815498498.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon22.imageset/cs102422236815498498.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon22.imageset/cs102422236815498498.png new file mode 100644 index 0000000000000000000000000000000000000000..71299059b2d9e388ac0de18e2e6b7442e54084bf Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon22.imageset/cs102422236815498498.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon23.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon23.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..5d3c0efffa89f0f2b7038dc7529a6ca14d0a1a0a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon23.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs102861240281778234.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon23.imageset/cs102861240281778234.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon23.imageset/cs102861240281778234.png new file mode 100644 index 0000000000000000000000000000000000000000..067b3a5c69dae65a0659c6635a46a73ec37afeb4 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon23.imageset/cs102861240281778234.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon24.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon24.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..1a337b718d665279d11ddfff348b03fe7b695084 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon24.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs102996970073821635.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon24.imageset/cs102996970073821635.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon24.imageset/cs102996970073821635.png new file mode 100644 index 0000000000000000000000000000000000000000..2751f69a935a64ffb8db5f2f565dd63a4f6cf4de Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon24.imageset/cs102996970073821635.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon25.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon25.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..63fabbc993eb6326906dadc667e5ba34a5268fc5 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon25.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103078152548071803.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon25.imageset/cs103078152548071803.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon25.imageset/cs103078152548071803.png new file mode 100644 index 0000000000000000000000000000000000000000..c288ef5fe0be6b9ba12152c15a0c500771b268d4 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon25.imageset/cs103078152548071803.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon26.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon26.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..fbd42b9f93d4b9d85cf3a4d6f6562c265daaf673 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon26.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103423283580625484.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon26.imageset/cs103423283580625484.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon26.imageset/cs103423283580625484.png new file mode 100644 index 0000000000000000000000000000000000000000..751fb817f525e7cf27d64e46a908b507ace4b89b Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon26.imageset/cs103423283580625484.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon27.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon27.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..6f2c97887de277cb953b9ad876cf61c6f6eb8ed3 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon27.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103486772320911001.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon27.imageset/cs103486772320911001.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon27.imageset/cs103486772320911001.png new file mode 100644 index 0000000000000000000000000000000000000000..52f54a89f4006422e4a7110e2009c83d7e5f0783 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon27.imageset/cs103486772320911001.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon28.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon28.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..8326d093abfa0a8cdc90ab184fd67a748e38fee9 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon28.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103587423973880298.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon28.imageset/cs103587423973880298.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon28.imageset/cs103587423973880298.png new file mode 100644 index 0000000000000000000000000000000000000000..b5d1a1c549c75d6aae45d2f2608076f2ec0601a7 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon28.imageset/cs103587423973880298.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon29.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon29.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..6f177f7ae25159a9772bf41347bc3901eab33314 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon29.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103659213402785408.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon29.imageset/cs103659213402785408.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon29.imageset/cs103659213402785408.png new file mode 100644 index 0000000000000000000000000000000000000000..330c5d5e9b683427a099d91e8706f644820940e1 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon29.imageset/cs103659213402785408.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon3.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon3.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..f0923e2363d779a81aa61604ad370093376d38df --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon3.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs10188651804540743.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon3.imageset/cs10188651804540743.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon3.imageset/cs10188651804540743.png new file mode 100644 index 0000000000000000000000000000000000000000..50980539b3497d64d721534865f44378b7204f34 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon3.imageset/cs10188651804540743.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon30.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon30.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..087b947a0ca104c0b880f6995303438f2f6997a0 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon30.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103663933281312281.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon30.imageset/cs103663933281312281.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon30.imageset/cs103663933281312281.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f45e7dea862d2ad21c6e506267ac17abb89a96 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon30.imageset/cs103663933281312281.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon31.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon31.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..0121902d7227f15ed62798d39526dab8eee7a649 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon31.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103822919467497853.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon31.imageset/cs103822919467497853.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon31.imageset/cs103822919467497853.png new file mode 100644 index 0000000000000000000000000000000000000000..d10d1e1591dee487f4948ab0e2ee31f30d092af2 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon31.imageset/cs103822919467497853.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon32.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon32.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..3cfe11a74f52c0ec33e48e02b5fb1722b0a9432a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon32.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs103987180036984774.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon32.imageset/cs103987180036984774.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon32.imageset/cs103987180036984774.png new file mode 100644 index 0000000000000000000000000000000000000000..dbeb21ecf8a690b9477878c7515f8e4c6eecaa8c Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon32.imageset/cs103987180036984774.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon33.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon33.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..6ad87612de6e027a9da143b04d19c51554cb4d91 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon33.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104029297788010187.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon33.imageset/cs104029297788010187.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon33.imageset/cs104029297788010187.png new file mode 100644 index 0000000000000000000000000000000000000000..446cfadbbfeacc81c9011e775dfcee12a22e4602 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon33.imageset/cs104029297788010187.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon34.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon34.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..f3aa89dfd6f44dca7ea26c97969b0159d965143a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon34.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104058099070443101.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon34.imageset/cs104058099070443101.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon34.imageset/cs104058099070443101.png new file mode 100644 index 0000000000000000000000000000000000000000..2135438a60379a8d88c2bf58a0cdcf713dc19392 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon34.imageset/cs104058099070443101.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon35.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon35.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..dec2c1a6a060079b85091dc73f4b5e848ef1f5a4 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon35.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104393807829754417.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon35.imageset/cs104393807829754417.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon35.imageset/cs104393807829754417.png new file mode 100644 index 0000000000000000000000000000000000000000..763f1123f18283c818dc42077357e1d147259e35 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon35.imageset/cs104393807829754417.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon36.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon36.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..96f398a10cc852aaa18486576992416e64efe2c4 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon36.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104495237148868391.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon36.imageset/cs104495237148868391.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon36.imageset/cs104495237148868391.png new file mode 100644 index 0000000000000000000000000000000000000000..1d89152b84bc2c416d78a314db3c4b6b160ec06e Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon36.imageset/cs104495237148868391.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon37.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon37.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..9ed14548fdb989088ade439514dd13cbbe2ce592 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon37.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104551932686398700.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon37.imageset/cs104551932686398700.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon37.imageset/cs104551932686398700.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e12aabe39cb276ef7c1b2baab76a0a427dfac2 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon37.imageset/cs104551932686398700.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon38.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon38.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..32e25c04674ad9779421dbcc15e7fc24a963f8e9 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon38.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104563437674275986.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon38.imageset/cs104563437674275986.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon38.imageset/cs104563437674275986.png new file mode 100644 index 0000000000000000000000000000000000000000..80b8bbdee67916439d71bb83409188aea6c80caf Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon38.imageset/cs104563437674275986.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon39.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon39.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..75bf0a262869fe3fd5a4fcb1c2281e038d14f9aa --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon39.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104924347815727490.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon39.imageset/cs104924347815727490.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon39.imageset/cs104924347815727490.png new file mode 100644 index 0000000000000000000000000000000000000000..e054f4f61c806907f22c9ccbca50430e8103c726 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon39.imageset/cs104924347815727490.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon4.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon4.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..ae1963922e94ffef4c3191d6546fdd7d5f28abe5 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon4.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs10445905019035139.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon4.imageset/cs10445905019035139.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon4.imageset/cs10445905019035139.png new file mode 100644 index 0000000000000000000000000000000000000000..44774132c039b46588e943150a30318182e7a07e Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon4.imageset/cs10445905019035139.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon40.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon40.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..9b88b2b40820b96dffb8d710a29049a4868c14b1 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon40.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104968955657654599.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon40.imageset/cs104968955657654599.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon40.imageset/cs104968955657654599.png new file mode 100644 index 0000000000000000000000000000000000000000..66f35cdd9bbda00f22e74d5b648a1479eeb4dc76 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon40.imageset/cs104968955657654599.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon41.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon41.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..e6c66436bf2dc333142f12f4a7c08e309c00998a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon41.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs104983947614280485.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon41.imageset/cs104983947614280485.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon41.imageset/cs104983947614280485.png new file mode 100644 index 0000000000000000000000000000000000000000..5edf414d8577b60e82353e3dbabfc7106d2891dd Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon41.imageset/cs104983947614280485.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon42.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon42.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..c6ff1625f739f732cfa85f3de658be1460be4a80 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon42.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105013173991731446.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon42.imageset/cs105013173991731446.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon42.imageset/cs105013173991731446.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8a58ea8795b1f00903f364f9599df24badbb69 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon42.imageset/cs105013173991731446.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon43.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon43.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..5002cf9df80fa89c505f8d526595ce9ec0972aee --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon43.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105105240413858862.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon43.imageset/cs105105240413858862.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon43.imageset/cs105105240413858862.png new file mode 100644 index 0000000000000000000000000000000000000000..bea0dc1c4e86d85f68f625e1eb4682db319b8eec Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon43.imageset/cs105105240413858862.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon44.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon44.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..3ad0622ae2fb737cc7e1395adeb962da6453bd94 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon44.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105149584509303839.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon44.imageset/cs105149584509303839.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon44.imageset/cs105149584509303839.png new file mode 100644 index 0000000000000000000000000000000000000000..a640b8d4a871a04da22627ef694207f10085848e Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon44.imageset/cs105149584509303839.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon45.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon45.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..c9b0db0adaab321308a8d6d0522485f1778f2adf --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon45.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105316240118440367.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon45.imageset/cs105316240118440367.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon45.imageset/cs105316240118440367.png new file mode 100644 index 0000000000000000000000000000000000000000..d29d5d1f047c75f6336e3b226e40b3018ed0bd32 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon45.imageset/cs105316240118440367.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon46.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon46.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..5c3b3024252290093c1b5404f5ca7acdd8a5039c --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon46.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105362030430960514.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon46.imageset/cs105362030430960514.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon46.imageset/cs105362030430960514.png new file mode 100644 index 0000000000000000000000000000000000000000..d428489cd9cc8b66f501f320e21030bfb4670e7e Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon46.imageset/cs105362030430960514.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon47.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon47.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..256ece6df4710932f85246a486940506b56dbb7f --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon47.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105479796479016880.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon47.imageset/cs105479796479016880.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon47.imageset/cs105479796479016880.png new file mode 100644 index 0000000000000000000000000000000000000000..e47b2b4bcaa0d506c9eb14174b15e65688233f42 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon47.imageset/cs105479796479016880.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon48.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon48.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..e3b0427819f0b763a979f3144d00c82a719afe2e --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon48.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105703236117912354.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon48.imageset/cs105703236117912354.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon48.imageset/cs105703236117912354.png new file mode 100644 index 0000000000000000000000000000000000000000..6e37608f3cc7b67129d390988c7342768bc9c424 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon48.imageset/cs105703236117912354.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon49.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon49.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..d433ca724435ef186c049528eed3cf21aa4641cf --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon49.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs105773704768325821.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon49.imageset/cs105773704768325821.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon49.imageset/cs105773704768325821.png new file mode 100644 index 0000000000000000000000000000000000000000..a64db374e9df610ccf4aeec5213dd2c36cedae92 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon49.imageset/cs105773704768325821.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon5.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon5.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..5535049bb256b2bb47d7b85166a4a8f0da044b7b --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon5.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs10562124521050923.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon5.imageset/cs10562124521050923.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon5.imageset/cs10562124521050923.png new file mode 100644 index 0000000000000000000000000000000000000000..ae477d1aec529fe72d47662e001cf1966ebb18c0 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon5.imageset/cs10562124521050923.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon6.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon6.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..d43774e8df226162f7ee9b8ac35cfa296e6e9a3e --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon6.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs10712649413789781.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon6.imageset/cs10712649413789781.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon6.imageset/cs10712649413789781.png new file mode 100644 index 0000000000000000000000000000000000000000..f85eb18b0b8afc7321aa81812fa5d1cc0af0b1dd Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon6.imageset/cs10712649413789781.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon7.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon7.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..caf61571caa980625df6b9898c341f9c0c3a478a --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon7.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs10823521825795415.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon7.imageset/cs10823521825795415.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon7.imageset/cs10823521825795415.png new file mode 100644 index 0000000000000000000000000000000000000000..ca50dda317073731b6972f452a56be6094f19345 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon7.imageset/cs10823521825795415.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon8.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon8.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..f12be0f3ead14afffe1e1f5f7ff368bb578a16b2 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon8.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs11010345522393046.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon8.imageset/cs11010345522393046.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon8.imageset/cs11010345522393046.png new file mode 100644 index 0000000000000000000000000000000000000000..211a13b985892a7a36d035f2d9b76bf512051035 Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon8.imageset/cs11010345522393046.png differ diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon9.imageset/Contents.json b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon9.imageset/Contents.json new file mode 100644 index 0000000000000000000000000000000000000000..a79376486d51752d903ccac2620d7d632be7ae01 --- /dev/null +++ b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon9.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "cs11096764340505821.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/enzevalos_iphone/Assets.xcassets/cartoons/cartoon9.imageset/cs11096764340505821.png b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon9.imageset/cs11096764340505821.png new file mode 100644 index 0000000000000000000000000000000000000000..bedd6184ea119dddc60b011b9aea6853e91305bf Binary files /dev/null and b/enzevalos_iphone/Assets.xcassets/cartoons/cartoon9.imageset/cs11096764340505821.png differ diff --git a/enzevalos_iphone/CNContactExtension.swift b/enzevalos_iphone/CNContactExtension.swift index 32a227a323193fa6aabe6f8d9dddd5b2edfa1e1c..d7d6955d0573a7ab02b15fb5ce29507e63de1564 100644 --- a/enzevalos_iphone/CNContactExtension.swift +++ b/enzevalos_iphone/CNContactExtension.swift @@ -42,3 +42,12 @@ extension CNContact { } } + +extension UIColor { + static var random: UIColor { + return UIColor(red: .random(in: 0...1), + green: .random(in: 0...1), + blue: .random(in: 0...1), + alpha: 1.0) + } +} diff --git a/enzevalos_iphone/ContactHandler.swift b/enzevalos_iphone/ContactHandler.swift index 35f37d2205e573fbd091dc92667ffb28b13174ff..82c3d01f7102d31d258702353679b575fd4bf130 100644 --- a/enzevalos_iphone/ContactHandler.swift +++ b/enzevalos_iphone/ContactHandler.swift @@ -24,6 +24,8 @@ import SwiftUI // TODO: Mark displayname as from CNContact class ContactHandler { + static var cartoons = true + private let store = CNContactStore() static let handler = ContactHandler() let keysToFetch = [CNContactGivenNameKey, CNContactFamilyNameKey, CNContactNicknameKey, CNContactIdentifierKey, CNContactImageDataKey] as [CNKeyDescriptor] @@ -99,6 +101,17 @@ class ContactHandler { } } + + private static func mapToCartoon(name: String, key: String?) -> Image { + let maxCartoons = 50 + var id = abs(name.hash % maxCartoons) + if let key = key { + id = abs(key.hash % maxCartoons) + } + return Image("cartoon\(id)") + .resizable() + } + public static func makeImageFromName(_ name: String, color: UIColor) -> UIImage { var text: NSAttributedString var tag = String() @@ -148,6 +161,10 @@ class ContactHandler { if let imageData = addr.image, let image = UIImage(data: imageData) { return Image(uiImage: image) } + if cartoons { + // TODO: Fix mapping to key. + return mapToCartoon(name: addr.name, key: nil) + } return Image(uiImage: makeImageFromName(addr.name, color: getColor(name: addr.name) )) } diff --git a/enzevalos_iphone/MailHandler.swift b/enzevalos_iphone/MailHandler.swift index f7d8dfc24db881731955f87dc94ac1a1e6e8dbf2..f3e06fee3e624ad0fc8a9062bd9e69c781b770f5 100644 --- a/enzevalos_iphone/MailHandler.swift +++ b/enzevalos_iphone/MailHandler.swift @@ -61,6 +61,9 @@ static var INBOX: String { return UserManager.backendInboxFolderPath } + static var SENT: String { + return UserManager.backendSentFolderPath + } private var IMAPSes: MCOIMAPSession? var IMAPSession: MCOIMAPSession? { if IMAPSes == nil { diff --git a/enzevalos_iphone/PreviewSampleData/SimulatorData.swift b/enzevalos_iphone/PreviewSampleData/SimulatorData.swift index 88cd8056f6caf617fa48c4a053884bc28d1966d9..428081ad60c8119a1a478e909bb86c62b1c81398 100644 --- a/enzevalos_iphone/PreviewSampleData/SimulatorData.swift +++ b/enzevalos_iphone/PreviewSampleData/SimulatorData.swift @@ -37,9 +37,9 @@ struct SimulatorData_Previews: PreviewProvider { struct ProxyData { // Different Contacts - static let Alice = ProxyContact(name: "Alice", email: "alice@example.com", avatar: ProxyContact.makeImg("Alice", color: .blue)) - static let Bob = ProxyContact(name: "Bob", email: "Bob.lord.of.kingsbridge.and.king.of.england@huge.subdomain.with. a.long.long.long.domain.example.com", avatar: ProxyContact.makeImg("Bob", color: .red)) - static let Charlie = ProxyContact(name: "Charlie", email: "charlie@example.com", avatar: ProxyContact.makeImg("Charlie", color: .green)) + static let Alice = ProxyContact(emails: ["salvador.felipe.jacinto.dali@abc.de"], name: "Salvador Felipe Jacinto Dalí y Domenech", email: "alice@example.com", avatar: ProxyContact.makeImg("Alice", color: .blue)) + static let Bob = ProxyContact(emails: ["hallo@abc.de", "zweildrei.de"], name: "Bob Walker", email: "Bob.lord.of.kingsbridge.and.king.of.england@huge.subdomain.with. a.long.long.long.domain.example.com", avatar: ProxyContact.makeImg("Bob", color: .red)) + static let Charlie = ProxyContact(emails: ["Charlie@blah.de", "zweildrei.de","charlie@gmx.not","Charlie@blah.de", "zweildrei.de","charlie@gmx.nt"], name: "Charlie Marley", email: "charlie@example.com", avatar: ProxyContact.makeImg("Charlie", color: .green)) static let Landmarks = [ Landmark(name: "Berlin", domain: "exampledomain.de", location: .init(latitude: 52.520008, longitude: 13.404954)), Landmark(name: "New York", domain: "secondexampledomain.de", location: .init(latitude: 40.730610, longitude: -73.935242)), @@ -90,6 +90,8 @@ struct ProxyFolder: DisplayFolder { } struct ProxyContact: DisplayContact { + var emails: [String] + typealias K = ProxyPublicKey typealias C = ProxyContact @@ -126,6 +128,15 @@ struct ProxyContact: DisplayContact { } public static func makeImg(_ name: String, color: UIColor) -> Image { + let cartoon = ContactHandler.cartoons + + if cartoon { + let maxCartoons = 50 + let id = abs(name.hash % maxCartoons) + return Image("cartoon\(id)") + .resizable() + } + var text: NSAttributedString var tag = String() if name.count > 0 { @@ -172,12 +183,13 @@ struct ProxyContact: DisplayContact { } -struct ProxyMail: DisplayMail { +struct ProxyMail: DisplayMail, Identifiable { typealias U = ProxyContact typealias D = DialogStruct typealias K = ProxyPublicKey var previewName: String + let id = UUID() var displayAttachments: [DisplayAttachment] = [] @@ -261,3 +273,4 @@ JVBERi0xLjUKJdDUxdgKMTI1IDAgb2JqCjw8Ci9MZW5ndGggNTM1NCAgICAgIAovRmlsdGVyIC9GbGF0 } + diff --git a/enzevalos_iphone/SearchHelper.swift b/enzevalos_iphone/SearchHelper.swift index b6bffdc347dc16b1eb19dce08035fb3bdf18c4f4..bce506aa93388226e4b09e92fa3675cdc8e3c087 100644 --- a/enzevalos_iphone/SearchHelper.swift +++ b/enzevalos_iphone/SearchHelper.swift @@ -8,51 +8,39 @@ import Foundation -/** - A collection of helper methods that are used for the different search bars - */ - -/** - Function to be used to find mails that contain the search terms. All terms (separated by spaces) need to be contained in the search text. - - parameters: - - content: The String that will be searched - - searchText: Search terms (space-separated) that will be searched for -*/ -func containsSearchTerms ( content : String?, searchText: String) -> Bool -{ - guard searchText.count > 0 else { - ///Case empty search - return true +/// Function used to find mails that contain the search terms. All terms (separated by spaces) need to be contained in the search text. +/// - Parameters: +/// - content: The String that will be searched +/// - searchText: Search terms (space-separated) that will be searched for +func containsSearchTerms(content: String?, searchTerm: String) -> Bool { + guard searchTerm.count > 0 else { + return true // Case empty search } + guard let content = content else { - //Case Mail has no body/subject - return false + return false // Case Mail has no body/subject } - var longterms : [String] = [] - var terms : [String] = [] - //Break String into substrings separated by quoatation marks - longterms = searchText.components(separatedBy: "\"") + var longterms: [String] = [] + var terms: [String] = [] + + // Break string into substrings separated by quotation marks + longterms = searchTerm.components(separatedBy: "\"") + + // Even elements will be outside the quotation marks and need to be separated again var i = 0 - //even elements will be outside the quotation marks and need to be separated again - while (i < longterms.count) - { - if i % 2 == 0 - { + while (i < longterms.count) { + if i % 2 == 0 { terms.append(contentsOf: longterms[i].lowercased().components(separatedBy: " ")) - } - else - { + } else { terms.append(longterms[i].lowercased()) } - i+=1 + i += 1 } var found = true - for t in terms - { - if !(t == "") - { + for t in terms { + if !t.isEmpty { found = found && content.lowercased().contains(t) } } diff --git a/enzevalos_iphone/SwiftUI/Compose/ComposeHeaderView.swift b/enzevalos_iphone/SwiftUI/Compose/ComposeHeaderView.swift index 816644928343d48cc144bb14f1250a05ea95395f..73cdca43c53f33fc5de269bdd73d7f92ae9b78e3 100644 --- a/enzevalos_iphone/SwiftUI/Compose/ComposeHeaderView.swift +++ b/enzevalos_iphone/SwiftUI/Compose/ComposeHeaderView.swift @@ -3,7 +3,19 @@ // enzevalos_iphone // // Created by Chris Offner & Claire Bräuer on 23.03.21. -// Copyright © 2021 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import SwiftUI diff --git a/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift b/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift index 4818189dd7c39185371147ff1810777b5794a90a..b0208bfd360a32995f8a5e0739b56606a8d1f0c6 100644 --- a/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift +++ b/enzevalos_iphone/SwiftUI/Compose/ComposeModel.swift @@ -4,7 +4,19 @@ // // Created by Oliver Wiese on 12.11.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import Foundation diff --git a/enzevalos_iphone/SwiftUI/Compose/ComposeView.swift b/enzevalos_iphone/SwiftUI/Compose/ComposeView.swift index ff007ceaeecdde5aa3ad8e7696fa69cd792b3430..dd9066da3198180fdaa6c091d1b08edb96f6fc34 100644 --- a/enzevalos_iphone/SwiftUI/Compose/ComposeView.swift +++ b/enzevalos_iphone/SwiftUI/Compose/ComposeView.swift @@ -1,9 +1,22 @@ // // ComposeView.swift -// letterbox_prototyping +// enzevalos_iphone // // Created by Chris Offner & Claire Bräuer on 03.03.21. // +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. +// import SwiftUI diff --git a/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift b/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift index 60215330f2281cb238b03750c82a9533c04fc5fe..8cb8b83b85856f6c0120ec3d11d4d39028f7e074 100644 --- a/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift +++ b/enzevalos_iphone/SwiftUI/Compose/RecipientFieldModel.swift @@ -1,10 +1,22 @@ // -// TokenFieldModel.swift +// RecipientFieldModel.swift // enzevalos_iphone // // Created by Oliver Wiese on 31.10.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import Combine diff --git a/enzevalos_iphone/SwiftUI/Compose/RecipientListView.swift b/enzevalos_iphone/SwiftUI/Compose/RecipientListView.swift index 6663d18655be20d6bded7433e67588f40309fa25..62facc14430b92574b5680892b9ef728389ff4cf 100644 --- a/enzevalos_iphone/SwiftUI/Compose/RecipientListView.swift +++ b/enzevalos_iphone/SwiftUI/Compose/RecipientListView.swift @@ -4,6 +4,19 @@ // // Created by Chris Offner & Claire Bräuer on 11.03.21. // +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. +// import SwiftUI diff --git a/enzevalos_iphone/SwiftUI/Compose/RecipientRowView.swift b/enzevalos_iphone/SwiftUI/Compose/RecipientRowView.swift index d09c63355bb6ed077e5268d068c4031b0c0d4ecc..f744f37f7c1258de05f2792899a746d6c1caf757 100644 --- a/enzevalos_iphone/SwiftUI/Compose/RecipientRowView.swift +++ b/enzevalos_iphone/SwiftUI/Compose/RecipientRowView.swift @@ -1,9 +1,22 @@ // -// recipientRowView.swift +// RecipientRowView.swift // letterbox_prototyping // // Created by Chris Offner & Claire Bräuer on 11.03.21. // +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. +// import SwiftUI diff --git a/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift b/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift index e98463dab071dce87dc721aa371d811bab5b8d8c..7cad5be8c9bd5ea01301e2816420b79de05ca382 100644 --- a/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift +++ b/enzevalos_iphone/SwiftUI/Compose/RecipientsModel.swift @@ -1,10 +1,22 @@ // -// SelectReceiverModel.swift +// RecipientsModel.swift // enzevalos_iphone // // Created by Oliver Wiese on 09.11.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import Foundation diff --git a/enzevalos_iphone/SwiftUI/Contact/ContactMailListView.swift b/enzevalos_iphone/SwiftUI/Contact/ContactMailListView.swift new file mode 100644 index 0000000000000000000000000000000000000000..e2f267ef02286f42341ba8ab82e6606baefeb02c --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Contact/ContactMailListView.swift @@ -0,0 +1,150 @@ +// +// ContactMailListView.swift +// enzevalos_iphone +// +// Created by Amir Rajabi and Goekhan Guemues on 25.03.21 +// Copyright © 2021 fu-berlin. All rights reserved. +// + +import SwiftUI +import CoreData + +/// A view that shows up to three emails received from or sent to this contact depending on the folderType. +struct ContactMailListView: View { + public var folderpath: String + public var folderName: String + public var emailAddresses: [String] + public var fetchRequest: FetchRequest<MailRecord> + public var emails: FetchedResults<MailRecord>{fetchRequest.wrappedValue} + + + init(folderpath: String, folderName: String, emailAddresses: [String]) { + fetchRequest = MailRecord.mailsInFolderFetchRequest(folderpath: folderpath) + self.folderpath = folderpath + self.folderName = folderName + self.emailAddresses = emailAddresses + } + + + var body: some View { + ZStack { + newRoundedRectangle() + VStack { + // Creates a filtered array of the array emails + let filteredEmails = self.emails.filter(filterEmailList) + + // Lists up to three emails of the contact from the filtered emails + ForEach (0..<min(3,filteredEmails.count)) { record in + NavigationLink( + destination: ReadMainView(model: ReadModel(mail: filteredEmails[record]))) { + MailRowView(mail: filteredEmails[record], activateOnTap: false) + } + if record < min(2, filteredEmails.count - 1) { + Divider() + } + } + + // If the list contains more than three emails, a button is displayed + if filteredEmails.count > 3{ + HStack { + Spacer() + NavigationLink( + destination: MoreContactMailView(folderpath: folderpath, folderName: folderName, emailAddresses: emailAddresses)) { + Text(NSLocalizedString("Contact.Button.ShowMore", comment: "Contact.Button.ShowMore")) + } + }.padding(.top, -10) + } + + } + .padding(.trailing) + .padding(.vertical, 9) + + } + .padding(.horizontal,5) + } + + /// Depending on the folder type of the email, a check is made as to whether the contact is the sender or recipient of the email. + /// - Parameter email: the email that is being checked + func filterEmailList(email: MailRecord) -> Bool { + + // TODO: Checking the foldertype doesn't list (all) the emails. + // It seems that the set flags in foldertype are buged right now. + // For now it checks the folderName. + if folderName == "Inbox"{ + + if (emailAddresses.contains(email.sender.email)) { + return true + } + } + else{ + + var counter = 0 + + while counter < email.addresses.count { + if (emailAddresses.contains(email.addresses[counter].email)) { + return true + } + counter += 1} + + return false + } + + return false + } + +} + +/// A view to list all emails received from or sent to the contact, depending on the clicked more button in ContactMailListView. +struct MoreContactMailView: View { + var folderpath: String + var folderName: String + var emailAddresses: [String] + + public var fetchRequest: FetchRequest<MailRecord> + public var emails: FetchedResults<MailRecord>{fetchRequest.wrappedValue} + + var receivedHeader: LocalizedStringKey = "Contact.Received.Header" + var sentHeader: LocalizedStringKey = "Contact.Sent.Header" + + + init(folderpath: String, folderName: String, emailAddresses: [String]) { + fetchRequest = MailRecord.mailsInFolderFetchRequest(folderpath: folderpath) + self.folderpath = folderpath + self.folderName = folderName + self.emailAddresses = emailAddresses + } + + + var body: some View { + + // Creates an instance of ContactMailListView to use the filteredEmailList function + let functionCall = ContactMailListView(folderpath: folderpath, folderName: folderName, emailAddresses: emailAddresses) + let filteredEmails = self.emails.filter(functionCall.filterEmailList) + + // The header is set depending on the folder name of the emails retrieved + let header = (folderName == "Sent") ? sentHeader : receivedHeader + HStack{ + Text(header) + .font(.title) + .fontWeight(.semibold) + Spacer() + }.padding(.leading, 21) + .padding(.top, 5) + + List (filteredEmails, id: \.self){ record in + NavigationLink( + destination: ReadMainView(model: ReadModel(mail: record))) { + MailRowView(mail: record, activateOnTap: false) + } + } + } +} + + + +struct ContactMailListView_Previews: PreviewProvider { + static var previews: some View { + ContactMailListView(folderpath: "INBOX", folderName: "INBOX", emailAddresses: []) + .environment(\.managedObjectContext, PersistentDataProvider.proxyPersistentDataProvider.persistentContainer.viewContext) + } +} diff --git a/enzevalos_iphone/SwiftUI/Contact/ContactTabView.swift b/enzevalos_iphone/SwiftUI/Contact/ContactTabView.swift deleted file mode 100644 index 4c6fd44cc1f90e04daf24b1461793fe8a7a61af8..0000000000000000000000000000000000000000 --- a/enzevalos_iphone/SwiftUI/Contact/ContactTabView.swift +++ /dev/null @@ -1,125 +0,0 @@ -// -// ContactView.swift -// enzevalos_iphone -// -// Created by Oliver Wiese on 30.10.20. -// Copyright © 2020 fu-berlin. All rights reserved. -// - -import SwiftUI - -/// A subview for ContactView -struct ContactTabView <C: DisplayContact, M: DisplayMail>: View { - - public var contact: C - public var fromMail: M? - public var derivedFromKey: Bool = true - - private var keyID: String? { - return fromMail?.signatureKey?.keyID - } - - var body: some View { - VStack{ - VStack(alignment: .leading, spacing: 3) { - Text(contact.name) - .font(.title) - rating - if contact.name != contact.email { - row(label: "ContactView.EMail.Name", data: contact.email, action: composeMail) - .padding(.bottom, 10) - } - key - }.padding(5) - icon - backgroundInfo - Spacer() - } - } - - private var icon: some View { - contact.avatar - .resizable() - .frame(width: 130, height: 110) - .clipShape(Circle()) - .overlay(Circle().stroke(Color.white, lineWidth: 4)) - .shadow(radius: 10) - .padding(10) - } - - private var key: AnyView? { - if let keyID = keyID { - var label: LocalizedStringKey = "ContactView.Key.Signature.Name" - if fromMail == nil { - label = "ContactView.Key.Primary.Name" - } - return AnyView(row(label: label, data: keyID, action: inspectKey)) - } else { - return AnyView(Button("Invitation.Welcome.Try.InvitationMail", action: invite)) - } - } - - private var rating: some View { - HStack { - Text("ContactView.Rating.Name") - .foregroundColor(.gray) - Text(contact.rating(mail: fromMail).name) - .foregroundColor(contact.rating(mail: fromMail).color) - } - } - - var backgroundInfo: some View { - VStack (alignment: .leading, spacing: 3){ - if derivedFromKey, let discovery = contact.primaryKey?.discovery { - row(label: "ContactView.KnownSince", data: discovery.dateToString, action: nil) // TODO Add discovery mail? - } else if let discovery = contact.discovery { - row(label: "ContactView.KnownSince", data: discovery.dateToString, action: nil) - } else { - row(label: "ContactView.KnownSince.Unknown", data:nil, action: nil) - } - if derivedFromKey, let last = contact.primaryKey?.lastSeen { - row(label: "ContactView.LastMail.Name", data: last.dateToString, action: nil) - } - else if let last = contact.last { - row(label: "ContactView.LastMail.Name", data: last.dateToString, action: nil) - } else { - row(label: "ContactView.LastMail.No", data: nil, action: nil) - } - } .padding(10) - } - - private func row(label: LocalizedStringKey, data: String?, action: ((()->Void)?)) -> some View { - HStack { - Text(label) - .foregroundColor(.gray) - if let data = data, let action = action { - Button(data, action: action) - } else if let data = data{ - Text(data) - .foregroundColor(.gray) - } - } - } - - private func composeMail() { - print("Compose mail!") - } - - private func inspectKey() { - print("Inspect key!") - } - - private func invite() { - print("Invite user!") - } - -} - -struct ContactTabView_Previews: PreviewProvider { - static var previews: some View { - ContactTabView<ProxyContact, ProxyMail>(contact: ProxyData.Alice) - ContactTabView<ProxyContact, ProxyMail>(contact: ProxyData.Bob) - ContactTabView<ProxyContact, ProxyMail>(contact: ProxyData.Charlie) - - } -} diff --git a/enzevalos_iphone/SwiftUI/Contact/ContactView.swift b/enzevalos_iphone/SwiftUI/Contact/ContactView.swift index aba0935a46e7feef5a54f9c86071afe5dfcb191c..310dbf7430ddb30a5ca1cb0d9d3b9c00cd375298 100644 --- a/enzevalos_iphone/SwiftUI/Contact/ContactView.swift +++ b/enzevalos_iphone/SwiftUI/Contact/ContactView.swift @@ -3,6 +3,7 @@ // enzevalos_iphone // // Created by Oliver Wiese on 30.10.20. +// Modified by Amir Rajabi and Goekhan Guemues on 25.03.21 // Copyright © 2020 fu-berlin. All rights reserved. // @@ -10,41 +11,307 @@ import SwiftUI // TODO: Add contact book, related addresses, related keys, related mails. -struct ContactView <C: DisplayContact, M: DisplayMail>: View { +/// A model of all published properties used in ContactView +class ContactProperties: ObservableObject { + @Published var emailAddress: String = "" + @Published var showKeysPopup = false + @Published var composeMail = false +} + +/// A contact view with all associated email addresses and also some emails received from or sent to this contact. +/// - Parameter contact: the contact that is being viewed +struct ContactView <C: DisplayContact>: View { public var contact: C - public var fromMail: M? - public var derivedFromKey: Bool = true + @StateObject var properties = ContactProperties() + /// Creates the view body var body: some View { - TabView{ - ForEach(Tabs, id: \.id ){ tab in - tab.content - .tabItem { - tab.image - Text(tab.description) + ZStack { + VStack { + HStack { + avatar + + VStack (alignment: .leading) { + contactName.padding(.bottom) + knownSince + }.padding(.leading) + Spacer() + }.padding(.leading, 15) + ScrollView { + + // A list of all email addresses associated to the contact + newHeader(header: NSLocalizedString("Contact.Email.Header", + comment: "Header for the section")) + listContactAddresses + + // Up to three emails received from this contact + newHeader(header: NSLocalizedString("Contact.Received.Header", + comment: "Header for the section")) + ContactMailListView(folderpath: MailHandler.INBOX, + folderName: NSLocalizedString("Inbox", comment: "Inbox"), + emailAddresses: contact.emails) + + // Up to three emails sent to this contact + newHeader(header: NSLocalizedString("Contact.Sent.Header", + comment: "Header for the section")) + ContactMailListView(folderpath: MailHandler.SENT, + folderName: NSLocalizedString("Sent", comment: "Sent"), + emailAddresses: contact.emails).padding(.bottom, 25) + + // TODO: Add a section here with all keys of this contact } + .padding(.horizontal,5) + + }.padding(.top, 20) + .blur(radius: properties.showKeysPopup ? 2 : 0) + + // Toggles the popup screen of all keys + if properties.showKeysPopup { + CryptoKeysPopup } + + }.background(Color(.systemGroupedBackground)) + .navigationBarItems(trailing: editButton) + .sheet(isPresented: $properties.composeMail) { + ComposeView(preData: PreMailData(body: "", + subject: "", + to: [properties.emailAddress], + cc: [], + bcc: [])) } - .navigationTitle("ContactView.Title") - } - - var Tabs:[Tab] { - get { - return [ - Tab( - tab: 0, image: Image(systemName: "touchid"), - description: "ContactView.Tab.Contact.Description", - content:AnyView(ContactTabView(contact: contact, fromMail: fromMail, derivedFromKey: derivedFromKey)) - ) - ] + } + + + // TODO: Add an action for the Edit button + private var editButton: some View { + Button {} label: { + Text(NSLocalizedString("edit", comment: "edit")).font(.body) } } + + /// Styling the contact's avatar. + private var avatar: some View { + contact.avatar + .resizable() + .frame(width: 110, height: 110, alignment: .center) + .clipShape(Circle()) + .overlay(Circle().stroke(Color.white, lineWidth: 4)) + .shadow(radius: 10) + .padding(.bottom) + } + + /// Styling the contact's display name. + private var contactName: some View { + // TODO: Show proper name. + // Currently for debugging purposes we show the email before "@" as name + Text(contact.name.components(separatedBy: "@")[0]) + .font(.title) + .fixedSize(horizontal: false, vertical: true) + } + + /// Shows how long the contact is known. + /// If it is unknown, display an 'Add to contact book' button. + var knownSince: some View { + VStack (alignment: .leading){ + + if let discovery = contact.primaryKey?.discovery { + row(label: "ContactView.KnownSince", data: discovery.dateToString) + // TODO Add discovery mail? + } else if let discovery = contact.discovery { + row(label: "ContactView.KnownSince", data: discovery.dateToString) + } else { + row(label: "ContactView.KnownSince.Unknown", data:nil) + // TODO: 'Add to contact book' button here + } + } + } + + /// Creates a frame which contains all email addresses of the contact + var listContactAddresses: some View { + ZStack{ + newRoundedRectangle() + VStack { + ForEach(contact.emails, id: \.self){ eachAddress in + + // This row shows the email address and the label + HStack { + + // When an address is clicked, the ComposeView is called + Button { + properties.emailAddress = eachAddress + + properties.composeMail = true + } label: { + Text("\(eachAddress)") + .fontWeight(.light) + .font(.title2) + .foregroundColor(.blue) + .truncationMode(.middle) + .frame(maxWidth: .infinity, + maxHeight: .infinity, + alignment: .leading) + emailAddressLabel + } + } + + // This row shows the security rating and a button do display the keys + HStack{ + rating + Button { + withAnimation{ + properties.emailAddress = eachAddress + properties.showKeysPopup.toggle() + } + + } label: { + ZStack { + Capsule() + .frame(height: 25, alignment: .center) + .shadow(color:.gray, radius:2) + .foregroundColor(contact.addressRating(contact).color) + + HStack{ + Text(Image(systemName: "key.fill")) + .rotationEffect(Angle(degrees: 30)) + + Text(NSLocalizedString("Contact.Key.Description", comment: "Contact.Key.Description")) + .fontWeight(.medium) + + }.foregroundColor(.white) + .font(.body) + } + } + }.padding(.vertical,3) + + if eachAddress != contact.emails.last{ + Divider().padding(.top,1) + } + + }.padding(.horizontal,10) + + }.padding(5) + + }.padding(.horizontal,5) + } + + /// Creates a frame for the address label. + /// TODO: Add an addressLabel property to the DisplayContact. + var emailAddressLabel: some View { + Text(NSLocalizedString("Email.Label", comment: "Email Label")) + .font(.caption) + .fontWeight(.light) + .foregroundColor(Color(.systemGray)) + .frame(maxWidth: 50 , + maxHeight: 20, + alignment: .bottomLeading) + } + + /// Shows a list of all keys associated to the email address in a popup screen and blurs the background. + var CryptoKeysPopup : some View { + GeometryReader{ geometry in + HStack{ + if keyID == nil { + Text(NSLocalizedString("Contact.Key.NotAvailable", comment: "Key not available message")) + + } else { + // TODO: keyID should be an array of keys + VStack (alignment: .leading){ + Text(NSLocalizedString("Contact.Key.Available", comment: "Key available message")).padding(.bottom, 3) + Text(" \u{2022} \(keyID!)") + } + } + } + .padding() + .background(Color(.tertiarySystemBackground)) + .cornerRadius(15) + .frame(maxWidth: geometry.size.width, + maxHeight: geometry.size.height, + alignment: .center) + + } + .padding(.horizontal,15) + .background( + Color.black.opacity(0.3) + .edgesIgnoringSafeArea(.all) + .onTapGesture { + properties.showKeysPopup.toggle() + properties.emailAddress = "" + } + ) + + } + + // TODO: Change keyID to an array of keys + private var keyID: String? { + return contact.primaryKey?.keyID + } + + /// Creates the security rating label. + private var rating: some View { + HStack{ + Text(Image(systemName: contact.addressRating(contact).shield)) + .font(.title3) + + Text(contact.addressRating(contact).name) + .fontWeight(.medium) + .font(.body) + + } + .foregroundColor(contact.addressRating(contact).color) + .frame(maxWidth:.infinity, + maxHeight: .infinity, + alignment: .leading) + } + + /// Creates the text for the 'Known since' property. + private func row(label: LocalizedStringKey, data: String?) -> some View { + HStack { + Text(label) + + if let data = data{ + Text(data) + } + + } + .font(.custom("SF Pro", size: 12, relativeTo: .caption)) + .foregroundColor(.gray) + } +} + +/// Creates a header for each section. +struct newHeader: View { + var header: String + var body: some View { + HStack { + Text(header) + .font(.footnote) + .foregroundColor(.secondary) + .padding(.horizontal) + .padding(.top, 20) + .textCase(.uppercase) + Spacer() + } + } +} + +/// Creates a rounded rectangle in which the emails are displayed +struct newRoundedRectangle: View { + var body: some View { + RoundedRectangle(cornerRadius: 20) + .shadow(color:.gray, radius:2) + .background(Color(.systemGroupedBackground)) + .foregroundColor(Color(.tertiarySystemBackground)) + } } struct ContactView_Previews: PreviewProvider { static var previews: some View { - ContactView<ProxyContact, ProxyMail>(contact: ProxyData.Alice) - ContactView<ProxyContact, ProxyMail>(contact: ProxyData.Bob) - ContactView<ProxyContact, ProxyMail>(contact: ProxyData.Charlie) + ContactView<ProxyContact>(contact: ProxyData.Alice) + ContactView<ProxyContact>(contact: ProxyData.Alice) + .colorScheme(.dark) + ContactView<ProxyContact>(contact: ProxyData.Bob) + ContactView<ProxyContact>(contact: ProxyData.Bob) + .colorScheme(.dark) + ContactView<ProxyContact>(contact: ProxyData.Charlie) } } diff --git a/enzevalos_iphone/SwiftUI/DisplayProtocols.swift b/enzevalos_iphone/SwiftUI/DisplayProtocols.swift index 59ddc9046b574349d7eea04fd18bcb1f365904cc..939d5e28c00089167f9d20e9ab7a4edfb7948909 100644 --- a/enzevalos_iphone/SwiftUI/DisplayProtocols.swift +++ b/enzevalos_iphone/SwiftUI/DisplayProtocols.swift @@ -87,6 +87,16 @@ enum ContactSecurityRating { case .Forgable: return Color(ThemeManager.unencryptedMessageColor()) } } + + var shield: String { + switch self { + case .Trustworthy: + return "checkmark.shield.fill" + case .Forgable: + return "exclamationmark.shield.fill" + } + } + } @@ -119,6 +129,7 @@ protocol DisplayContact { var name: String { get } var email: String { get } var avatar: Image { get } + var emails: [String] { get } var isInContactBook: Bool { get } var discovery: Date? { get } var last: Date? { get } @@ -136,7 +147,6 @@ protocol DisplayContact { extension DisplayContact { - func findAddress(temp: Bool) -> AddressRecord { if let addr = PersistentDataProvider.dataProvider.fetchedAddressResultController.fetchedObjects?.first { return addr @@ -144,13 +154,13 @@ extension DisplayContact { fatalError("MISSING ADDR") } - func rating <T:DisplayMail> (mail: T?) -> ContactSecurityRating { - if let mail = mail, mail.signatureState == .ValidSignature { - return .Trustworthy - } - if self.primaryKey != nil && mail == nil { + func addressRating <C:DisplayContact> (_: C) -> ContactSecurityRating { + + // TODO: Add another check of the keys array + if self.primaryKey != nil /* || !self.keys.isEmpty */ { return .Trustworthy } + // TODO Think about Rating in case of a unsigned mail from a sender with aprimary key... return .Forgable } @@ -184,7 +194,6 @@ protocol DisplayMail { var signatureKey: K? { get } var persistentMail: MailRecord? { get } - func markAsRead(isRead: Bool) } diff --git a/enzevalos_iphone/SwiftUI/FolderView/FolderListView.swift b/enzevalos_iphone/SwiftUI/FolderView/FolderListView.swift index aabf01383b0a8350da744ef84cbd2723e137636b..67331fe3d43f94eb10d0539ef819c4a026134078 100644 --- a/enzevalos_iphone/SwiftUI/FolderView/FolderListView.swift +++ b/enzevalos_iphone/SwiftUI/FolderView/FolderListView.swift @@ -4,7 +4,19 @@ // // Created by Oliver Wiese on 30.10.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import SwiftUI @@ -21,7 +33,7 @@ struct FolderListView: View { List(folders, id: \.self) { f in let name = formatName(f.name) - NavigationLink(destination: InboxView(folderPath: f.path ?? name, name: name) + NavigationLink(destination: InboxView(folderPath: f.path ?? name, folderName: name) .environment(\.managedObjectContext, PersistentDataProvider .dataProvider @@ -51,4 +63,3 @@ struct FolderOverView_Previews: PreviewProvider { FolderListView() } } - diff --git a/enzevalos_iphone/SwiftUI/FolderView/FolderRowView.swift b/enzevalos_iphone/SwiftUI/FolderView/FolderRowView.swift index 557b31f70a9e0dccdd1b693ddc780d36f133cbc4..4fec0752b98267205d105396610fb8ed9d024053 100644 --- a/enzevalos_iphone/SwiftUI/FolderView/FolderRowView.swift +++ b/enzevalos_iphone/SwiftUI/FolderView/FolderRowView.swift @@ -9,8 +9,7 @@ import SwiftUI struct FolderRowView: View { - - //TODO: increase padding for each delimiter? -> Subfolder level? + // TODO: increase padding for each delimiter? -> Subfolder level? public var folder: DisplayFolder var body: some View { HStack { diff --git a/enzevalos_iphone/SwiftUI/Inbox/InboxRefreshModel.swift b/enzevalos_iphone/SwiftUI/Inbox/InboxRefreshModel.swift new file mode 100644 index 0000000000000000000000000000000000000000..f092db05a3a4c4b1fd7791748f7c528dff346b08 --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Inbox/InboxRefreshModel.swift @@ -0,0 +1,76 @@ +// +// InboxRefreshModel.swift +// enzevalos_iphone +// +// Created by Chris Offner on 29.03.21. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. +// + +import Foundation + +/// Model for Pull to Refresh and updating inbox. +class InboxRefreshModel: ObservableObject { + @Published var updating = false // updating inbox + @Published var refreshStarted = false // pull to refresh sequence started + var folderPath: String + var pullOffsetBaseline: CGFloat? + var pullOffset: CGFloat = 0 + + init(folderPath: String) { + self.folderPath = folderPath + } + + /// Text representation of inbox update state. + var lastUpdate: String { + var text = NSLocalizedString("Updating", comment: "updating...") + + if !updating { + let last = Date() + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale.current + dateFormatter.timeStyle = .medium + let dateString = dateFormatter.string(from: last) + text = NSLocalizedString("LastUpdate", comment: "") + " " + dateString + } + + return text + } + + /// Retrieves new emails and updates the respective email folder. + func updateMails() { + guard !updating else { + return + } + + LetterboxModel + .instance + .mailHandler + .updateFolder(folderpath: folderPath) { error in + if error == nil { + self.updating = false + } + // TODO: Add error message + } + updating = true + } + + /// Refreshes inbox and resets pull to refresh states. + func refresh() { + DispatchQueue.main.async { + self.updateMails() + self.refreshStarted = false + } + } +} diff --git a/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift b/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift index 421e01e0462e52339a34d84d2e89202bd64e3f0c..a062bd5a7b249f0b4c7e19b02e5b194e23f9ccfe 100644 --- a/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift +++ b/enzevalos_iphone/SwiftUI/Inbox/InboxView.swift @@ -1,32 +1,50 @@ // -// InboView.swift +// InboxView.swift // enzevalos_iphone // // Created by Oliver Wiese on 16.10.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import SwiftUI -import CoreData -// TODO: Refactor to Model! -// Updating text -> Last update, updating, no connection... struct InboxView: View { var folderPath: String - var name: String + var folderName: String @State private var updating = false @State private var composeMail = false @State private var goToFolders = false + @ObservedObject var refreshModel: InboxRefreshModel + + init(folderPath: String, folderName: String) { + self.folderPath = folderPath + self.folderName = folderName + self.refreshModel = InboxRefreshModel(folderPath: folderPath) + } var body: some View { mailListView - .onAppear(perform: updateMails) + .onAppear(perform: refreshModel.updateMails) .sheet(isPresented: $composeMail) { ComposeView() } .navigationBarItems(trailing: keyManagementButton) .toolbar { ToolbarItem(placement: .status) { - lastUpdate + Button(action: refreshModel.updateMails) { + Text(refreshModel.lastUpdate) + } } ToolbarItemGroup(placement: .bottomBar) { @@ -37,7 +55,7 @@ struct InboxView: View { } private var mailListView: some View { - MailListView(folderPath: folderPath, folderName: name) + MailListView(folderPath: folderPath, folderName: folderName, refreshModel: refreshModel) .environment(\.managedObjectContext, PersistentDataProvider .dataProvider @@ -61,44 +79,6 @@ struct InboxView: View { } } - // TODO: Refactor lastUpdate to model - private var lastUpdate: some View { - var text = NSLocalizedString("Updating", comment: "updating...") - - if !updating { - let last = Date() - let dateFormatter = DateFormatter() - dateFormatter.locale = Locale.current - dateFormatter.timeStyle = .medium - let dateString = dateFormatter.string(from: last) - text = NSLocalizedString("LastUpdate", comment: "") + " " + dateString - } - - return Button(action: updateMails) { - Text(text).font(.callout) - } - } - - - // TODO: Refactor updateMails to model - private func updateMails() { - guard !updating else { - return - } - - LetterboxModel - .instance - .mailHandler - .updateFolder(folderpath: folderPath) { error in - if error == nil { - self.updating = false - } - // TODO: Add error message - } - updating = true - } - - private var folderButton: some View { Button { goToFolders = true @@ -118,7 +98,7 @@ struct InboxView: View { // Preview struct InboxView_Previews: PreviewProvider { static var previews: some View { - return InboxView(folderPath: "INBOX", name: "INBOX") + return InboxView(folderPath: "INBOX", folderName: "INBOX") .environment(\.managedObjectContext, PersistentDataProvider .proxyPersistentDataProvider diff --git a/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift b/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift index 18c7d5cd8e1e3e64added8dad39da7276d49f0c3..3899d844360ada38aa853832d07f60e6293d8841 100644 --- a/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift +++ b/enzevalos_iphone/SwiftUI/Inbox/MailListView.swift @@ -4,37 +4,59 @@ // // Created by Oliver Wiese on 16.10.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import SwiftUI import CoreData -// TODO: Refactor to Model! -// Updating text -> Last update, updating, no connection.... +// TODO: Fix refresh on view creation! +// Currently "pull to refresh" appears to get triggered every time MailListView (re-)appears. + +/// A view that lists emails in a particular folder together with a search function. struct MailListView: View { @Environment(\.managedObjectContext) var managedObjectContext var fetchRequest: FetchRequest<MailRecord> var mails: FetchedResults<MailRecord>{fetchRequest.wrappedValue} var folderPath: String var folderName: String - - @State private var showUser = false + @ObservedObject var model: InboxRefreshModel @State private var searchText = "" @State private var searchType = SearchType.All - init(folderPath: String, folderName: String) { + init(folderPath: String, folderName: String, refreshModel: InboxRefreshModel) { fetchRequest = MailRecord.mailsInFolderFetchRequest(folderpath: folderPath) self.folderPath = folderPath self.folderName = folderName + self.model = refreshModel } var body: some View { - VStack(alignment: .leading) { - SearchView(searchText: $searchText, searchType: $searchType) - .padding() + VStack(alignment: .leading, spacing: 0) { + SearchView(searchText: $searchText, searchType: $searchType).padding() - mailList + ScrollView { + refreshTrigger.frame(width: 0, height: 0) + + ZStack(alignment: topCenter) { + mailList.frame(height: 600) // TODO: Make mailList use max height dynamically + pullToRefreshIndicator + } + .offset(y: model.updating ? 35 : -10) + .animation(.default) + } } .navigationBarTitle(folderName, displayMode: .inline) } @@ -51,6 +73,52 @@ struct MailListView: View { .listStyle(PlainListStyle()) } + @ViewBuilder + private var pullToRefreshIndicator: some View { + if model.updating { + ProgressView().offset(y: -32) + } else { + Image(systemName: "arrow.down.circle") + .foregroundColor(.secondary) + .font(.system(size: 28, weight: .regular)) + .rotationEffect(Angle(degrees: model.refreshStarted ? 180 : 0)) + .offset(y: -32) + .animation(.easeIn) + } + } + + private var topCenter: Alignment { + Alignment(horizontal: .center, vertical: .top) + } + + /// Measures pulldown offset and triggers inbox refresh. + private var refreshTrigger: GeometryReader<AnyView> { + GeometryReader { geo -> AnyView in + DispatchQueue.main.async { + // Set initial baseline for pulldown based on dynamic layout + guard let baseline = model.pullOffsetBaseline else { + model.pullOffsetBaseline = geo.frame(in: .global).minY + return + } + + // Update offset dynamically as user pulls down + model.pullOffset = geo.frame(in: .global).minY + + // Indicate refresh start if pulldown threshold is reached + if model.pullOffset - baseline > 80 && !model.refreshStarted { + model.refreshStarted = true + } + + // Trigger refresh once pulldown is fully released + if model.refreshStarted && model.pullOffset == baseline { + withAnimation(.linear) { + model.refresh() + } + } + } + + return AnyView(EmptyView()) + } private func deleteMails(at offsets: IndexSet) { var ids = [UInt64]() for index in offsets { @@ -60,36 +128,31 @@ struct MailListView: View { MailRecord.delete(with: ids, folderPath: folderPath) } + /// Filters emails based on search criteria. func filterKeyRecord(keyRecord: MailRecord) -> Bool { - if self.searchText.isEmpty - || self.searchText == NSLocalizedString("Searchbar.Title", comment: "Search") { + if searchText.isEmpty + || searchText == NSLocalizedString("Searchbar.Title", comment: "Search") { return true } - let query = self.searchText.lowercased() + let query = searchText.lowercased() if (searchType == .All || searchType == .Sender) - && (containsSearchTerms(content: keyRecord.sender.displayname, searchText: query) - || containsSearchTerms(content: keyRecord.sender.email, searchText: query)) { + && (containsSearchTerms(content: keyRecord.sender.displayname, searchTerm: query) + || containsSearchTerms(content: keyRecord.sender.email, searchTerm: query)) { return true } else if (searchType == .All || searchType == .Sender) - && keyRecord.addresses.filter({ - containsSearchTerms(content: $0.email, - searchText: query) }).count > 0 { + && (keyRecord.addresses.filter { + containsSearchTerms(content: $0.email, + searchTerm: query) } + .count > 0) { return true } else if (searchType == .All || searchType == .Subject) - && containsSearchTerms(content: keyRecord.subject, searchText: query) { + && containsSearchTerms(content: keyRecord.subject, searchTerm: query) { return true } else if (searchType == .All || searchType == .Body) - && containsSearchTerms(content: keyRecord.body, searchText: query) { + && containsSearchTerms(content: keyRecord.body, searchTerm: query) { return true } return false } } - -struct MailListView_Previews: PreviewProvider { - static var previews: some View { - MailListView(folderPath: "INBOX", folderName: "INBOX") - .environment(\.managedObjectContext, PersistentDataProvider.proxyPersistentDataProvider.persistentContainer.viewContext) - } -} diff --git a/enzevalos_iphone/SwiftUI/Inbox/MailRowView.swift b/enzevalos_iphone/SwiftUI/Inbox/MailRowView.swift new file mode 100644 index 0000000000000000000000000000000000000000..4d4c6936710b82da2880187db62b422d45b174af --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Inbox/MailRowView.swift @@ -0,0 +1,92 @@ +// +// MailRowView.swift +// enzevalos_iphone +// +// Created by Oliver Wiese on 27.10.20. +// Modified by Chris Offner & Claire Bräuer in March 2021. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. +// + +import SwiftUI + +struct MailRowView <M: DisplayMail>: View { + let mail: M + @State var isLinkActive = false + // ContactMailListView toggles this to disable the onTapGesture modifier for the avatar + var activateOnTap: Bool = true + + var body: some View { + HStack { + avatar + + VStack(alignment: .leading) { + HStack { + // Sender name + Text(mail.sender.name) + .fontWeight(mail.isRead ? .regular : .medium) + .lineLimit(1) + + Spacer() + + // Arrival time + Text(mail.date.timeAgoText()) + .font(.caption) + } + + HStack { + // Subject + Text(mail.subject) + .font(.caption) + .lineLimit(2) + + Spacer() + + // Attachment indicator if relevant + if !mail.displayAttachments.isEmpty { + Image(systemName: "paperclip") + .font(.caption) + .foregroundColor(.secondary) + } + } + } + .foregroundColor(mail.isRead ? .secondary : .primary) + } + .padding(4) + .frame(height: 65) + } + + + private var avatar: some View { + mail.sender.avatar + .resizable() + .aspectRatio(contentMode: .fit) + .shadow(radius: 2) + .opacity(mail.isRead ? 0.45 : 1) + .onTapGesture(count: 1, perform: {isLinkActive = true}) + .allowsHitTesting(activateOnTap) + .background( + NavigationLink(destination: ContactView(contact: mail.sender), isActive: $isLinkActive) { + EmptyView() + } + .hidden() + ) + } +} + +struct MailRowView_Previews: PreviewProvider { + static var previews: some View { + MailRowView(mail: ProxyData.PlainMail) + } +} diff --git a/enzevalos_iphone/SwiftUI/Inbox/UpdateMailsModel.swift b/enzevalos_iphone/SwiftUI/Inbox/UpdateMailsModel.swift new file mode 100644 index 0000000000000000000000000000000000000000..7359c830edb359e0608fb061c7c8e30db8b63340 --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Inbox/UpdateMailsModel.swift @@ -0,0 +1,50 @@ +// +// UpdateMailsModel.swift +// enzevalos_iphone +// +// Created by Chris Offner on 29.03.21. +// Copyright © 2021 fu-berlin. All rights reserved. +// + +import Foundation + +class InboxRefreshModel: ObservableObject { + @Published var updating = false + var folderPath: String + + init(folderPath: String) { + self.folderPath = folderPath + } + + var lastUpdate: String { + var text = NSLocalizedString("Updating", comment: "updating...") + + if !updating { + let last = Date() + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale.current + dateFormatter.timeStyle = .medium + let dateString = dateFormatter.string(from: last) + text = NSLocalizedString("LastUpdate", comment: "") + " " + dateString + } + + return text + } + + func updateMails() { + guard !updating else { + return + } + + LetterboxModel + .instance + .mailHandler + .updateFolder(folderpath: folderPath) { error in + if error == nil { + self.updating = false + } + // TODO: Add error message + } + updating = true + } +} diff --git a/enzevalos_iphone/SwiftUI/LetterboxApp.swift b/enzevalos_iphone/SwiftUI/LetterboxApp.swift index 25870715d77b86cc62c85b6bfb7b574d6a413bfa..a3fb72feed3c5bf347551287b66235d91b904956 100644 --- a/enzevalos_iphone/SwiftUI/LetterboxApp.swift +++ b/enzevalos_iphone/SwiftUI/LetterboxApp.swift @@ -41,4 +41,3 @@ struct LetterboxApp: App { } } } - diff --git a/enzevalos_iphone/SwiftUI/Read/ReadModel.swift b/enzevalos_iphone/SwiftUI/Read/ReadModel.swift index ea515e9ee88636cfe24a17a94551cc298776d341..9ed72bffe5acd58edddbbd9831c413ca1e3960fc 100644 --- a/enzevalos_iphone/SwiftUI/Read/ReadModel.swift +++ b/enzevalos_iphone/SwiftUI/Read/ReadModel.swift @@ -87,7 +87,7 @@ class ReadModel <M: DisplayMail>: ObservableObject { case .ReplyAll: return PreMailData(body: mail.preparePreviousMailBody(), subject: ResponseType.Reply.addPrefix(subject: mail.subject), to: [mail.sender.email], cc: mail.tos.map({$0.email}) + mail.ccs.map({$0.email}), bcc: mail.bccs.map({$0.email})) case .Forward: - return PreMailData(body: mail.preparePreviousMailBody(), subject: ResponseType.Reply.addPrefix(subject: mail.subject), to: [], cc: [], bcc: []) + return PreMailData(body: mail.preparePreviousMailBody(), subject: ResponseType.Forward.addPrefix(subject: mail.subject), to: [], cc: [], bcc: []) case .Archive: dismissView = true return nil diff --git a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SecurityBriefingView.swift b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SecurityBriefingView.swift index 003dd869ed924465dfbc4a1efc7e573c9df9cca4..7525dd711a40cca96da08899c7751307d2c8aa6c 100644 --- a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SecurityBriefingView.swift +++ b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SecurityBriefingView.swift @@ -4,7 +4,19 @@ // // Created by Oliver Wiese on 09.04.20. // Modified by Chris Offner & Claire Bräuer in March 2021. -// Copyright © 2020 fu-berlin. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://www.gnu.org/licenses/. // import SwiftUI diff --git a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewChildren/SmallContactListView.swift b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewChildren/SmallContactListView.swift index 9c8b20ec7d5054cb25c867c0d59866f6c6c1bb6f..9e42175a945b904c3b1bee6a2540fb3492aa3de2 100644 --- a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewChildren/SmallContactListView.swift +++ b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewChildren/SmallContactListView.swift @@ -32,7 +32,7 @@ struct SmallContactListView <C: DisplayContact>: View { if showList { ForEach(contacts, id: \.email) {contact in - NavigationLink(destination: ContactView<C, MailRecord>(contact: contact, fromMail: nil)) { + NavigationLink(destination: ContactView<C>(contact: contact)) { HStack { CircleImage(image: contact.avatar, radius: 40) VStack (alignment: .leading, spacing: 2){ diff --git a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift index 2549d1d006f7af714e4e6096d0bf78dfec1b6b8b..a56b3f8a63a838f4bd65c4f7d7160011afc18e9d 100644 --- a/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift +++ b/enzevalos_iphone/SwiftUI/Read/Tabbed Views/SenderViewMain.swift @@ -72,7 +72,7 @@ struct SenderViewMain <M: DisplayMail>: View { } private var icon: some View { - NavigationLink(destination: ContactView(contact: model.mail.sender, fromMail: model.mail)) { + NavigationLink(destination: ContactView(contact: model.mail.sender)) { model.mail.sender.avatar .resizable() .frame(width: 130, height: 110) @@ -90,7 +90,7 @@ struct SenderViewMain <M: DisplayMail>: View { Text(NSLocalizedString("Sender", comment: "Sender")) .font(.headline) .padding(.bottom, 10) - NavigationLink(destination: ContactView(contact: model.mail.sender, fromMail: model.mail)) { + NavigationLink(destination: ContactView(contact: model.mail.sender)) { HStack { VStack (alignment: .leading) { Text(model.mail.sender.name) diff --git a/enzevalos_iphone/SwiftUI/SupportingViews/CircleImage.swift b/enzevalos_iphone/SwiftUI/SupportingViews/CircleImage.swift new file mode 100644 index 0000000000000000000000000000000000000000..eda6ba3e1771f919e7e669a27153ec60061677f0 --- /dev/null +++ b/enzevalos_iphone/SwiftUI/SupportingViews/CircleImage.swift @@ -0,0 +1,27 @@ +// +// CiricleImage.swift +// enzevalos_iphone +// +// Created by Oliver Wiese on 02.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import SwiftUI + +struct CircleImage: View { + var image: Image + var radius: CGFloat = 60 + + var body: some View { + image + .resizable() + .frame(width: radius, height: radius) + .shadow(radius: radius/60*5) + } +} + +struct CircleImage_Previews: PreviewProvider { + static var previews: some View { + CircleImage(image: ProxyContact.makeImg("Alice", color: .red)) + } +} diff --git a/enzevalos_iphone/SwiftUI/SupportingViews/MailRowView.swift b/enzevalos_iphone/SwiftUI/SupportingViews/MailRowView.swift index fa89a176c49db716dfca1b39e1834ee98474eb3f..1bca8d3ff29d09ebf46daaef845c9e157fbe984b 100644 --- a/enzevalos_iphone/SwiftUI/SupportingViews/MailRowView.swift +++ b/enzevalos_iphone/SwiftUI/SupportingViews/MailRowView.swift @@ -1,5 +1,5 @@ // -// MailRow.swift +// MailRowView.swift // enzevalos_iphone // // Created by Oliver Wiese on 27.10.20. diff --git a/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift b/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift index 4b10db6ac7920358bf8873eac4cf32c9daac16ab..2ba4de7a6f72e1128e7d8df1e333f32e69b909d5 100644 --- a/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift +++ b/enzevalos_iphone/SwiftUI/SupportingViews/MailView.swift @@ -11,9 +11,8 @@ import SwiftUI struct MailView <M: DisplayMail>: View { - //TODO private let coord = AppDelegate.getAppDelegate().inboxCoordinator - - var mail: M + // TODO: private let coord = AppDelegate.getAppDelegate().inboxCoordinator + private var mail: M init(mail: M){ self.mail = mail diff --git a/enzevalos_iphone/de.lproj/Localizable.strings b/enzevalos_iphone/de.lproj/Localizable.strings index d2d4ee71864dd49b301d5678d875a4388b3c2b86..ebcad85c88877968e804b18beaee20b49c11ca1e 100644 --- a/enzevalos_iphone/de.lproj/Localizable.strings +++ b/enzevalos_iphone/de.lproj/Localizable.strings @@ -5,6 +5,14 @@ Created by jakobsbode on 06.10.16. Copyright © 2016 fu-berlin. All rights reserved. */ +"Contact.Key.Description" = "Schlüssel"; +"Contact.Email.Header" = "Adressen"; +"Contact.Received.Header" = "Von diesem Kontakt empfangen"; +"Contact.Sent.Header" = "An diesen Kontakt gesendet"; +"Contact.Key.NotAvailable" = "Diese Email-Adresse hat keine Schlüssel."; +"Contact.Key.Available" = "Diese Email-Adresse benutzt folgende Schlüssel:"; +"Contact.Button.ShowMore" = "Mehr..."; +"Email.Label" = "Privat"; "Permission.contactDenied.Title" = "Oops! Zugriff erlauben!"; "Permission.contactDenied.Description" = "Bitte erlaube Zugriff auf Kontakte in Einstellungen -> Datenschutz -> Kontakte"; "Permission.Notification.Title" = "Mitteilungen erlauben"; @@ -266,7 +274,6 @@ "you" = "Deine ID"; "ContactView.Title" = "Kontakt"; "ContactView.Tab.Contact.Description" = "Kontakt"; -"ContactView.Tab.EMail.Description" = "Adressen"; "ContactView.Tab.EMail.Title" = "Verknüpfte Adressen"; "ContactView.Tab.EMail.Data.No" = "Keine verknüpften Adressen. \n Verknüpfungen können über das Adressbuch erfolgen."; "ContactView.ID.Explaination.youCrypto" = "Hier ist deine vertrauenswürdige Identität."; // thisIsYou @@ -280,9 +287,9 @@ "ContactView.Nickname.Title" = "Nickname"; "ContactView.PreferedIDCell.IsPrimID" = "Diese ID wird verwendet um vertrauliche Mails an die Person zu senden."; "ContactView.PreferedIDCell.MakePrimID" = "Diese ID zum Versand von vertraulichen Mails verwenden."; -"ContactView.KnownSince" = "Bekannt seit"; +"ContactView.KnownSince" = "Bekannt seit:"; "ContactView.KnownSince.Unknown" = "Das Datum des ersten Auftauchens ist unbekannt."; -"ContactView.LastMail" = "Letzte erhaltene Mail von "; +"ContactView.LastMail" = "Letzte erhaltene Mail: "; "ContactView.LastMail.Name" = "Letzte erhaltene Mail von"; "ContactView.LastMail.Today" = "Letzte Mail heute erhalten."; "ContactView.LastMail.Ago" = "Letzte Mail vor %@ erhalten."; @@ -292,7 +299,7 @@ "ContactView.Key.Signature.Name" = "Signatur Schlüssel"; "ContactView.Key.Primary.Name" = "Bevorzugter Schlüssel"; "ContactView.Rating.Name" = "Einstufung"; -"ContactView.Rating.Trustworthy" = "Vertrauenswürdig"; +"ContactView.Rating.Trustworthy" = "Sicher"; "ContactView.Rating.Forgable" = "Fälschbar"; "didYouSendThis" = "Hallo, haben Sie mir diese E-Mail geschickt?\nIch frage nur, weil die Mail Ihnen nicht eindeutig zugeordnet werden kann und Ihre vorherigen Mails eindeutig Ihnen zuzuordnen waren. Für Erfahrende: Die Mail hat keine digitale Signatur.\n\n"; "reactButton" = "Um Bestätigung bitten"; @@ -444,6 +451,7 @@ "Security.Dialog.Button.Title.Ask.ForPK" = "Um senden der ID bitten"; "Security.Dialog.Button.Title.Send.PK" = "Eigenen öffentlichen Schlüssel versenden"; "ReadView.SecurityBriefing.Title" = "Sicherheitsbriefing"; +"ReadView.SecurityBriefing.EncryptionType.Text" = "Diese Email wurde verschlüsselt mit "; "ReadView.SecurityBriefing.Conf.Title" = "Wer kann die Mail lesen?"; "ReadView.SecurityBriefing.Conf.Description" = "Deine Mails gehen durch verschiedene Hände: Deinem Mail-Provider, dem Mail-Provider der anderen Seite und vielleicht weitere Mail-Provider als Vermittler dazwischen. Außerdem transporieren dein Internet-Provider und andere auch andere Internet-Provider deine Mail."; "ReadView.SecurityBriefing.Conf.State.Encrypted" = "Nur du, andere Empfänger und Absender können den Inhalt der Mail lesen."; diff --git a/enzevalos_iphone/en.lproj/Localizable.strings b/enzevalos_iphone/en.lproj/Localizable.strings index c27a527def77c96f864fa41f3d550ad25ec34b75..5a4c6debdd34161867486764f5aadc5dce20d2af 100644 --- a/enzevalos_iphone/en.lproj/Localizable.strings +++ b/enzevalos_iphone/en.lproj/Localizable.strings @@ -5,6 +5,14 @@ Created by jakobsbode on 06.10.16. Copyright © 2016 fu-berlin. All rights reserved. */ +"Contact.Key.Description" = "Show Keys"; +"Contact.Email.Header" = "Addresses"; +"Contact.Received.Header" = "Received from this contact"; +"Contact.Sent.Header" = "Sent to this contact"; +"Contact.Key.NotAvailable" = "This email address doesn't have a key."; +"Contact.Key.Available" = "This email address is using the following keys:"; +"Contact.Button.ShowMore" = "Show more..."; +"Email.Label" = "Private"; "Permission.contactDenied.Title" = "Oops! Please Allow!"; "Permission.contactDenied.Description" = "Please Turn On Access Contacts In Settings -> Privacy -> Contacts ."; "Permission.Notification.Title" = "Allow Notifications"; @@ -236,7 +244,6 @@ "you.Secure" = "Your genuine ID"; "ContactView.Title" = "Contact"; "ContactView.Tab.Contact.Description" = "Contact"; -"ContactView.Tab.EMail.Description" = "Addresses"; "ContactView.Tab.EMail.Title" = "Related Addresses"; "ContactView.Tab.EMail.Data.No" = "No related addresses. \n You can add through your address book."; "ContactView.ID.Explaination.youCrypto" = "Here is your genuine identity."; @@ -250,19 +257,19 @@ "ContactView.Nickname.Title" = "Name"; "ContactView.PreferedIDCell.IsPrimID" = "ID is used to send genuine mails."; "ContactView.PreferedIDCell.MakePrimID" = "Use this ID to send confidential mails."; -"ContactView.KnownSince" = "Known since"; +"ContactView.KnownSince" = "Known since:"; "ContactView.KnownSince.Unknown" = "Unknown first appearance date"; "ContactView.LastMail.Today" = "Last mail received today."; "ContactView.LastMail.Ago" = "Last received mail %@ ago."; -"ContactView.LastMail.Name" = "Last received mail from"; +"ContactView.LastMail.Name" = "Last received mail:"; "ContactView.LastMail.No" = "No mails received."; "ContactView.OtherIDs.Insecure.Title" = "Insecure ID"; "ContactView.EMail.Name" = "E-Mail"; "ContactView.Key.Signature.Name" = "Signature Key"; "ContactView.Key.Primary.Name" = "Primary Key"; "ContactView.Rating.Name" = "Rating"; -"ContactView.Rating.Trustworthy" = "Trustworthy"; -"ContactView.Rating.Forgable" = "Forgable"; +"ContactView.Rating.Trustworthy" = "Secure Email"; +"ContactView.Rating.Forgable" = "Forgable Email"; "didYouSendThis" = "Hey, did you send me this mail?\nI'm just asking because the mail is not confidential and we communicated confidentially before.\n\n"; "reactButton" = "Request Confirmation"; "sendSecureIfPossible" = "Send confidentially if possible"; @@ -423,6 +430,7 @@ "Security.Dialog.Button.Title.Ask.ForPK" = "Ask to send ID"; "Security.Dialog.Button.Title.Send.PK" = "Send own public key"; "ReadView.SecurityBriefing.Title" = "Security Briefing"; +"ReadView.SecurityBriefing.EncryptionType.Text" = "This email was encrypted using "; "ReadView.SecurityBriefing.Conf.Title" = "Who can read the email?"; "ReadView.SecurityBriefing.Conf.Description" = "Deine Mails gehen durch verschiedene Hände: Deinem Mail-Provider, dem Mail-Provider der anderen Seite und vielleicht weitere Mail-Provider als Vermittler dazwischen. Außerdem transporieren dein Internet-Provider und andere auch andere Internet-Provider deine Mail."; "ReadView.SecurityBriefing.Conf.State.Encrypted" = "Only you, the sender and receiver know the content of these mails."; diff --git a/enzevalos_iphone/persistentData/AddressRecord.swift b/enzevalos_iphone/persistentData/AddressRecord.swift index 416e9a54b7eb34e7d446344cdd827bdadabba75f..060bbcf252c4785129925bb128326495ce9cd348 100644 --- a/enzevalos_iphone/persistentData/AddressRecord.swift +++ b/enzevalos_iphone/persistentData/AddressRecord.swift @@ -127,6 +127,23 @@ extension AddressRecord { } extension AddressRecord: DisplayContact { + var emails: [String] { + get{ + var addresses = [String]() + addresses.append(self.email) + if let keys = self.usedPublicKeys as? Set<PublicKeyRecord> { + for key in keys { + if let set = key.usedAddress as? Set<String> { + addresses.append(contentsOf: set) + } + } + } + return addresses + } + } + + + typealias C = AddressRecord var avatar: Image {