diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 44afd28b8..dd596016b 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -40,8 +40,6 @@ 34480B681FD0AA9400BC14EF /* UIFont+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B661FD0AA9400BC14EF /* UIFont+OWS.h */; }; 344F2F671E57A932000D9322 /* UIViewController+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 344F2F661E57A932000D9322 /* UIViewController+OWS.m */; }; 34533F181EA8D2070006114F /* OWSAudioAttachmentPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34533F171EA8D2070006114F /* OWSAudioAttachmentPlayer.m */; }; - 3453D8EA1EC0D4ED003F9E6F /* OWSAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3453D8E91EC0D4ED003F9E6F /* OWSAlerts.swift */; }; - 345671011E89A5F1006EE662 /* ThreadUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 345671001E89A5F1006EE662 /* ThreadUtil.m */; }; 3461284B1FD0B94000532771 /* SAELoadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3461284A1FD0B93F00532771 /* SAELoadViewController.swift */; }; 346129321FD1A26100532771 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 346129051FD1A25B00532771 /* Localizable.strings */; }; 346129341FD1A88700532771 /* OWSSwiftUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129331FD1A88700532771 /* OWSSwiftUtils.swift */; }; @@ -72,6 +70,25 @@ 3461299C1FD1EA9E00532771 /* NotificationsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3461299B1FD1EA9E00532771 /* NotificationsManager.m */; }; 3461299F1FD1EFE200532771 /* CryptoTools.h in Headers */ = {isa = PBXBuildFile; fileRef = 3461299D1FD1EFE200532771 /* CryptoTools.h */; }; 346129A01FD1EFE200532771 /* CryptoTools.m in Sources */ = {isa = PBXBuildFile; fileRef = 3461299E1FD1EFE200532771 /* CryptoTools.m */; }; + 346129A51FD1F09100532771 /* OWSContactsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129A21FD1F09100532771 /* OWSContactsManager.h */; }; + 346129A61FD1F09100532771 /* OWSContactsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129A31FD1F09100532771 /* OWSContactsManager.m */; }; + 346129A91FD1F0E000532771 /* OWSFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129A81FD1F0DF00532771 /* OWSFormat.h */; }; + 346129AB1FD1F0EE00532771 /* OWSFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129AA1FD1F0EE00532771 /* OWSFormat.m */; }; + 346129AD1FD1F34E00532771 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129AC1FD1F34E00532771 /* ImageCache.swift */; }; + 346129AF1FD1F5D900532771 /* SystemContactsFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129AE1FD1F5D900532771 /* SystemContactsFetcher.swift */; }; + 346129B41FD1F7E800532771 /* OWSProfileManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129B11FD1F7E800532771 /* OWSProfileManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 346129B51FD1F7E800532771 /* OWSProfileManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129B21FD1F7E800532771 /* OWSProfileManager.m */; }; + 346129B61FD1F7E800532771 /* ProfileFetcherJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129B31FD1F7E800532771 /* ProfileFetcherJob.swift */; }; + 346129BF1FD2068600532771 /* ThreadUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129BE1FD2068600532771 /* ThreadUtil.m */; }; + 346129C71FD2072E00532771 /* NSString+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129C01FD2072C00532771 /* NSString+OWS.h */; }; + 346129C81FD2072E00532771 /* NSAttributedString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129C11FD2072D00532771 /* NSAttributedString+OWS.m */; }; + 346129C91FD2072E00532771 /* NSString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129C21FD2072D00532771 /* NSString+OWS.m */; }; + 346129CA1FD2072E00532771 /* UIImage+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129C31FD2072D00532771 /* UIImage+OWS.h */; }; + 346129CB1FD2072E00532771 /* Promise+retainUntilComplete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129C41FD2072D00532771 /* Promise+retainUntilComplete.swift */; }; + 346129CC1FD2072E00532771 /* NSAttributedString+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129C51FD2072D00532771 /* NSAttributedString+OWS.h */; }; + 346129CD1FD2072E00532771 /* UIImage+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129C61FD2072D00532771 /* UIImage+OWS.m */; }; + 346129D01FD207F300532771 /* OWSAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129CF1FD207F200532771 /* OWSAlerts.swift */; }; + 346129D21FD2085A00532771 /* CommonStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129D11FD2085A00532771 /* CommonStrings.swift */; }; 346B66311F4E29B200E5122F /* CropScaleImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346B66301F4E29B200E5122F /* CropScaleImageViewController.swift */; }; 3471B1DA1EB7C63600F6AEC8 /* NewNonContactConversationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3471B1D91EB7C63600F6AEC8 /* NewNonContactConversationViewController.m */; }; 3472229F1EB22FFE00E53955 /* AddToGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3472229E1EB22FFE00E53955 /* AddToGroupViewController.m */; }; @@ -121,7 +138,6 @@ 34C6B0AB1FA0E46F00D35993 /* test-mp3.mp3 in Resources */ = {isa = PBXBuildFile; fileRef = 34C6B0A71FA0E46F00D35993 /* test-mp3.mp3 */; }; 34C6B0AC1FA0E46F00D35993 /* test-mp4.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 34C6B0A81FA0E46F00D35993 /* test-mp4.mp4 */; }; 34C6B0AE1FA0E4AA00D35993 /* test-jpg.jpg in Resources */ = {isa = PBXBuildFile; fileRef = 34C6B0AD1FA0E4AA00D35993 /* test-jpg.jpg */; }; - 34CA1C251F706B5400E51C51 /* NSAttributedString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C241F706B5400E51C51 /* NSAttributedString+OWS.m */; }; 34CA1C271F7156F300E51C51 /* MessageDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */; }; 34CA1C291F7164F700E51C51 /* MediaMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C281F7164F700E51C51 /* MediaMessageView.swift */; }; 34CCAF381F0C0599004084F4 /* AppUpdateNag.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CCAF371F0C0599004084F4 /* AppUpdateNag.m */; }; @@ -165,8 +181,6 @@ 34E8BF381EE9E2FD00F5F4CA /* FingerprintViewScanController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34E8BF371EE9E2FD00F5F4CA /* FingerprintViewScanController.m */; }; 34F308A21ECB469700BB7697 /* OWSBezierPathView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34F308A11ECB469700BB7697 /* OWSBezierPathView.m */; }; 34FD93701E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34FD936F1E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.m */; }; - 450449391F45EE7D002D1ADA /* NSString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 450449381F45EE7D002D1ADA /* NSString+OWS.m */; }; - 4504493A1F45EE7D002D1ADA /* NSString+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 450449381F45EE7D002D1ADA /* NSString+OWS.m */; }; 4505C2BF1E648EA300CEBF41 /* ExperienceUpgrade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4505C2BE1E648EA300CEBF41 /* ExperienceUpgrade.swift */; }; 4505C2C01E648EA300CEBF41 /* ExperienceUpgrade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4505C2BE1E648EA300CEBF41 /* ExperienceUpgrade.swift */; }; 4509E79A1DD653700025A59F /* WebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4509E7991DD653700025A59F /* WebRTC.framework */; }; @@ -180,8 +194,6 @@ 451A13B11E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A13B01E13DED2000A50FD /* CallNotificationsAdapter.swift */; }; 451A13B21E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A13B01E13DED2000A50FD /* CallNotificationsAdapter.swift */; }; 451DA3C71F148986008E2423 /* SafetyNumberConfirmationAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585C4671ED8F8D200896AEA /* SafetyNumberConfirmationAlert.swift */; }; - 451DA3C81F14898E008E2423 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E2E91F1E153B3D00457AA0 /* Strings.swift */; }; - 451DA3C91F1489BE008E2423 /* OWSAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3453D8E91EC0D4ED003F9E6F /* OWSAlerts.swift */; }; 451DA3CA1F148A9F008E2423 /* DeviceSleepManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348F2EAD1F0D21BC00D4ECE0 /* DeviceSleepManager.swift */; }; 451DA3CB1F148AAD008E2423 /* CallViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F83B1E8DF1700035BE1A /* CallViewController.swift */; }; 451DE9F81DC18C9500810E42 /* AccountManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45CD81EE1DC030E7004C9430 /* AccountManager.swift */; }; @@ -215,17 +227,12 @@ 45360B921F952AB400FA666C /* OWSFlatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C04D7F1F6195E6004308B3 /* OWSFlatButton.swift */; }; 4539B5861F79348F007141FF /* PushRegistrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4539B5851F79348F007141FF /* PushRegistrationManager.swift */; }; 4539B5871F79348F007141FF /* PushRegistrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4539B5851F79348F007141FF /* PushRegistrationManager.swift */; }; - 4542F0941EB9372700C7EE92 /* SystemContactsFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4542F0931EB9372700C7EE92 /* SystemContactsFetcher.swift */; }; - 4542F0961EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4542F0951EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift */; }; - 4542F0971EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4542F0951EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift */; }; 45464DBC1DFA041F001D3FD6 /* DataChannelMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45464DBB1DFA041F001D3FD6 /* DataChannelMessage.swift */; }; 454EBAB41F2BE14C00ACE0BB /* OWSAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D99C911F2937CC00D284D6 /* OWSAnalytics.swift */; }; 4556FA681F54AA9500AF40DD /* DebugUIProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4556FA671F54AA9500AF40DD /* DebugUIProfile.swift */; }; 4556FA691F54AA9500AF40DD /* DebugUIProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4556FA671F54AA9500AF40DD /* DebugUIProfile.swift */; }; 455A16DD1F1FEA0000F86704 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 455A16DB1F1FEA0000F86704 /* Metal.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 455A16DE1F1FEA0000F86704 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 455A16DC1F1FEA0000F86704 /* MetalKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 455AC69B1F4F79E500134004 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455AC69A1F4F79E500134004 /* ImageCache.swift */; }; - 455AC69C1F4F79E500134004 /* ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455AC69A1F4F79E500134004 /* ImageCache.swift */; }; 455AC69E1F4F8B0300134004 /* ImageCacheTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 455AC69D1F4F8B0300134004 /* ImageCacheTest.swift */; }; 45638BDC1F3DD0D400128435 /* DebugUICalling.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45638BDB1F3DD0D400128435 /* DebugUICalling.swift */; }; 45638BDF1F3DDB2200128435 /* MessageSender+Promise.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45638BDE1F3DDB2200128435 /* MessageSender+Promise.swift */; }; @@ -285,7 +292,6 @@ 45D231781DC7E8F10034FA89 /* SessionResetJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45D231761DC7E8F10034FA89 /* SessionResetJob.swift */; }; 45DF5DF21DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45DF5DF11DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift */; }; 45DF5DF31DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45DF5DF11DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift */; }; - 45E2E9201E153B3D00457AA0 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E2E91F1E153B3D00457AA0 /* Strings.swift */; }; 45E5A6991F61E6DE001E4A8A /* MarqueeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E5A6981F61E6DD001E4A8A /* MarqueeLabel.swift */; }; 45E615161E8C590B0018AD52 /* DisplayableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E615151E8C590B0018AD52 /* DisplayableText.swift */; }; 45E615171E8C59100018AD52 /* DisplayableText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E615151E8C590B0018AD52 /* DisplayableText.swift */; }; @@ -309,7 +315,6 @@ 768A1A2B17FC9CD300E00ED8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 768A1A2A17FC9CD300E00ED8 /* libz.dylib */; }; 76C87F19181EFCE600C4ACAB /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C87F18181EFCE600C4ACAB /* MediaPlayer.framework */; }; 76EB054018170B33006006FC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB03C318170B33006006FC /* AppDelegate.m */; }; - 76EB057A18170B33006006FC /* OWSContactsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB040918170B33006006FC /* OWSContactsManager.m */; }; 76EB063A18170B33006006FC /* FunctionalUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04EB18170B33006006FC /* FunctionalUtil.m */; }; 76EB063C18170B33006006FC /* NumberUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04ED18170B33006006FC /* NumberUtil.m */; }; 76EB063E18170B33006006FC /* Operation.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04EF18170B33006006FC /* Operation.m */; }; @@ -359,11 +364,9 @@ B660F6DA1C29868000687D6E /* ExceptionsTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6AB1C29868000687D6E /* ExceptionsTest.m */; }; B660F6DB1C29868000687D6E /* FunctionalUtilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6AD1C29868000687D6E /* FunctionalUtilTest.m */; }; B660F6E01C29868000687D6E /* UtilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6B41C29868000687D6E /* UtilTest.m */; }; - B660F7171C29988E00687D6E /* OWSContactsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB040918170B33006006FC /* OWSContactsManager.m */; }; B660F7221C29988E00687D6E /* VersionMigrations.m in Sources */ = {isa = PBXBuildFile; fileRef = B60C16641988999D00E97A6C /* VersionMigrations.m */; }; B660F7561C29988E00687D6E /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; }; B660F7721C29988E00687D6E /* AppStoreRating.m in Sources */ = {isa = PBXBuildFile; fileRef = B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.m */; }; - B660F7771C29988E00687D6E /* UIImage+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = B68112E91A4D9EC400BA82FF /* UIImage+OWS.m */; }; B660F77F1C29988E00687D6E /* DateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B90418E5183E9DD40038554A /* DateUtil.m */; }; B660F7811C29988E00687D6E /* FunctionalUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04EB18170B33006006FC /* FunctionalUtil.m */; }; B660F7831C29988E00687D6E /* NumberUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04ED18170B33006006FC /* NumberUtil.m */; }; @@ -372,7 +375,6 @@ B660F78C1C29988E00687D6E /* UIDevice+TSHardwareVersion.m in Sources */ = {isa = PBXBuildFile; fileRef = FCC81A971A44558300DFEC7D /* UIDevice+TSHardwareVersion.m */; }; B66DBF4A19D5BBC8006EA940 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B66DBF4919D5BBC8006EA940 /* Images.xcassets */; }; B67EBF5D19194AC60084CCFD /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B67EBF5C19194AC60084CCFD /* Settings.bundle */; }; - B68112EA1A4D9EC400BA82FF /* UIImage+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = B68112E91A4D9EC400BA82FF /* UIImage+OWS.m */; }; B69CD25119773E79005CE69A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B69CD25019773E79005CE69A /* XCTest.framework */; }; B6B226971BE4B7D200860F4D /* ContactsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6B226961BE4B7D200860F4D /* ContactsUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; }; @@ -524,9 +526,6 @@ 344F2F661E57A932000D9322 /* UIViewController+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+OWS.m"; path = "util/UIViewController+OWS.m"; sourceTree = ""; }; 34533F161EA8D2070006114F /* OWSAudioAttachmentPlayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSAudioAttachmentPlayer.h; sourceTree = ""; }; 34533F171EA8D2070006114F /* OWSAudioAttachmentPlayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSAudioAttachmentPlayer.m; sourceTree = ""; }; - 3453D8E91EC0D4ED003F9E6F /* OWSAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWSAlerts.swift; sourceTree = ""; }; - 345670FF1E89A5F1006EE662 /* ThreadUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadUtil.h; sourceTree = ""; }; - 345671001E89A5F1006EE662 /* ThreadUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadUtil.m; sourceTree = ""; }; 3461284A1FD0B93F00532771 /* SAELoadViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SAELoadViewController.swift; sourceTree = ""; }; 346129061FD1A25B00532771 /* bs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bs; path = Signal/translations/bs.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; 346129071FD1A25B00532771 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = Signal/translations/he.lproj/Localizable.strings; sourceTree = SOURCE_ROOT; }; @@ -607,6 +606,26 @@ 3461299B1FD1EA9E00532771 /* NotificationsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotificationsManager.m; sourceTree = ""; }; 3461299D1FD1EFE200532771 /* CryptoTools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoTools.h; sourceTree = ""; }; 3461299E1FD1EFE200532771 /* CryptoTools.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CryptoTools.m; sourceTree = ""; }; + 346129A21FD1F09100532771 /* OWSContactsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSContactsManager.h; sourceTree = ""; }; + 346129A31FD1F09100532771 /* OWSContactsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSContactsManager.m; sourceTree = ""; }; + 346129A81FD1F0DF00532771 /* OWSFormat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSFormat.h; sourceTree = ""; }; + 346129AA1FD1F0EE00532771 /* OWSFormat.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSFormat.m; sourceTree = ""; }; + 346129AC1FD1F34E00532771 /* ImageCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCache.swift; sourceTree = ""; }; + 346129AE1FD1F5D900532771 /* SystemContactsFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemContactsFetcher.swift; sourceTree = ""; }; + 346129B11FD1F7E800532771 /* OWSProfileManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSProfileManager.h; sourceTree = ""; }; + 346129B21FD1F7E800532771 /* OWSProfileManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSProfileManager.m; sourceTree = ""; }; + 346129B31FD1F7E800532771 /* ProfileFetcherJob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileFetcherJob.swift; sourceTree = ""; }; + 346129BD1FD2068600532771 /* ThreadUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ThreadUtil.h; sourceTree = ""; }; + 346129BE1FD2068600532771 /* ThreadUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ThreadUtil.m; sourceTree = ""; }; + 346129C01FD2072C00532771 /* NSString+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+OWS.h"; sourceTree = ""; }; + 346129C11FD2072D00532771 /* NSAttributedString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+OWS.m"; sourceTree = ""; }; + 346129C21FD2072D00532771 /* NSString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+OWS.m"; sourceTree = ""; }; + 346129C31FD2072D00532771 /* UIImage+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+OWS.h"; sourceTree = ""; }; + 346129C41FD2072D00532771 /* Promise+retainUntilComplete.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Promise+retainUntilComplete.swift"; sourceTree = ""; }; + 346129C51FD2072D00532771 /* NSAttributedString+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+OWS.h"; sourceTree = ""; }; + 346129C61FD2072D00532771 /* UIImage+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+OWS.m"; sourceTree = ""; }; + 346129CF1FD207F200532771 /* OWSAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWSAlerts.swift; sourceTree = ""; }; + 346129D11FD2085A00532771 /* CommonStrings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommonStrings.swift; sourceTree = ""; }; 346B66301F4E29B200E5122F /* CropScaleImageViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CropScaleImageViewController.swift; sourceTree = ""; }; 3471B1D81EB7C63600F6AEC8 /* NewNonContactConversationViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewNonContactConversationViewController.h; sourceTree = ""; }; 3471B1D91EB7C63600F6AEC8 /* NewNonContactConversationViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewNonContactConversationViewController.m; sourceTree = ""; }; @@ -693,8 +712,6 @@ 34C6B0A71FA0E46F00D35993 /* test-mp3.mp3 */ = {isa = PBXFileReference; lastKnownFileType = audio.mp3; path = "test-mp3.mp3"; sourceTree = ""; }; 34C6B0A81FA0E46F00D35993 /* test-mp4.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "test-mp4.mp4"; sourceTree = ""; }; 34C6B0AD1FA0E4AA00D35993 /* test-jpg.jpg */ = {isa = PBXFileReference; lastKnownFileType = image.jpeg; path = "test-jpg.jpg"; sourceTree = ""; }; - 34CA1C231F706B5400E51C51 /* NSAttributedString+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+OWS.h"; sourceTree = ""; }; - 34CA1C241F706B5400E51C51 /* NSAttributedString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+OWS.m"; sourceTree = ""; }; 34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageDetailViewController.swift; sourceTree = ""; }; 34CA1C281F7164F700E51C51 /* MediaMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaMessageView.swift; sourceTree = ""; }; 34CCAF361F0C0599004084F4 /* AppUpdateNag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppUpdateNag.h; sourceTree = ""; }; @@ -774,8 +791,6 @@ 34FD936E1E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OWSAnyTouchGestureRecognizer.h; path = views/OWSAnyTouchGestureRecognizer.h; sourceTree = ""; }; 34FD936F1E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = OWSAnyTouchGestureRecognizer.m; path = views/OWSAnyTouchGestureRecognizer.m; sourceTree = ""; }; 435EAC2E5E22D3F087EB3192 /* Pods-SignalShareExtension.app store release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SignalShareExtension.app store release.xcconfig"; path = "Pods/Target Support Files/Pods-SignalShareExtension/Pods-SignalShareExtension.app store release.xcconfig"; sourceTree = ""; }; - 450449371F45EE7D002D1ADA /* NSString+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSString+OWS.h"; path = "util/NSString+OWS.h"; sourceTree = ""; }; - 450449381F45EE7D002D1ADA /* NSString+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSString+OWS.m"; path = "util/NSString+OWS.m"; sourceTree = ""; }; 4505C2BE1E648EA300CEBF41 /* ExperienceUpgrade.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExperienceUpgrade.swift; path = ExperienceUpgrades/ExperienceUpgrade.swift; sourceTree = ""; }; 4509E7991DD653700025A59F /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = Carthage/Build/iOS/WebRTC.framework; sourceTree = ""; }; 450D19111F85236600970622 /* RemoteVideoView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteVideoView.h; sourceTree = ""; }; @@ -811,14 +826,11 @@ 45360B8F1F9527DA00FA666C /* SearcherTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearcherTest.swift; sourceTree = ""; }; 4539B5851F79348F007141FF /* PushRegistrationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushRegistrationManager.swift; sourceTree = ""; }; 453CC0361D08E1A60040EBA3 /* sn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sn; path = translations/sn.lproj/Localizable.strings; sourceTree = ""; }; - 4542F0931EB9372700C7EE92 /* SystemContactsFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SystemContactsFetcher.swift; sourceTree = ""; }; - 4542F0951EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Promise+retainUntilComplete.swift"; sourceTree = ""; }; 45464DBB1DFA041F001D3FD6 /* DataChannelMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataChannelMessage.swift; sourceTree = ""; }; 454B35071D08EED80026D658 /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mk; path = translations/mk.lproj/Localizable.strings; sourceTree = ""; }; 4556FA671F54AA9500AF40DD /* DebugUIProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugUIProfile.swift; sourceTree = ""; }; 455A16DB1F1FEA0000F86704 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; 455A16DC1F1FEA0000F86704 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; - 455AC69A1F4F79E500134004 /* ImageCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCache.swift; sourceTree = ""; }; 455AC69D1F4F8B0300134004 /* ImageCacheTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCacheTest.swift; sourceTree = ""; }; 45638BDB1F3DD0D400128435 /* DebugUICalling.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugUICalling.swift; sourceTree = ""; }; 45638BDE1F3DDB2200128435 /* MessageSender+Promise.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "MessageSender+Promise.swift"; sourceTree = ""; }; @@ -876,7 +888,6 @@ 45E282DE1D08E67800ADD4C8 /* gl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = gl; path = translations/gl.lproj/Localizable.strings; sourceTree = ""; }; 45E282DF1D08E6CC00ADD4C8 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = translations/id.lproj/Localizable.strings; sourceTree = ""; }; 45E2E91E1E13EE3500457AA0 /* OWSCallNotificationsAdaptee.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = OWSCallNotificationsAdaptee.h; path = UserInterface/OWSCallNotificationsAdaptee.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - 45E2E91F1E153B3D00457AA0 /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = Strings.swift; path = UserInterface/Strings.swift; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.swift; }; 45E5A6981F61E6DD001E4A8A /* MarqueeLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MarqueeLabel.swift; sourceTree = ""; }; 45E615151E8C590B0018AD52 /* DisplayableText.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayableText.swift; sourceTree = ""; }; 45E7A6A61E71CA7E00D44FB5 /* DisplayableTextFilterTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DisplayableTextFilterTest.swift; sourceTree = ""; }; @@ -896,8 +907,6 @@ 76C87F18181EFCE600C4ACAB /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; 76EB03C218170B33006006FC /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 76EB03C318170B33006006FC /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 76EB040818170B33006006FC /* OWSContactsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSContactsManager.h; sourceTree = ""; }; - 76EB040918170B33006006FC /* OWSContactsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSContactsManager.m; sourceTree = ""; }; 76EB04EA18170B33006006FC /* FunctionalUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FunctionalUtil.h; sourceTree = ""; }; 76EB04EB18170B33006006FC /* FunctionalUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FunctionalUtil.m; sourceTree = ""; }; 76EB04EC18170B33006006FC /* NumberUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberUtil.h; sourceTree = ""; }; @@ -975,8 +984,6 @@ B676BCF01AA544F5009637B8 /* el_GR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el_GR; path = translations/el_GR.lproj/Localizable.strings; sourceTree = ""; }; B676BCF11AA5451E009637B8 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = translations/es.lproj/Localizable.strings; sourceTree = ""; }; B67EBF5C19194AC60084CCFD /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = Settings.bundle; path = SettingsBundle/Settings.bundle; sourceTree = SOURCE_ROOT; }; - B68112E81A4D9EC400BA82FF /* UIImage+OWS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+OWS.h"; path = "util/UIImage+OWS.h"; sourceTree = ""; }; - B68112E91A4D9EC400BA82FF /* UIImage+OWS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+OWS.m"; path = "util/UIImage+OWS.m"; sourceTree = ""; }; B68CB7D71AA546B80065AC3F /* ko_KR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko_KR; path = translations/ko_KR.lproj/Localizable.strings; sourceTree = ""; }; B68CB7D81AA546C30065AC3F /* lv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lv; path = translations/lv.lproj/Localizable.strings; sourceTree = ""; }; B68CB7D91AA546CE0065AC3F /* nb_NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb_NO; path = translations/nb_NO.lproj/Localizable.strings; sourceTree = ""; }; @@ -1149,6 +1156,9 @@ 3461299E1FD1EFE200532771 /* CryptoTools.m */, 34480B4D1FD0A7A300BC14EF /* DebugLogger.h */, 34480B4E1FD0A7A300BC14EF /* DebugLogger.m */, + 346129AC1FD1F34E00532771 /* ImageCache.swift */, + 346129A81FD1F0DF00532771 /* OWSFormat.h */, + 346129AA1FD1F0EE00532771 /* OWSFormat.m */, 34480B4A1FD0A7A200BC14EF /* OWSLogger.h */, 34480B4B1FD0A7A300BC14EF /* OWSLogger.m */, 34480B481FD0A60200BC14EF /* OWSMath.h */, @@ -1166,10 +1176,17 @@ 34480B5C1FD0A98800BC14EF /* categories */ = { isa = PBXGroup; children = ( + 346129C51FD2072D00532771 /* NSAttributedString+OWS.h */, + 346129C11FD2072D00532771 /* NSAttributedString+OWS.m */, + 346129C01FD2072C00532771 /* NSString+OWS.h */, + 346129C21FD2072D00532771 /* NSString+OWS.m */, + 346129C41FD2072D00532771 /* Promise+retainUntilComplete.swift */, 34480B5D1FD0A98800BC14EF /* UIColor+OWS.h */, 34480B5E1FD0A98800BC14EF /* UIColor+OWS.m */, 34480B661FD0AA9400BC14EF /* UIFont+OWS.h */, 34480B651FD0AA9400BC14EF /* UIFont+OWS.m */, + 346129C31FD2072D00532771 /* UIImage+OWS.h */, + 346129C61FD2072D00532771 /* UIImage+OWS.m */, 34480B5F1FD0A98800BC14EF /* UIView+OWS.h */, 34480B601FD0A98800BC14EF /* UIView+OWS.m */, ); @@ -1245,6 +1262,35 @@ path = migrations; sourceTree = ""; }; + 346129A11FD1F09100532771 /* contacts */ = { + isa = PBXGroup; + children = ( + 346129A21FD1F09100532771 /* OWSContactsManager.h */, + 346129A31FD1F09100532771 /* OWSContactsManager.m */, + 346129AE1FD1F5D900532771 /* SystemContactsFetcher.swift */, + ); + path = contacts; + sourceTree = ""; + }; + 346129B01FD1F7E800532771 /* profiles */ = { + isa = PBXGroup; + children = ( + 346129B11FD1F7E800532771 /* OWSProfileManager.h */, + 346129B21FD1F7E800532771 /* OWSProfileManager.m */, + 346129B31FD1F7E800532771 /* ProfileFetcherJob.swift */, + ); + path = profiles; + sourceTree = ""; + }; + 346129CE1FD207F200532771 /* views */ = { + isa = PBXGroup; + children = ( + 346129D11FD2085A00532771 /* CommonStrings.swift */, + 346129CF1FD207F200532771 /* OWSAlerts.swift */, + ); + path = views; + sourceTree = ""; + }; 34B3F8331E8DF1700035BE1A /* ViewControllers */ = { isa = PBXGroup; children = ( @@ -1472,7 +1518,6 @@ 450DF2071E0DD29E003D14BE /* Notifications */, 34FD936E1E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.h */, 34FD936F1E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.m */, - 45E2E91F1E153B3D00457AA0 /* Strings.swift */, 34B3F8331E8DF1700035BE1A /* ViewControllers */, 76EB052B18170B33006006FC /* Views */, 4523149B1F7D7F81003A428C /* OWSMessagesBubbleImageFactory.swift */, @@ -1509,12 +1554,15 @@ isa = PBXGroup; children = ( 34480B5C1FD0A98800BC14EF /* categories */, + 346129A11FD1F09100532771 /* contacts */, 3461293F1FD1D74B00532771 /* environment */, 453518951FC63DBF00210559 /* Info.plist */, + 346129B01FD1F7E800532771 /* profiles */, 34480B5A1FD0A7E300BC14EF /* SignalMessaging-Prefix.pch */, 453518941FC63DBF00210559 /* SignalMessaging.h */, 453518A01FC63DD500210559 /* StorageCoordinator.swift */, 34480B471FD0A60200BC14EF /* utils */, + 346129CE1FD207F200532771 /* views */, ); path = SignalMessaging; sourceTree = ""; @@ -1630,7 +1678,6 @@ 76EB03C218170B33006006FC /* AppDelegate.h */, 76EB03C318170B33006006FC /* AppDelegate.m */, 76EB03FE18170B33006006FC /* call */, - 76EB040318170B33006006FC /* contact */, 76EB041118170B33006006FC /* environment */, 45D231751DC7E8C50034FA89 /* Jobs */, 457F3AC01D14A0F700C51351 /* Models */, @@ -1660,16 +1707,6 @@ path = call; sourceTree = ""; }; - 76EB040318170B33006006FC /* contact */ = { - isa = PBXGroup; - children = ( - 76EB040818170B33006006FC /* OWSContactsManager.h */, - 76EB040918170B33006006FC /* OWSContactsManager.m */, - 4542F0931EB9372700C7EE92 /* SystemContactsFetcher.swift */, - ); - path = contact; - sourceTree = ""; - }; 76EB041118170B33006006FC /* environment */ = { isa = PBXGroup; children = ( @@ -1710,11 +1747,8 @@ 45E615151E8C590B0018AD52 /* DisplayableText.swift */, 76EB04EA18170B33006006FC /* FunctionalUtil.h */, 76EB04EB18170B33006006FC /* FunctionalUtil.m */, - 455AC69A1F4F79E500134004 /* ImageCache.swift */, 34B0796C1FCF46B000E248C2 /* MainAppContext.h */, 34B0796B1FCF46B000E248C2 /* MainAppContext.m */, - 34CA1C231F706B5400E51C51 /* NSAttributedString+OWS.h */, - 34CA1C241F706B5400E51C51 /* NSAttributedString+OWS.m */, 76EB04EC18170B33006006FC /* NumberUtil.h */, 76EB04ED18170B33006006FC /* NumberUtil.m */, 76EB04EE18170B33006006FC /* Operation.h */, @@ -1725,13 +1759,12 @@ 4579431C1E7C8CE9008ED0C0 /* Pastelog.h */, 4579431D1E7C8CE9008ED0C0 /* Pastelog.m */, 450DF2041E0D74AC003D14BE /* Platform.swift */, - 4542F0951EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift */, 45360B8C1F9521F800FA666C /* Searcher.swift */, 76EB04F518170B33006006FC /* StringUtil.h */, 76EB04F618170B33006006FC /* StringUtil.m */, 4521C3BF1F59F3BA00B4C582 /* TextFieldHelper.swift */, - 345670FF1E89A5F1006EE662 /* ThreadUtil.h */, - 345671001E89A5F1006EE662 /* ThreadUtil.m */, + 346129BD1FD2068600532771 /* ThreadUtil.h */, + 346129BE1FD2068600532771 /* ThreadUtil.m */, FCFA64B11A24F29E0007FB87 /* UI Categories */, FCC81A961A44558300DFEC7D /* UIDevice+TSHardwareVersion.h */, FCC81A971A44558300DFEC7D /* UIDevice+TSHardwareVersion.m */, @@ -1756,7 +1789,6 @@ 451764281DE939FD00EDB8B9 /* ContactCell.xib */, 76EB052E18170B33006006FC /* ContactTableViewCell.h */, 76EB052F18170B33006006FC /* ContactTableViewCell.m */, - 3453D8E91EC0D4ED003F9E6F /* OWSAlerts.swift */, 34F308A01ECB469700BB7697 /* OWSBezierPathView.h */, 34F308A11ECB469700BB7697 /* OWSBezierPathView.m */, 459311FA1D75C948008DD4F0 /* OWSDeviceTableViewCell.h */, @@ -2036,12 +2068,8 @@ isa = PBXGroup; children = ( 45638BDE1F3DDB2200128435 /* MessageSender+Promise.swift */, - 450449371F45EE7D002D1ADA /* NSString+OWS.h */, - 450449381F45EE7D002D1ADA /* NSString+OWS.m */, 45C0DC1A1E68FE9000E04C47 /* UIApplication+OWS.swift */, 45BB93371E688E14001E3939 /* UIDevice+featureSupport.swift */, - B68112E81A4D9EC400BA82FF /* UIImage+OWS.h */, - B68112E91A4D9EC400BA82FF /* UIImage+OWS.m */, 45C0DC1D1E69011F00E04C47 /* UIStoryboard+OWS.swift */, 344F2F651E57A932000D9322 /* UIViewController+OWS.h */, 344F2F661E57A932000D9322 /* UIViewController+OWS.m */, @@ -2061,18 +2089,24 @@ files = ( 34480B491FD0A60200BC14EF /* OWSMath.h in Headers */, 34480B521FD0A7A400BC14EF /* OWSLogger.h in Headers */, + 346129A91FD1F0E000532771 /* OWSFormat.h in Headers */, 34480B551FD0A7A400BC14EF /* DebugLogger.h in Headers */, + 346129CA1FD2072E00532771 /* UIImage+OWS.h in Headers */, 346129711FD1D74C00532771 /* SignalKeyingStorage.h in Headers */, + 346129C71FD2072E00532771 /* NSString+OWS.h in Headers */, 3461296F1FD1D74C00532771 /* Release.h in Headers */, 34480B571FD0A7A400BC14EF /* OWSScrubbingLogFormatter.h in Headers */, 346129951FD1E30000532771 /* OWSDatabaseMigration.h in Headers */, + 346129B41FD1F7E800532771 /* OWSProfileManager.h in Headers */, 34480B611FD0A98800BC14EF /* UIColor+OWS.h in Headers */, 453518961FC63DBF00210559 /* SignalMessaging.h in Headers */, 3461295A1FD1D74C00532771 /* Environment.h in Headers */, 34480B631FD0A98800BC14EF /* UIView+OWS.h in Headers */, 346129391FD1B47300532771 /* OWSPreferences.h in Headers */, 34480B5B1FD0A7E300BC14EF /* SignalMessaging-Prefix.pch in Headers */, + 346129A51FD1F09100532771 /* OWSContactsManager.h in Headers */, 34480B681FD0AA9400BC14EF /* UIFont+OWS.h in Headers */, + 346129CC1FD2072E00532771 /* NSAttributedString+OWS.h in Headers */, 3461299F1FD1EFE200532771 /* CryptoTools.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -2702,20 +2736,32 @@ files = ( 453518A11FC63DD500210559 /* StorageCoordinator.swift in Sources */, 346129761FD1E0B500532771 /* WeakTimer.swift in Sources */, + 346129B51FD1F7E800532771 /* OWSProfileManager.m in Sources */, 346129701FD1D74C00532771 /* Release.m in Sources */, 34480B621FD0A98800BC14EF /* UIColor+OWS.m in Sources */, 34480B531FD0A7A400BC14EF /* OWSLogger.m in Sources */, 34480B641FD0A98800BC14EF /* UIView+OWS.m in Sources */, 3461293A1FD1B47300532771 /* OWSPreferences.m in Sources */, 34480B671FD0AA9400BC14EF /* UIFont+OWS.m in Sources */, + 346129AB1FD1F0EE00532771 /* OWSFormat.m in Sources */, 346129961FD1E30000532771 /* OWSDatabaseMigration.m in Sources */, + 346129CD1FD2072E00532771 /* UIImage+OWS.m in Sources */, + 346129AD1FD1F34E00532771 /* ImageCache.swift in Sources */, 346129341FD1A88700532771 /* OWSSwiftUtils.swift in Sources */, + 346129D01FD207F300532771 /* OWSAlerts.swift in Sources */, + 346129B61FD1F7E800532771 /* ProfileFetcherJob.swift in Sources */, 346129A01FD1EFE200532771 /* CryptoTools.m in Sources */, 3461295B1FD1D74C00532771 /* Environment.m in Sources */, + 346129C91FD2072E00532771 /* NSString+OWS.m in Sources */, + 346129CB1FD2072E00532771 /* Promise+retainUntilComplete.swift in Sources */, + 346129A61FD1F09100532771 /* OWSContactsManager.m in Sources */, + 346129D21FD2085A00532771 /* CommonStrings.swift in Sources */, 34480B591FD0A7A400BC14EF /* OWSScrubbingLogFormatter.m in Sources */, 346129721FD1D74C00532771 /* SignalKeyingStorage.m in Sources */, 34480B561FD0A7A400BC14EF /* DebugLogger.m in Sources */, 3461293C1FD1D46A00532771 /* OWSMath.m in Sources */, + 346129AF1FD1F5D900532771 /* SystemContactsFetcher.swift in Sources */, + 346129C81FD2072E00532771 /* NSAttributedString+OWS.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2740,7 +2786,6 @@ 34D1F0871F8678AA0066283D /* ConversationViewItem.m in Sources */, 344F2F671E57A932000D9322 /* UIViewController+OWS.m in Sources */, B6DA6B071B8A2F9A00CA6F98 /* AppStoreRating.m in Sources */, - 455AC69B1F4F79E500134004 /* ImageCache.swift in Sources */, 451A13B11E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */, 450DF2091E0DD2C6003D14BE /* UserNotificationsAdaptee.swift in Sources */, 34D1F0821F8678AA0066283D /* ConversationHeaderView.m in Sources */, @@ -2749,15 +2794,12 @@ 45B72DDA1FD5E70600151AF6 /* ConversationSearcher.swift in Sources */, 34D1F0AB1F867BFC0066283D /* OWSContactOffersCell.m in Sources */, 34CE88EC1F3237260098030F /* OWSProfileManager.m in Sources */, - 4542F0941EB9372700C7EE92 /* SystemContactsFetcher.swift in Sources */, B60C16651988999D00E97A6C /* VersionMigrations.m in Sources */, 343A65981FC4CFE7000477A1 /* ConversationScrollButton.m in Sources */, B97940271832BD2400BD66CB /* UIUtil.m in Sources */, 34CE88ED1F3237260098030F /* ProfileFetcherJob.swift in Sources */, 34B3F8791E8DF1700035BE1A /* CountryCodeViewController.m in Sources */, 34D1F0A91F867BFC0066283D /* ConversationViewCell.m in Sources */, - 34CA1C251F706B5400E51C51 /* NSAttributedString+OWS.m in Sources */, - 4542F0961EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift in Sources */, 3461298B1FD1E2AB00532771 /* OWS102MoveLoggingPreferenceToUserDefaults.m in Sources */, 4505C2BF1E648EA300CEBF41 /* ExperienceUpgrade.swift in Sources */, 34CCAF381F0C0599004084F4 /* AppUpdateNag.m in Sources */, @@ -2792,11 +2834,9 @@ 451686AB1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift in Sources */, 45D231771DC7E8F10034FA89 /* SessionResetJob.swift in Sources */, 34D9134D1F66DB7C00722898 /* ModalActivityIndicatorViewController.swift in Sources */, - 76EB057A18170B33006006FC /* OWSContactsManager.m in Sources */, 76EB064218170B33006006FC /* StringUtil.m in Sources */, 452037D11EE84975004E4CDF /* DebugUISessionState.m in Sources */, D221A09A169C9E5E00537ABF /* main.m in Sources */, - 345671011E89A5F1006EE662 /* ThreadUtil.m in Sources */, 34B3F87B1E8DF1700035BE1A /* ExperienceUpgradesPageViewController.swift in Sources */, 34533F181EA8D2070006114F /* OWSAudioAttachmentPlayer.m in Sources */, 452EA09E1EA7ABE00078744B /* AttachmentPointerView.swift in Sources */, @@ -2805,7 +2845,6 @@ 34B3F87C1E8DF1700035BE1A /* FingerprintViewController.m in Sources */, 4523149C1F7D7F81003A428C /* OWSMessagesBubbleImageFactory.swift in Sources */, 45638BDC1F3DD0D400128435 /* DebugUICalling.swift in Sources */, - 450449391F45EE7D002D1ADA /* NSString+OWS.m in Sources */, 45464DBC1DFA041F001D3FD6 /* DataChannelMessage.swift in Sources */, 34E3E5681EC4B19400495BAC /* AudioProgressView.swift in Sources */, 34D1F0521F7E8EA30066283D /* GiphyDownloader.swift in Sources */, @@ -2845,7 +2884,6 @@ 34D8C0271ED3673300188D7C /* DebugUIMessages.m in Sources */, 34D1F0B41F86D31D0066283D /* ConversationCollectionView.m in Sources */, 34B3F8821E8DF1700035BE1A /* NewContactThreadViewController.m in Sources */, - 3453D8EA1EC0D4ED003F9E6F /* OWSAlerts.swift in Sources */, 45F659821E1BE77000444429 /* NonCallKitCallUIAdaptee.swift in Sources */, 45AE48511E0732D6004D96C2 /* TurnServerInfo.swift in Sources */, 34B3F8771E8DF1700035BE1A /* ContactsPicker.swift in Sources */, @@ -2885,8 +2923,8 @@ 34D1F0B11F867BFC0066283D /* OWSUnreadIndicatorCell.m in Sources */, 34B3F89C1E8DF3270035BE1A /* BlockListViewController.m in Sources */, 34BECE2B1F74C12700D7438D /* DebugUIStress.m in Sources */, + 346129BF1FD2068600532771 /* ThreadUtil.m in Sources */, 34C42D5B1F45F7A80072EC04 /* OWSNavigationController.m in Sources */, - B68112EA1A4D9EC400BA82FF /* UIImage+OWS.m in Sources */, B609597C1C2C0FC6004E8797 /* iRate.m in Sources */, 4574A5D61DD6704700C6B692 /* CallService.swift in Sources */, 34B3F8721E8DF1700035BE1A /* AdvancedSettingsTableViewController.m in Sources */, @@ -2897,7 +2935,6 @@ 34C42D671F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m in Sources */, 34B3F87E1E8DF1700035BE1A /* InboxTableViewCell.m in Sources */, 34D5CC961EA6AFAD005515DB /* OWSContactsSyncing.m in Sources */, - 45E2E9201E153B3D00457AA0 /* Strings.swift in Sources */, 34B3F88B1E8DF1700035BE1A /* OWSLinkedDevicesTableViewController.m in Sources */, 4579431E1E7C8CE9008ED0C0 /* Pastelog.m in Sources */, 34C42D661F4734ED0072EC04 /* OWSContactOffersInteraction.m in Sources */, @@ -2921,7 +2958,6 @@ buildActionMask = 2147483647; files = ( 456F6E241E24133E00FD2210 /* CallKitCallUIAdaptee.swift in Sources */, - 451DA3C81F14898E008E2423 /* Strings.swift in Sources */, 456F6E251E24216100FD2210 /* DataChannelMessage.swift in Sources */, 452ECA4E1E087E7200E2F016 /* MessageFetcherJob.swift in Sources */, 45F170AD1E2F0351003FC1F2 /* CallAudioSession.swift in Sources */, @@ -2931,7 +2967,6 @@ 456F6E2F1E261D1000FD2210 /* PeerConnectionClientTest.swift in Sources */, 452C46901E427E200087B011 /* OutboundCallInitiator.swift in Sources */, 451DE9F81DC18C9500810E42 /* AccountManager.swift in Sources */, - B660F7171C29988E00687D6E /* OWSContactsManager.m in Sources */, 451DA3CA1F148A9F008E2423 /* DeviceSleepManager.swift in Sources */, 45BB93391E688E14001E3939 /* UIDevice+featureSupport.swift in Sources */, B660F7221C29988E00687D6E /* VersionMigrations.m in Sources */, @@ -2945,25 +2980,20 @@ 451DE9FE1DC1A28200810E42 /* SyncPushTokensJob.swift in Sources */, 456F6E231E24133500FD2210 /* Platform.swift in Sources */, 4539B5871F79348F007141FF /* PushRegistrationManager.swift in Sources */, - 4504493A1F45EE7D002D1ADA /* NSString+OWS.m in Sources */, 45AE48521E0732D6004D96C2 /* TurnServerInfo.swift in Sources */, 45360B901F9527DA00FA666C /* SearcherTest.swift in Sources */, B660F7561C29988E00687D6E /* PushManager.m in Sources */, 45360B911F952AA900FA666C /* MarqueeLabel.swift in Sources */, 45FBC5D21DF8592E00E9B410 /* SignalCall.swift in Sources */, 451A13B21E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */, - 4542F0971EBB9E9A00C7EE92 /* Promise+retainUntilComplete.swift in Sources */, - 451DA3C91F1489BE008E2423 /* OWSAlerts.swift in Sources */, 45855F381D9498A40084F340 /* OWSContactAvatarBuilder.m in Sources */, 45DF5DF31DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */, 456AC8341E3A775E00A3C7FC /* Weak.swift in Sources */, 454EBAB41F2BE14C00ACE0BB /* OWSAnalytics.swift in Sources */, B660F7721C29988E00687D6E /* AppStoreRating.m in Sources */, 45360B8E1F9521F800FA666C /* Searcher.swift in Sources */, - B660F7771C29988E00687D6E /* UIImage+OWS.m in Sources */, 45360B921F952AB400FA666C /* OWSFlatButton.swift in Sources */, 954AEE6A1DF33E01002E5410 /* ContactsPickerTest.swift in Sources */, - 455AC69C1F4F79E500134004 /* ImageCache.swift in Sources */, 4556FA691F54AA9500AF40DD /* DebugUIProfile.swift in Sources */, 45666F581D9B2880008FE134 /* OWSScrubbingLogFormatterTest.m in Sources */, B660F77F1C29988E00687D6E /* DateUtil.m in Sources */, diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m index 22e749602..18c496729 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSAudioMessageView.m @@ -8,6 +8,7 @@ #import "UIColor+JSQMessages.h" #import "UIColor+OWS.h" #import "ViewControllerUtils.h" +#import #import NS_ASSUME_NONNULL_BEGIN @@ -82,11 +83,11 @@ NS_ASSUME_NONNULL_BEGIN if (self.isAudioPlaying && self.audioProgressSeconds > 0 && self.audioDurationSeconds > 0) { self.audioBottomLabel.text = [NSString stringWithFormat:@"%@ / %@", - [ViewControllerUtils formatDurationSeconds:(long)round(self.audioProgressSeconds)], - [ViewControllerUtils formatDurationSeconds:(long)round(self.audioDurationSeconds)]]; + [OWSFormat formatDurationSeconds:(long)round(self.audioProgressSeconds)], + [OWSFormat formatDurationSeconds:(long)round(self.audioDurationSeconds)]]; } else { - self.audioBottomLabel.text = [NSString - stringWithFormat:@"%@", [ViewControllerUtils formatDurationSeconds:(long)round(self.audioDurationSeconds)]]; + self.audioBottomLabel.text = + [NSString stringWithFormat:@"%@", [OWSFormat formatDurationSeconds:(long)round(self.audioDurationSeconds)]]; } } diff --git a/Signal/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.m b/Signal/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.m index 7a4be5a3a..af4e20804 100644 --- a/Signal/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.m +++ b/Signal/src/ViewControllers/ConversationView/Cells/OWSGenericAttachmentView.m @@ -10,6 +10,7 @@ #import "UIFont+OWS.h" #import "UIView+OWS.h" #import "ViewControllerUtils.h" +#import #import #import @@ -194,7 +195,7 @@ NS_ASSUME_NONNULL_BEGIN unsigned long long fileSize = [[NSFileManager defaultManager] attributesOfItemAtPath:[self.attachmentStream filePath] error:&error].fileSize; OWSAssert(!error); - NSString *bottomText = [ViewControllerUtils formatFileSize:fileSize]; + NSString *bottomText = [OWSFormat formatFileSize:fileSize]; UILabel *bottomLabel = [UILabel new]; bottomLabel.text = bottomText; bottomLabel.textColor = [textColor colorWithAlphaComponent:0.85f]; diff --git a/Signal/src/ViewControllers/ConversationView/ConversationInputToolbar.m b/Signal/src/ViewControllers/ConversationView/ConversationInputToolbar.m index 0753c686d..c9e546ea3 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationInputToolbar.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationInputToolbar.m @@ -10,6 +10,7 @@ #import "UIFont+OWS.h" #import "UIView+OWS.h" #import "ViewControllerUtils.h" +#import #import NS_ASSUME_NONNULL_BEGIN @@ -612,7 +613,7 @@ static void *kConversationInputTextViewObservingContext = &kConversationInputTex OWSAssert([NSThread isMainThread]); NSTimeInterval durationSeconds = fabs([self.voiceMemoStartTime timeIntervalSinceNow]); - self.recordingLabel.text = [ViewControllerUtils formatDurationSeconds:(long)round(durationSeconds)]; + self.recordingLabel.text = [OWSFormat formatDurationSeconds:(long)round(durationSeconds)]; [self.recordingLabel sizeToFit]; } diff --git a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m index da87dbd6f..297a95003 100644 --- a/Signal/src/ViewControllers/ConversationView/ConversationViewController.m +++ b/Signal/src/ViewControllers/ConversationView/ConversationViewController.m @@ -66,6 +66,7 @@ #import #import #import +#import #import #import #import @@ -742,7 +743,7 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { [NSString stringWithFormat:NSLocalizedString(@"MESSAGES_VIEW_GROUP_N_MEMBERS_BLOCKED_FORMAT", @"Indicates that some members of this group has been blocked. Embeds " @"{{the number of blocked users in this group}}."), - [ViewControllerUtils formatInt:blockedGroupMemberCount]]; + [OWSFormat formatInt:blockedGroupMemberCount]]; } } @@ -3568,7 +3569,7 @@ typedef NS_ENUM(NSInteger, MessagesRangeSizeMode) { // Max out the unread count at 99+. const NSUInteger kMaxUnreadCount = 99; - _backButtonUnreadCountLabel.text = [ViewControllerUtils formatInt:(int)MIN(kMaxUnreadCount, unreadCount)]; + _backButtonUnreadCountLabel.text = [OWSFormat formatInt:(int)MIN(kMaxUnreadCount, unreadCount)]; } #pragma mark 3D Touch Preview Actions diff --git a/Signal/src/ViewControllers/HomeViewController.m b/Signal/src/ViewControllers/HomeViewController.m index 1f050d0d6..6cb698425 100644 --- a/Signal/src/ViewControllers/HomeViewController.m +++ b/Signal/src/ViewControllers/HomeViewController.m @@ -21,6 +21,7 @@ #import "VersionMigrations.h" #import "ViewControllerUtils.h" #import +#import #import #import #import @@ -754,8 +755,7 @@ typedef NS_ENUM(NSInteger, CellState) { kArchiveState, kInboxState }; NSString *unreadString = NSLocalizedString(@"WHISPER_NAV_BAR_TITLE", nil); if (numberOfItems > 0) { - unreadString = - [unreadString stringByAppendingFormat:@" (%@)", [ViewControllerUtils formatInt:(int)numberOfItems]]; + unreadString = [unreadString stringByAppendingFormat:@" (%@)", [OWSFormat formatInt:(int)numberOfItems]]; } [_segmentedControl setTitle:unreadString forSegmentAtIndex:0]; diff --git a/Signal/src/ViewControllers/InboxTableViewCell.m b/Signal/src/ViewControllers/InboxTableViewCell.m index 1419a5147..2b3a92780 100644 --- a/Signal/src/ViewControllers/InboxTableViewCell.m +++ b/Signal/src/ViewControllers/InboxTableViewCell.m @@ -7,6 +7,7 @@ #import "Signal-Swift.h" #import "Util.h" #import "ViewControllerUtils.h" +#import #import #import #import @@ -224,7 +225,7 @@ const NSUInteger kAvatarViewDiameter = 52; if (unreadCount > 0) { self.unreadBadge.hidden = NO; self.unreadLabel.hidden = NO; - self.unreadLabel.text = [ViewControllerUtils formatInt:MIN(99, (int)unreadCount)]; + self.unreadLabel.text = [OWSFormat formatInt:MIN(99, (int)unreadCount)]; } else { self.unreadBadge.hidden = YES; self.unreadLabel.hidden = YES; diff --git a/Signal/src/ViewControllers/ViewControllerUtils.h b/Signal/src/ViewControllers/ViewControllerUtils.h index e9e490ac0..ed627c5a3 100644 --- a/Signal/src/ViewControllers/ViewControllerUtils.h +++ b/Signal/src/ViewControllers/ViewControllerUtils.h @@ -22,14 +22,6 @@ NS_ASSUME_NONNULL_BEGIN + (NSString *)examplePhoneNumberForCountryCode:(NSString *)countryCode callingCode:(NSString *)callingCode; -#pragma mark - Formatting - -+ (NSString *)formatInt:(int)value; - -+ (NSString *)formatFileSize:(unsigned long)fileSize; - -+ (NSString *)formatDurationSeconds:(long)timeSeconds; - @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/ViewControllers/ViewControllerUtils.m b/Signal/src/ViewControllers/ViewControllerUtils.m index fcc3d593f..40e29927a 100644 --- a/Signal/src/ViewControllers/ViewControllerUtils.m +++ b/Signal/src/ViewControllers/ViewControllerUtils.m @@ -111,51 +111,6 @@ NS_ASSUME_NONNULL_BEGIN } } -#pragma mark - Formatting - -+ (NSString *)formatInt:(int)value -{ - static NSNumberFormatter *formatter = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - formatter = [NSNumberFormatter new]; - formatter.numberStyle = NSNumberFormatterNoStyle; - }); - return [formatter stringFromNumber:@(value)]; -} - -+ (NSString *)formatFileSize:(unsigned long)fileSize -{ - const unsigned long kOneKilobyte = 1024; - const unsigned long kOneMegabyte = kOneKilobyte * kOneKilobyte; - - NSNumberFormatter *numberFormatter = [NSNumberFormatter new]; - numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; - - if (fileSize > kOneMegabyte * 10) { - return [[numberFormatter stringFromNumber:@((int)round(fileSize / (CGFloat)kOneMegabyte))] - stringByAppendingString:@" MB"]; - } else if (fileSize > kOneKilobyte * 10) { - return [[numberFormatter stringFromNumber:@((int)round(fileSize / (CGFloat)kOneKilobyte))] - stringByAppendingString:@" KB"]; - } else { - return [NSString stringWithFormat:@"%lu Bytes", fileSize]; - } -} - -+ (NSString *)formatDurationSeconds:(long)timeSeconds -{ - long seconds = timeSeconds % 60; - long minutes = (timeSeconds / 60) % 60; - long hours = timeSeconds / 3600; - - if (hours > 0) { - return [NSString stringWithFormat:@"%ld:%02ld:%02ld", hours, minutes, seconds]; - } else { - return [NSString stringWithFormat:@"%ld:%02ld", minutes, seconds]; - } -} - @end NS_ASSUME_NONNULL_END diff --git a/Signal/src/util/MainAppContext.m b/Signal/src/util/MainAppContext.m index cdc093801..9f42f689f 100644 --- a/Signal/src/util/MainAppContext.m +++ b/Signal/src/util/MainAppContext.m @@ -62,6 +62,11 @@ NS_ASSUME_NONNULL_BEGIN ]; } +- (UIViewController *)frontmostViewController +{ + return UIApplication.sharedApplication.frontmostViewController; +} + @end NS_ASSUME_NONNULL_END diff --git a/SignalMessaging/SignalMessaging.h b/SignalMessaging/SignalMessaging.h index e9e48efff..27b71fe4a 100644 --- a/SignalMessaging/SignalMessaging.h +++ b/SignalMessaging/SignalMessaging.h @@ -14,3 +14,4 @@ FOUNDATION_EXPORT const unsigned char SignalMessagingVersionString[]; #import #import #import +#import diff --git a/Signal/src/util/NSAttributedString+OWS.h b/SignalMessaging/categories/NSAttributedString+OWS.h similarity index 100% rename from Signal/src/util/NSAttributedString+OWS.h rename to SignalMessaging/categories/NSAttributedString+OWS.h diff --git a/Signal/src/util/NSAttributedString+OWS.m b/SignalMessaging/categories/NSAttributedString+OWS.m similarity index 100% rename from Signal/src/util/NSAttributedString+OWS.m rename to SignalMessaging/categories/NSAttributedString+OWS.m diff --git a/Signal/src/util/NSString+OWS.h b/SignalMessaging/categories/NSString+OWS.h similarity index 100% rename from Signal/src/util/NSString+OWS.h rename to SignalMessaging/categories/NSString+OWS.h diff --git a/Signal/src/util/NSString+OWS.m b/SignalMessaging/categories/NSString+OWS.m similarity index 100% rename from Signal/src/util/NSString+OWS.m rename to SignalMessaging/categories/NSString+OWS.m diff --git a/Signal/src/util/Promise+retainUntilComplete.swift b/SignalMessaging/categories/Promise+retainUntilComplete.swift similarity index 100% rename from Signal/src/util/Promise+retainUntilComplete.swift rename to SignalMessaging/categories/Promise+retainUntilComplete.swift diff --git a/Signal/src/util/UIImage+OWS.h b/SignalMessaging/categories/UIImage+OWS.h similarity index 100% rename from Signal/src/util/UIImage+OWS.h rename to SignalMessaging/categories/UIImage+OWS.h diff --git a/Signal/src/util/UIImage+OWS.m b/SignalMessaging/categories/UIImage+OWS.m similarity index 100% rename from Signal/src/util/UIImage+OWS.m rename to SignalMessaging/categories/UIImage+OWS.m diff --git a/Signal/src/contact/OWSContactsManager.h b/SignalMessaging/contacts/OWSContactsManager.h similarity index 100% rename from Signal/src/contact/OWSContactsManager.h rename to SignalMessaging/contacts/OWSContactsManager.h diff --git a/Signal/src/contact/OWSContactsManager.m b/SignalMessaging/contacts/OWSContactsManager.m similarity index 98% rename from Signal/src/contact/OWSContactsManager.m rename to SignalMessaging/contacts/OWSContactsManager.m index cc49c0a9d..988ddc0aa 100644 --- a/Signal/src/contact/OWSContactsManager.m +++ b/SignalMessaging/contacts/OWSContactsManager.m @@ -4,13 +4,15 @@ #import "OWSContactsManager.h" #import "Environment.h" +#import "OWSFormat.h" #import "OWSProfileManager.h" -#import "Signal-Swift.h" #import "Util.h" #import "ViewControllerUtils.h" +#import #import #import #import +#import #import #import @@ -45,7 +47,8 @@ NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownCont @implementation OWSContactsManager -- (id)init { +- (id)init +{ self = [super init]; if (!self) { return self; @@ -434,7 +437,7 @@ NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownCont if (phoneNumbersWithTheSameName.count > 1) { NSUInteger index = [[phoneNumbersWithTheSameName sortedArrayUsingSelector:@selector(compare:)] indexOfObject:recipientId]; - NSString *indexText = [ViewControllerUtils formatInt:(int)index + 1]; + NSString *indexText = [OWSFormat formatInt:(int)index + 1]; phoneNumberLabel = [NSString stringWithFormat:NSLocalizedString(@"PHONE_NUMBER_TYPE_AND_INDEX_NAME_FORMAT", @"Format for phone number label with an index. Embeds {{Phone number label " @@ -446,7 +449,8 @@ NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownCont return phoneNumberLabel; } -- (BOOL)phoneNumber:(PhoneNumber *)phoneNumber1 matchesNumber:(PhoneNumber *)phoneNumber2 { +- (BOOL)phoneNumber:(PhoneNumber *)phoneNumber1 matchesNumber:(PhoneNumber *)phoneNumber2 +{ return [phoneNumber1.toE164 isEqualToString:phoneNumber2.toE164]; } @@ -459,8 +463,8 @@ NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownCont - (NSString *)unknownContactName { - return NSLocalizedString(@"UNKNOWN_CONTACT_NAME", - @"Displayed if for some reason we can't determine a contacts phone number *or* name"); + return NSLocalizedString( + @"UNKNOWN_CONTACT_NAME", @"Displayed if for some reason we can't determine a contacts phone number *or* name"); } - (nullable NSString *)formattedProfileNameForRecipientId:(NSString *)recipientId @@ -699,7 +703,8 @@ NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownCont } } -- (UIImage * _Nullable)imageForPhoneIdentifier:(NSString * _Nullable)identifier { +- (UIImage *_Nullable)imageForPhoneIdentifier:(NSString *_Nullable)identifier +{ Contact *contact = self.allContactsMap[identifier]; // Prefer the contact image from the local address book if available @@ -723,11 +728,11 @@ NSString *const kTSStorageManager_lastKnownContactRecipientIds = @"lastKnownCont name = signalAccount.contact.comparableNameLastFirst; } } - + if (name.length < 1) { name = signalAccount.recipientId; } - + return name; } diff --git a/Signal/src/contact/SystemContactsFetcher.swift b/SignalMessaging/contacts/SystemContactsFetcher.swift similarity index 98% rename from Signal/src/contact/SystemContactsFetcher.swift rename to SignalMessaging/contacts/SystemContactsFetcher.swift index 760647c6e..a727171b1 100644 --- a/Signal/src/contact/SystemContactsFetcher.swift +++ b/SignalMessaging/contacts/SystemContactsFetcher.swift @@ -6,7 +6,6 @@ import Foundation import Contacts import ContactsUI import SignalServiceKit -import SignalMessaging enum Result { case success(T) @@ -277,7 +276,7 @@ struct OWSABRecord { } } -enum ContactStoreAuthorizationStatus { +public enum ContactStoreAuthorizationStatus { case notDetermined, restricted, denied, @@ -317,24 +316,26 @@ class ContactStoreAdapter: ContactStoreAdaptee { } } -@objc protocol SystemContactsFetcherDelegate: class { +@objc public protocol SystemContactsFetcherDelegate: class { func systemContactsFetcher(_ systemContactsFetcher: SystemContactsFetcher, updatedContacts contacts: [Contact]) } @objc -class SystemContactsFetcher: NSObject { +public class SystemContactsFetcher: NSObject { private let TAG = "[SystemContactsFetcher]" var lastContactUpdateHash: Int? var lastDelegateNotificationDate: Date? let contactStoreAdapter: ContactStoreAdapter + @objc public weak var delegate: SystemContactsFetcherDelegate? public var authorizationStatus: ContactStoreAuthorizationStatus { return contactStoreAdapter.authorizationStatus } + @objc public var isAuthorized: Bool { guard self.authorizationStatus != .notDetermined else { owsFail("should have called `requestOnce` before checking authorization status.") @@ -344,14 +345,16 @@ class SystemContactsFetcher: NSObject { return self.authorizationStatus == .authorized } - private(set) var systemContactsHaveBeenRequestedAtLeastOnce = false + @objc + public private(set) var systemContactsHaveBeenRequestedAtLeastOnce = false private var hasSetupObservation = false override init() { self.contactStoreAdapter = ContactStoreAdapter() } - var supportsContactEditing: Bool { + @objc + public var supportsContactEditing: Bool { return self.contactStoreAdapter.supportsContactEditing } @@ -375,6 +378,7 @@ class SystemContactsFetcher: NSObject { * * @param completion completion handler is called on main thread. */ + @objc public func requestOnce(completion completionParam: ((Error?) -> Void)?) { AssertIsOnMainThread() @@ -424,6 +428,7 @@ class SystemContactsFetcher: NSObject { } } + @objc public func fetchOnceIfAlreadyAuthorized() { AssertIsOnMainThread() guard authorizationStatus == .authorized else { @@ -436,6 +441,7 @@ class SystemContactsFetcher: NSObject { updateContacts(completion: nil, alwaysNotify: false) } + @objc public func fetchIfAlreadyAuthorizedAndAlwaysNotify() { AssertIsOnMainThread() guard authorizationStatus == .authorized else { diff --git a/Signal/src/Profiles/OWSProfileManager.h b/SignalMessaging/profiles/OWSProfileManager.h similarity index 100% rename from Signal/src/Profiles/OWSProfileManager.h rename to SignalMessaging/profiles/OWSProfileManager.h diff --git a/Signal/src/Profiles/OWSProfileManager.m b/SignalMessaging/profiles/OWSProfileManager.m similarity index 98% rename from Signal/src/Profiles/OWSProfileManager.m rename to SignalMessaging/profiles/OWSProfileManager.m index 2973aa0fe..b5948f0b5 100644 --- a/Signal/src/Profiles/OWSProfileManager.m +++ b/SignalMessaging/profiles/OWSProfileManager.m @@ -5,7 +5,9 @@ #import "OWSProfileManager.h" #import "Environment.h" #import "NSString+OWS.h" -#import "Signal-Swift.h" +#import "UIImage+OWS.h" +#import +#import #import #import #import @@ -13,7 +15,9 @@ #import #import #import +#import #import +#import #import #import #import @@ -243,15 +247,15 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640; // Other threads may modify this profile's properties OWSAssert([userProfile isEqual:userProfileCopy]); } - + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // Make sure to save on the local db connection for consistency. [self.dbConnection readWriteWithBlock:^(YapDatabaseReadWriteTransaction *transaction) { [userProfileCopy saveWithTransaction:transaction]; }]; - + BOOL isLocalUserProfile = userProfile == self.localUserProfile; - + dispatch_async(dispatch_get_main_queue(), ^{ if (isLocalUserProfile) { // We populate an initial (empty) profile on launch of a new install, but until @@ -263,23 +267,24 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640; messageSender:self.messageSender profileManager:self]; } - - [[NSNotificationCenter defaultCenter] postNotificationNameAsync:kNSNotificationName_LocalProfileDidChange - object:nil - userInfo:nil]; + + [[NSNotificationCenter defaultCenter] + postNotificationNameAsync:kNSNotificationName_LocalProfileDidChange + object:nil + userInfo:nil]; } else { [[NSNotificationCenter defaultCenter] - postNotificationNameAsync:kNSNotificationName_OtherUsersProfileWillChange - object:nil - userInfo:@{ - kNSNotificationKey_ProfileRecipientId : userProfile.recipientId, - }]; + postNotificationNameAsync:kNSNotificationName_OtherUsersProfileWillChange + object:nil + userInfo:@{ + kNSNotificationKey_ProfileRecipientId : userProfile.recipientId, + }]; [[NSNotificationCenter defaultCenter] - postNotificationNameAsync:kNSNotificationName_OtherUsersProfileDidChange - object:nil - userInfo:@{ - kNSNotificationKey_ProfileRecipientId : userProfile.recipientId, - }]; + postNotificationNameAsync:kNSNotificationName_OtherUsersProfileDidChange + object:nil + userInfo:@{ + kNSNotificationKey_ProfileRecipientId : userProfile.recipientId, + }]; } }); }); @@ -683,7 +688,7 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData *_Nullable encryptedPaddedName = [self encryptProfileNameWithUnpaddedName:localProfileName]; - + TSRequest *request = [OWSRequestBuilder profileNameSetRequestWithEncryptedPaddedName:encryptedPaddedName]; [self.networkManager makeRequest:request success:^(NSURLSessionDataTask *task, id responseObject) { @@ -1298,7 +1303,7 @@ const NSUInteger kOWSProfileManager_MaxAvatarDiameter = 640; if (!encryptedData) { return nil; } - + return [Cryptography decryptAESGCMWithData:encryptedData key:profileKey]; } diff --git a/Signal/src/Profiles/ProfileFetcherJob.swift b/SignalMessaging/profiles/ProfileFetcherJob.swift similarity index 98% rename from Signal/src/Profiles/ProfileFetcherJob.swift rename to SignalMessaging/profiles/ProfileFetcherJob.swift index 219cb1faf..770edae07 100644 --- a/Signal/src/Profiles/ProfileFetcherJob.swift +++ b/SignalMessaging/profiles/ProfileFetcherJob.swift @@ -7,7 +7,7 @@ import PromiseKit import SignalServiceKit @objc -class ProfileFetcherJob: NSObject { +public class ProfileFetcherJob: NSObject { let TAG = "[ProfileFetcherJob]" @@ -132,7 +132,9 @@ class ProfileFetcherJob: NSObject { } } -struct SignalServiceProfile { +// TODO: This was a struct. +@objc +public class SignalServiceProfile: NSObject { let TAG = "[SignalServiceProfile]" enum ValidationError: Error { diff --git a/Signal/src/util/ImageCache.swift b/SignalMessaging/utils/ImageCache.swift similarity index 77% rename from Signal/src/util/ImageCache.swift rename to SignalMessaging/utils/ImageCache.swift index 005ee82bb..ff179aca9 100644 --- a/Signal/src/util/ImageCache.swift +++ b/SignalMessaging/utils/ImageCache.swift @@ -14,11 +14,11 @@ class ImageCacheRecord: NSObject { /** * A two dimensional hash, allowing you to store variations under a single key. - * This is useful because we generate multiple diameters of an image, but when we + * This is useful because we generate multiple diameters of an image, but when we * want to clear out the images for a key we want to clear out *all* variations. */ @objc -class ImageCache: NSObject { +public class ImageCache: NSObject { let backingCache: NSCache @@ -26,14 +26,16 @@ class ImageCache: NSObject { self.backingCache = NSCache() } - func image(forKey key: AnyObject, diameter: CGFloat) -> UIImage? { + @objc + public func image(forKey key: AnyObject, diameter: CGFloat) -> UIImage? { guard let record = backingCache.object(forKey: key) else { return nil } return record.variations[diameter] } - func setImage(_ image: UIImage, forKey key: AnyObject, diameter: CGFloat) { + @objc + public func setImage(_ image: UIImage, forKey key: AnyObject, diameter: CGFloat) { if let existingRecord = backingCache.object(forKey: key) { existingRecord.variations[diameter] = image backingCache.setObject(existingRecord, forKey: key) @@ -43,11 +45,13 @@ class ImageCache: NSObject { } } - func removeAllImages() { + @objc + public func removeAllImages() { backingCache.removeAllObjects() } - func removeAllImages(forKey key: AnyObject) { + @objc + public func removeAllImages(forKey key: AnyObject) { backingCache.removeObject(forKey: key) } } diff --git a/SignalMessaging/utils/OWSFormat.h b/SignalMessaging/utils/OWSFormat.h new file mode 100644 index 000000000..00fce61bf --- /dev/null +++ b/SignalMessaging/utils/OWSFormat.h @@ -0,0 +1,21 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +//#import + +NS_ASSUME_NONNULL_BEGIN + +@interface OWSFormat : NSObject + +- (instancetype)init NS_UNAVAILABLE; + ++ (NSString *)formatInt:(int)value; + ++ (NSString *)formatFileSize:(unsigned long)fileSize; + ++ (NSString *)formatDurationSeconds:(long)timeSeconds; + +@end + +NS_ASSUME_NONNULL_END diff --git a/SignalMessaging/utils/OWSFormat.m b/SignalMessaging/utils/OWSFormat.m new file mode 100644 index 000000000..f3b533337 --- /dev/null +++ b/SignalMessaging/utils/OWSFormat.m @@ -0,0 +1,64 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + +#import "OWSFormat.h" + +//#import "Environment.h" +//#import "HomeViewController.h" +//#import "PhoneNumber.h" +//#import "Signal-Swift.h" +//#import "StringUtil.h" +//#import +//#import + +NS_ASSUME_NONNULL_BEGIN + +@implementation OWSFormat + ++ (NSString *)formatInt:(int)value +{ + static NSNumberFormatter *formatter = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + formatter = [NSNumberFormatter new]; + formatter.numberStyle = NSNumberFormatterNoStyle; + }); + return [formatter stringFromNumber:@(value)]; +} + ++ (NSString *)formatFileSize:(unsigned long)fileSize +{ + const unsigned long kOneKilobyte = 1024; + const unsigned long kOneMegabyte = kOneKilobyte * kOneKilobyte; + + NSNumberFormatter *numberFormatter = [NSNumberFormatter new]; + numberFormatter.numberStyle = NSNumberFormatterDecimalStyle; + + if (fileSize > kOneMegabyte * 10) { + return [[numberFormatter stringFromNumber:@((int)round(fileSize / (CGFloat)kOneMegabyte))] + stringByAppendingString:@" MB"]; + } else if (fileSize > kOneKilobyte * 10) { + return [[numberFormatter stringFromNumber:@((int)round(fileSize / (CGFloat)kOneKilobyte))] + stringByAppendingString:@" KB"]; + } else { + return [NSString stringWithFormat:@"%lu Bytes", fileSize]; + } +} + ++ (NSString *)formatDurationSeconds:(long)timeSeconds +{ + long seconds = timeSeconds % 60; + long minutes = (timeSeconds / 60) % 60; + long hours = timeSeconds / 3600; + + if (hours > 0) { + return [NSString stringWithFormat:@"%ld:%02ld:%02ld", hours, minutes, seconds]; + } else { + return [NSString stringWithFormat:@"%ld:%02ld", minutes, seconds]; + } +} + +@end + +NS_ASSUME_NONNULL_END diff --git a/Signal/src/UserInterface/Strings.swift b/SignalMessaging/views/CommonStrings.swift similarity index 100% rename from Signal/src/UserInterface/Strings.swift rename to SignalMessaging/views/CommonStrings.swift diff --git a/Signal/src/views/OWSAlerts.swift b/SignalMessaging/views/OWSAlerts.swift similarity index 100% rename from Signal/src/views/OWSAlerts.swift rename to SignalMessaging/views/OWSAlerts.swift diff --git a/SignalServiceKit/src/Util/AppContext.h b/SignalServiceKit/src/Util/AppContext.h index 82ad4601c..b31c8d5bb 100755 --- a/SignalServiceKit/src/Util/AppContext.h +++ b/SignalServiceKit/src/Util/AppContext.h @@ -32,6 +32,9 @@ typedef void (^BackgroundTaskExpirationHandler)(void); - (NSArray *)allMigrations; +// Returns the VC that should be used to present alerts, modals, etc. +- (UIViewController *)frontmostViewController; + @end id CurrentAppContext(void); diff --git a/SignalShareExtension/ShareViewController.swift b/SignalShareExtension/ShareViewController.swift index 59d1ed2c3..ccf57b58f 100644 --- a/SignalShareExtension/ShareViewController.swift +++ b/SignalShareExtension/ShareViewController.swift @@ -14,7 +14,7 @@ class ShareViewController: UINavigationController, SAELoadViewDelegate { super.loadView() // This should be the first thing we do. - SetCurrentAppContext(ShareAppExtensionContext()) + SetCurrentAppContext(ShareAppExtensionContext(with:self)) DebugLogger.shared().enableTTYLogging() if _isDebugAssertConfiguration() { diff --git a/SignalShareExtension/utils/ShareAppExtensionContext.h b/SignalShareExtension/utils/ShareAppExtensionContext.h index afe80a7cb..cd9a1a39d 100644 --- a/SignalShareExtension/utils/ShareAppExtensionContext.h +++ b/SignalShareExtension/utils/ShareAppExtensionContext.h @@ -8,6 +8,10 @@ NS_ASSUME_NONNULL_BEGIN @interface ShareAppExtensionContext : NSObject +- (instancetype)init NS_UNAVAILABLE; + +- (instancetype)initWithRootViewController:(UIViewController *)rootViewController; + @end NS_ASSUME_NONNULL_END diff --git a/SignalShareExtension/utils/ShareAppExtensionContext.m b/SignalShareExtension/utils/ShareAppExtensionContext.m index 0060385cd..195d94e30 100644 --- a/SignalShareExtension/utils/ShareAppExtensionContext.m +++ b/SignalShareExtension/utils/ShareAppExtensionContext.m @@ -6,8 +6,33 @@ NS_ASSUME_NONNULL_BEGIN +@interface ShareAppExtensionContext () + +@property (nonatomic) UIViewController *rootViewController; + +@end + +#pragma mark - + @implementation ShareAppExtensionContext +- (instancetype)initWithRootViewController:(UIViewController *)rootViewController +{ + self = [super init]; + + if (!self) { + return self; + } + + OWSAssert(rootViewController); + + _rootViewController = rootViewController; + + OWSSingletonAssert(); + + return self; +} + - (BOOL)isMainApp { return NO; @@ -54,6 +79,21 @@ NS_ASSUME_NONNULL_BEGIN return @[]; } +- (UIViewController *)frontmostViewController +{ + OWSAssert(self.rootViewController); + + return self.rootViewController; +} + +- (void)setRootViewController:(UIViewController *)viewController +{ + OWSAssert(!self.rootViewController); + OWSAssert(viewController); + + self.rootViewController = viewController; +} + @end NS_ASSUME_NONNULL_END