Share a photo from photos app

Shows the conversation picker, and sends the attachment to that
conversation.

There's still a lot TODO

-[ ] resolve JSQ dependency
-[ ] properly wait for app to load
-[ ] dismiss share extension after send is complete
-[ ] support non jpeg file types
-[ ] Fix device sleep manager

// FREEBIE
This commit is contained in:
Michael Kirk 2017-12-04 17:17:44 -05:00
parent f781199e27
commit a58f1f385c
67 changed files with 573 additions and 276 deletions

3
.gitignore vendored
View File

@ -26,5 +26,6 @@ DerivedData
*.hmap
*.ipa
*.xcuserstate
Index/
Pods/
Pods/

View File

@ -17,6 +17,9 @@ def shared_pods
# third party pods
pod 'AFNetworking', inhibit_warnings: true
pod 'JSQMessagesViewController', git: 'https://github.com/WhisperSystems/JSQMessagesViewController.git', branch: 'mkirk/share-compatible', :inhibit_warnings => true
#pod 'JSQMessagesViewController', git: 'https://github.com/WhisperSystems/JSQMessagesViewController.git', branch: 'signal-master', :inhibit_warnings => true
#pod 'JSQMessagesViewController', path: '../JSQMessagesViewController'
pod 'Mantle', :inhibit_warnings => true
pod 'YapDatabase/SQLCipher', '~> 2.9.3', :inhibit_warnings => true
pod 'PureLayout', :inhibit_warnings => true
@ -28,8 +31,6 @@ end
target 'Signal' do
shared_pods
pod 'ATAppUpdater', :inhibit_warnings => true
pod 'JSQMessagesViewController', git: 'https://github.com/WhisperSystems/JSQMessagesViewController.git', branch: 'signal-master', :inhibit_warnings => true
#pod 'JSQMessagesViewController', path: '../JSQMessagesViewController'
target 'SignalTests' do
inherit! :search_paths

View File

@ -121,7 +121,7 @@ DEPENDENCIES:
- Curve25519Kit (from `https://github.com/WhisperSystems/Curve25519Kit`, branch `mkirk/framework-friendly`)
- GRKOpenSSLFramework (from `https://github.com/WhisperSystems/GRKOpenSSLFramework`)
- HKDFKit (from `https://github.com/WhisperSystems/HKDFKit.git`, branch `mkirk/framework-friendly`)
- JSQMessagesViewController (from `https://github.com/WhisperSystems/JSQMessagesViewController.git`, branch `signal-master`)
- JSQMessagesViewController (from `https://github.com/WhisperSystems/JSQMessagesViewController.git`, branch `mkirk/share-compatible`)
- Mantle
- PureLayout
- Reachability
@ -143,7 +143,7 @@ EXTERNAL SOURCES:
:branch: mkirk/framework-friendly
:git: https://github.com/WhisperSystems/HKDFKit.git
JSQMessagesViewController:
:branch: signal-master
:branch: mkirk/share-compatible
:git: https://github.com/WhisperSystems/JSQMessagesViewController.git
SignalServiceKit:
:path: .
@ -164,7 +164,7 @@ CHECKOUT OPTIONS:
:commit: d2e2e50990e88537d6c4e38cc32a6f6debd83446
:git: https://github.com/WhisperSystems/HKDFKit.git
JSQMessagesViewController:
:commit: 7d9e7562c67f3c7c71962bf9fe15c1695333c92f
:commit: 33dd72b7bac85fc54a87fb8016c9a927af222153
:git: https://github.com/WhisperSystems/JSQMessagesViewController.git
SocketRocket:
:commit: 28035e1a98a427853e4038ff1b70479fa8374cfa
@ -186,7 +186,7 @@ SPEC CHECKSUMS:
PureLayout: 4d550abe49a94f24c2808b9b95db9131685fe4cd
Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
SignalServiceKit: e1fa31c513e47afcb02c9c540d2931fd24d86311
SignalServiceKit: eacb357b55f76e5475662c801038371f37d7b02d
SocketRocket: dbb1554b8fc288ef8ef370d6285aeca7361be31e
SQLCipher: 43d12c0eb9c57fb438749618fc3ce0065509a559
TwistedOakCollapsingFutures: f359b90f203e9ab13dfb92c9ff41842a7fe1cd0c
@ -194,6 +194,6 @@ SPEC CHECKSUMS:
YapDatabase: cd911121580ff16675f65ad742a9eb0ab4d9e266
YYImage: 1e1b62a9997399593e4b9c4ecfbbabbf1d3f3b54
PODFILE CHECKSUM: 5e9411d9fb24e9b9b4759d5fb2b0a539a9bc8695
PODFILE CHECKSUM: 95e805068c7c37952aa91bb1cf4334a87030aa45
COCOAPODS: 1.3.1

View File

@ -8,11 +8,7 @@
/* Begin PBXBuildFile section */
2AE2882E4C2B96BFFF9EE27C /* Pods_SignalShareExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0F94C85CB0B235DA37F68ED0 /* Pods_SignalShareExtension.framework */; };
3400C7931EAF89CD008A8584 /* SendExternalFileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400C7911EAF89CD008A8584 /* SendExternalFileViewController.m */; };
3400C7961EAF99F4008A8584 /* SelectThreadViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400C7951EAF99F4008A8584 /* SelectThreadViewController.m */; };
3400C7991EAFB772008A8584 /* ThreadViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400C7981EAFB772008A8584 /* ThreadViewHelper.m */; };
340B02BA1FA0D6C700F9CFEC /* ConversationViewItemTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 340B02B91FA0D6C700F9CFEC /* ConversationViewItemTest.m */; };
340CB2241EAC155C0001CAA1 /* ContactsViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 340CB2231EAC155C0001CAA1 /* ContactsViewHelper.m */; };
340CB2271EAC25820001CAA1 /* UpdateGroupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 340CB2261EAC25820001CAA1 /* UpdateGroupViewController.m */; };
341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */ = {isa = PBXBuildFile; fileRef = 341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */; };
3430FE181F7751D4000EC51B /* GiphyAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3430FE171F7751D4000EC51B /* GiphyAPI.swift */; };
@ -22,7 +18,6 @@
34330AA31E79686200DF2FB9 /* OWSProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 34330AA21E79686200DF2FB9 /* OWSProgressView.m */; };
343A65951FC47D5E000477A1 /* DebugUISyncMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 343A65941FC47D5E000477A1 /* DebugUISyncMessages.m */; };
343A65981FC4CFE7000477A1 /* ConversationScrollButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 343A65961FC4CFE6000477A1 /* ConversationScrollButton.m */; };
343D3D9B1E9283F100165CA4 /* BlockListUIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 343D3D9A1E9283F100165CA4 /* BlockListUIUtils.m */; };
34480B361FD0929200BC14EF /* ShareAppExtensionContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 34480B351FD0929200BC14EF /* ShareAppExtensionContext.m */; };
34480B491FD0A60200BC14EF /* OWSMath.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B481FD0A60200BC14EF /* OWSMath.h */; settings = {ATTRIBUTES = (Public, ); }; };
34480B521FD0A7A400BC14EF /* OWSLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B4A1FD0A7A200BC14EF /* OWSLogger.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -32,13 +27,12 @@
34480B571FD0A7A400BC14EF /* OWSScrubbingLogFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B4F1FD0A7A300BC14EF /* OWSScrubbingLogFormatter.h */; };
34480B591FD0A7A400BC14EF /* OWSScrubbingLogFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 34480B511FD0A7A400BC14EF /* OWSScrubbingLogFormatter.m */; };
34480B5B1FD0A7E300BC14EF /* SignalMessaging-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 34480B5A1FD0A7E300BC14EF /* SignalMessaging-Prefix.pch */; };
34480B611FD0A98800BC14EF /* UIColor+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B5D1FD0A98800BC14EF /* UIColor+OWS.h */; };
34480B611FD0A98800BC14EF /* UIColor+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B5D1FD0A98800BC14EF /* UIColor+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
34480B621FD0A98800BC14EF /* UIColor+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 34480B5E1FD0A98800BC14EF /* UIColor+OWS.m */; };
34480B631FD0A98800BC14EF /* UIView+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B5F1FD0A98800BC14EF /* UIView+OWS.h */; };
34480B631FD0A98800BC14EF /* UIView+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B5F1FD0A98800BC14EF /* UIView+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
34480B641FD0A98800BC14EF /* UIView+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 34480B601FD0A98800BC14EF /* UIView+OWS.m */; };
34480B671FD0AA9400BC14EF /* UIFont+OWS.m in Sources */ = {isa = PBXBuildFile; fileRef = 34480B651FD0AA9400BC14EF /* UIFont+OWS.m */; };
34480B681FD0AA9400BC14EF /* UIFont+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B661FD0AA9400BC14EF /* UIFont+OWS.h */; };
34533F181EA8D2070006114F /* OWSAudioAttachmentPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34533F171EA8D2070006114F /* OWSAudioAttachmentPlayer.m */; };
34480B681FD0AA9400BC14EF /* UIFont+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 34480B661FD0AA9400BC14EF /* UIFont+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
3461284B1FD0B94000532771 /* SAELoadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3461284A1FD0B93F00532771 /* SAELoadViewController.swift */; };
346129341FD1A88700532771 /* OWSSwiftUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 346129331FD1A88700532771 /* OWSSwiftUtils.swift */; };
346129391FD1B47300532771 /* OWSPreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129371FD1B47200532771 /* OWSPreferences.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -58,7 +52,7 @@
346129961FD1E30000532771 /* OWSDatabaseMigration.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129941FD1E30000532771 /* OWSDatabaseMigration.m */; };
346129991FD1E4DA00532771 /* SignalApp.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129971FD1E4D900532771 /* SignalApp.m */; };
3461299C1FD1EA9E00532771 /* NotificationsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3461299B1FD1EA9E00532771 /* NotificationsManager.m */; };
346129A51FD1F09100532771 /* OWSContactsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129A21FD1F09100532771 /* OWSContactsManager.h */; };
346129A51FD1F09100532771 /* OWSContactsManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129A21FD1F09100532771 /* OWSContactsManager.h */; settings = {ATTRIBUTES = (Public, ); }; };
346129A61FD1F09100532771 /* OWSContactsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129A31FD1F09100532771 /* OWSContactsManager.m */; };
346129A91FD1F0E000532771 /* OWSFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129A81FD1F0DF00532771 /* OWSFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
346129AB1FD1F0EE00532771 /* OWSFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129AA1FD1F0EE00532771 /* OWSFormat.m */; };
@ -67,11 +61,10 @@
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 */; settings = {ATTRIBUTES = (Public, ); }; };
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 */; };
346129CA1FD2072E00532771 /* UIImage+OWS.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129C31FD2072D00532771 /* UIImage+OWS.h */; settings = {ATTRIBUTES = (Public, ); }; };
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 */; };
@ -151,21 +144,16 @@
34B3F8931E8DF1710035BE1A /* SignalsNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F86E1E8DF1700035BE1A /* SignalsNavigationController.m */; };
34B3F8941E8DF1710035BE1A /* HomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F8701E8DF1700035BE1A /* HomeViewController.m */; };
34B3F89C1E8DF3270035BE1A /* BlockListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F89B1E8DF3270035BE1A /* BlockListViewController.m */; };
34B3F89F1E8DF5490035BE1A /* OWSTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F89E1E8DF5490035BE1A /* OWSTableViewController.m */; };
34B3F8A21E8EA6040035BE1A /* ViewControllerUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F8A11E8EA6040035BE1A /* ViewControllerUtils.m */; };
34BECE2B1F74C12700D7438D /* DebugUIStress.m in Sources */ = {isa = PBXBuildFile; fileRef = 34BECE2A1F74C12700D7438D /* DebugUIStress.m */; };
34BECE2E1F7ABCE000D7438D /* GifPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BECE2D1F7ABCE000D7438D /* GifPickerViewController.swift */; };
34BECE301F7ABCF800D7438D /* GifPickerLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34BECE2F1F7ABCF800D7438D /* GifPickerLayout.swift */; };
34C04D801F6195E6004308B3 /* OWSFlatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C04D7F1F6195E6004308B3 /* OWSFlatButton.swift */; };
34C42D5B1F45F7A80072EC04 /* OWSNavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C42D5A1F45F7A80072EC04 /* OWSNavigationController.m */; };
34C42D661F4734ED0072EC04 /* OWSContactOffersInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C42D631F4734ED0072EC04 /* OWSContactOffersInteraction.m */; };
34C42D671F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C42D651F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m */; };
34C6B0A91FA0E46F00D35993 /* test-gif.gif in Resources */ = {isa = PBXBuildFile; fileRef = 34C6B0A51FA0E46F00D35993 /* test-gif.gif */; };
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 */; };
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 */; };
34CCAF3B1F0C2748004084F4 /* OWSAddToContactViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CCAF3A1F0C2748004084F4 /* OWSAddToContactViewController.m */; };
34CE88E71F2FB9A10098030F /* ProfileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34CE88E61F2FB9A10098030F /* ProfileViewController.m */; };
@ -193,9 +181,7 @@
34D8C0271ED3673300188D7C /* DebugUIMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D8C0241ED3673300188D7C /* DebugUIMessages.m */; };
34D8C0281ED3673300188D7C /* DebugUITableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D8C0261ED3673300188D7C /* DebugUITableViewController.m */; };
34D8C02B1ED3685800188D7C /* DebugUIContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D8C02A1ED3685800188D7C /* DebugUIContacts.m */; };
34D9134B1F62D4A500722898 /* SignalAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D913491F62D4A500722898 /* SignalAttachment.swift */; };
34D9134D1F66DB7C00722898 /* ModalActivityIndicatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9134C1F66DB7C00722898 /* ModalActivityIndicatorViewController.swift */; };
34D99C8C1F27B13B00D284D6 /* OWSViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D99C8B1F27B13B00D284D6 /* OWSViewController.m */; };
34D99C931F2937CC00D284D6 /* OWSAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D99C911F2937CC00D284D6 /* OWSAnalytics.swift */; };
34DFCB851E8E04B500053165 /* AddToBlockListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34DFCB841E8E04B500053165 /* AddToBlockListViewController.m */; };
34E3E5681EC4B19400495BAC /* AudioProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34E3E5671EC4B19400495BAC /* AudioProgressView.swift */; };
@ -212,8 +198,42 @@
451686AB1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451686AA1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift */; };
4517642A1DE939FD00EDB8B9 /* ContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 451764281DE939FD00EDB8B9 /* ContactCell.xib */; };
4517642B1DE939FD00EDB8B9 /* ContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451764291DE939FD00EDB8B9 /* ContactCell.swift */; };
45194F8F1FD71FF500333B2C /* ThreadUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 346129BE1FD2068600532771 /* ThreadUtil.m */; };
45194F901FD7200000333B2C /* ThreadUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = 346129BD1FD2068600532771 /* ThreadUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
45194F921FD7215600333B2C /* OWSContactOffersInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = 34C42D621F4734ED0072EC04 /* OWSContactOffersInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; };
45194F931FD7215C00333B2C /* OWSContactOffersInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C42D631F4734ED0072EC04 /* OWSContactOffersInteraction.m */; };
45194F941FD7216000333B2C /* TSUnreadIndicatorInteraction.h in Headers */ = {isa = PBXBuildFile; fileRef = 34C42D641F4734ED0072EC04 /* TSUnreadIndicatorInteraction.h */; settings = {ATTRIBUTES = (Public, ); }; };
45194F951FD7216600333B2C /* TSUnreadIndicatorInteraction.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C42D651F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m */; };
45194F961FD7226300333B2C /* SelectThreadViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3400C7941EAF99F4008A8584 /* SelectThreadViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
45194F9B1FD7327600333B2C /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 45194F9A1FD7327600333B2C /* Media.xcassets */; };
451A13B11E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451A13B01E13DED2000A50FD /* CallNotificationsAdapter.swift */; };
451DE9FD1DC1A28200810E42 /* SyncPushTokensJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451DE9FC1DC1A28200810E42 /* SyncPushTokensJob.swift */; };
451DE9FE1DC1A28200810E42 /* SyncPushTokensJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451DE9FC1DC1A28200810E42 /* SyncPushTokensJob.swift */; };
451F8A311FD70DE9005CB9DA /* SendExternalFileViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400C7911EAF89CD008A8584 /* SendExternalFileViewController.m */; };
451F8A321FD70DFA005CB9DA /* SendExternalFileViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3400C7901EAF89CD008A8584 /* SendExternalFileViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A331FD71083005CB9DA /* SelectThreadViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400C7951EAF99F4008A8584 /* SelectThreadViewController.m */; };
451F8A341FD710C3005CB9DA /* ConversationSearcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 451777C71FD61554001225FF /* ConversationSearcher.swift */; };
451F8A351FD710DE005CB9DA /* Searcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45360B8C1F9521F800FA666C /* Searcher.swift */; };
451F8A371FD71179005CB9DA /* OWSViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 34D99C8A1F27B13B00D284D6 /* OWSViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A381FD7117E005CB9DA /* OWSViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34D99C8B1F27B13B00D284D6 /* OWSViewController.m */; };
451F8A391FD711D6005CB9DA /* ContactsViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 340CB2231EAC155C0001CAA1 /* ContactsViewHelper.m */; };
451F8A3A1FD711D9005CB9DA /* ContactsViewHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 340CB2221EAC155C0001CAA1 /* ContactsViewHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A3B1FD71297005CB9DA /* UIUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B97940261832BD2400BD66CB /* UIUtil.m */; };
451F8A3C1FD71392005CB9DA /* UIUtil.h in Headers */ = {isa = PBXBuildFile; fileRef = B97940251832BD2400BD66CB /* UIUtil.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A3D1FD713CA005CB9DA /* ThreadViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 3400C7981EAFB772008A8584 /* ThreadViewHelper.m */; };
451F8A3E1FD713D2005CB9DA /* ThreadViewHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 3400C7971EAFB772008A8584 /* ThreadViewHelper.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A3F1FD71455005CB9DA /* OWSTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 34B3F89E1E8DF5490035BE1A /* OWSTableViewController.m */; };
451F8A401FD7145D005CB9DA /* OWSTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 34B3F89D1E8DF5490035BE1A /* OWSTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A411FD714B8005CB9DA /* ContactTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB052F18170B33006006FC /* ContactTableViewCell.m */; };
451F8A421FD714C7005CB9DA /* ContactTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 76EB052E18170B33006006FC /* ContactTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A431FD714FE005CB9DA /* AvatarImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F3AEB51DFDE7900080CE33 /* AvatarImageView.swift */; };
451F8A441FD7156B005CB9DA /* BlockListUIUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 343D3D9A1E9283F100165CA4 /* BlockListUIUtils.m */; };
451F8A451FD71570005CB9DA /* BlockListUIUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 343D3D991E9283F100165CA4 /* BlockListUIUtils.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A461FD715BA005CB9DA /* OWSGroupAvatarBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 45666EC81D994C0D008FE134 /* OWSGroupAvatarBuilder.m */; };
451F8A471FD715BA005CB9DA /* OWSAvatarBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 45666EC51D99483D008FE134 /* OWSAvatarBuilder.m */; };
451F8A481FD715BA005CB9DA /* OWSContactAvatarBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 45855F361D9498A40084F340 /* OWSContactAvatarBuilder.m */; };
451F8A491FD715CF005CB9DA /* OWSAvatarBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 45666EC41D99483D008FE134 /* OWSAvatarBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A4A1FD715D9005CB9DA /* OWSContactAvatarBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 45855F351D9498A40084F340 /* OWSContactAvatarBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
451F8A4B1FD715E1005CB9DA /* OWSGroupAvatarBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 45666EC71D994C0D008FE134 /* OWSGroupAvatarBuilder.h */; settings = {ATTRIBUTES = (Public, ); }; };
452037D11EE84975004E4CDF /* DebugUISessionState.m in Sources */ = {isa = PBXBuildFile; fileRef = 452037D01EE84975004E4CDF /* DebugUISessionState.m */; };
4520D8D51D417D8E00123472 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4520D8D41D417D8E00123472 /* Photos.framework */; };
4521C3C01F59F3BA00B4C582 /* TextFieldHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4521C3BF1F59F3BA00B4C582 /* TextFieldHelper.swift */; };
@ -233,16 +253,21 @@
453518A21FC63E2900210559 /* SignalMessaging.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 453518921FC63DBF00210559 /* SignalMessaging.framework */; };
45360B8D1F9521F800FA666C /* Searcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45360B8C1F9521F800FA666C /* Searcher.swift */; };
45360B901F9527DA00FA666C /* SearcherTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45360B8F1F9527DA00FA666C /* SearcherTest.swift */; };
45360B911F952AA900FA666C /* MarqueeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E5A6981F61E6DD001E4A8A /* MarqueeLabel.swift */; };
4539B5861F79348F007141FF /* PushRegistrationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4539B5851F79348F007141FF /* PushRegistrationManager.swift */; };
45464DBC1DFA041F001D3FD6 /* DataChannelMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45464DBB1DFA041F001D3FD6 /* DataChannelMessage.swift */; };
454A965A1FD6017E008D2A0E /* SignalAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D913491F62D4A500722898 /* SignalAttachment.swift */; };
454A965B1FD601BF008D2A0E /* MediaMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CA1C281F7164F700E51C51 /* MediaMessageView.swift */; };
454A965D1FD602B1008D2A0E /* OWSAudioAttachmentPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 34533F161EA8D2070006114F /* OWSAudioAttachmentPlayer.h */; settings = {ATTRIBUTES = (Public, ); }; };
454A965F1FD60EA3008D2A0E /* OWSFlatButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 454A965E1FD60EA2008D2A0E /* OWSFlatButton.swift */; };
454A96601FD61165008D2A0E /* OWSAudioAttachmentPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 34533F171EA8D2070006114F /* OWSAudioAttachmentPlayer.m */; };
454EBAB41F2BE14C00ACE0BB /* OWSAnalytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D99C911F2937CC00D284D6 /* OWSAnalytics.swift */; };
4556FA681F54AA9500AF40DD /* 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, ); }; };
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 */; };
45666EC61D99483D008FE134 /* OWSAvatarBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 45666EC51D99483D008FE134 /* OWSAvatarBuilder.m */; };
45666EC91D994C0D008FE134 /* OWSGroupAvatarBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 45666EC81D994C0D008FE134 /* OWSGroupAvatarBuilder.m */; };
45666F581D9B2880008FE134 /* OWSScrubbingLogFormatterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 45666F571D9B2880008FE134 /* OWSScrubbingLogFormatterTest.m */; };
456C38961DC7B882007536A7 /* PromiseKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 451DE9F11DC1585F00810E42 /* PromiseKit.framework */; };
456F6E2F1E261D1000FD2210 /* PeerConnectionClientTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 456F6E2E1E261D1000FD2210 /* PeerConnectionClientTest.swift */; };
@ -250,17 +275,8 @@
4579431E1E7C8CE9008ED0C0 /* Pastelog.m in Sources */ = {isa = PBXBuildFile; fileRef = 4579431D1E7C8CE9008ED0C0 /* Pastelog.m */; };
45794E861E00620000066731 /* CallUIAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45794E851E00620000066731 /* CallUIAdapter.swift */; };
45847E871E4283C30080EAB3 /* Intents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45847E861E4283C30080EAB3 /* Intents.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
45855F371D9498A40084F340 /* OWSContactAvatarBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 45855F361D9498A40084F340 /* OWSContactAvatarBuilder.m */; };
4585C4681ED8F8D200896AEA /* SafetyNumberConfirmationAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4585C4671ED8F8D200896AEA /* SafetyNumberConfirmationAlert.swift */; };
458967111DC117CC00E9DD21 /* AccountManagerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 458967101DC117CC00E9DD21 /* AccountManagerTest.swift */; };
458D51481FCCD82500B5BC53 /* GSR4.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51401FCCD82400B5BC53 /* GSR4.crt */; };
458D51491FCCD82500B5BC53 /* GTSR3.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51411FCCD82400B5BC53 /* GTSR3.crt */; };
458D514A1FCCD82500B5BC53 /* GIAG2.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51421FCCD82400B5BC53 /* GIAG2.crt */; };
458D514B1FCCD82500B5BC53 /* GSR2.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51431FCCD82500B5BC53 /* GSR2.crt */; };
458D514C1FCCD82500B5BC53 /* GTSR1.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51441FCCD82500B5BC53 /* GTSR1.crt */; };
458D514D1FCCD82500B5BC53 /* textsecure.cer in Resources */ = {isa = PBXBuildFile; fileRef = 458D51451FCCD82500B5BC53 /* textsecure.cer */; };
458D514E1FCCD82500B5BC53 /* GTSR2.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51461FCCD82500B5BC53 /* GTSR2.crt */; };
458D514F1FCCD82500B5BC53 /* GTSR4.crt in Resources */ = {isa = PBXBuildFile; fileRef = 458D51471FCCD82500B5BC53 /* GTSR4.crt */; };
458DE9D61DEE3FD00071BB03 /* PeerConnectionClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 458DE9D51DEE3FD00071BB03 /* PeerConnectionClient.swift */; };
458DE9D91DEE7B360071BB03 /* OWSWebRTCDataProtos.pb.m in Sources */ = {isa = PBXBuildFile; fileRef = 458DE9D81DEE7B360071BB03 /* OWSWebRTCDataProtos.pb.m */; };
458E38371D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 458E38361D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m */; };
@ -269,7 +285,6 @@
45A663C51F92EC760027B59E /* GroupTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A663C41F92EC760027B59E /* GroupTableViewCell.swift */; };
45A6DAD61EBBF85500893231 /* ReminderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45A6DAD51EBBF85500893231 /* ReminderView.swift */; };
45AE48511E0732D6004D96C2 /* TurnServerInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45AE48501E0732D6004D96C2 /* TurnServerInfo.swift */; };
45B72DDA1FD5E70600151AF6 /* ConversationSearcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B72DD91FD5E70600151AF6 /* ConversationSearcher.swift */; };
45BB93381E688E14001E3939 /* UIDevice+featureSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45BB93371E688E14001E3939 /* UIDevice+featureSupport.swift */; };
45BD60821DE9547E00A8F436 /* Contacts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45BD60811DE9547E00A8F436 /* Contacts.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
45C0DC1B1E68FE9000E04C47 /* UIApplication+OWS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45C0DC1A1E68FE9000E04C47 /* UIApplication+OWS.swift */; };
@ -285,7 +300,6 @@
45F170AC1E2F0351003FC1F2 /* CallAudioSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F170AB1E2F0351003FC1F2 /* CallAudioSession.swift */; };
45F170BB1E2FC5D3003FC1F2 /* CallAudioService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F170BA1E2FC5D3003FC1F2 /* CallAudioService.swift */; };
45F170D61E315310003FC1F2 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F170D51E315310003FC1F2 /* Weak.swift */; };
45F3AEB61DFDE7900080CE33 /* AvatarImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F3AEB51DFDE7900080CE33 /* AvatarImageView.swift */; };
45F659731E1BD99C00444429 /* CallKitCallUIAdaptee.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F659721E1BD99C00444429 /* CallKitCallUIAdaptee.swift */; };
45F659821E1BE77000444429 /* NonCallKitCallUIAdaptee.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F659811E1BE77000444429 /* NonCallKitCallUIAdaptee.swift */; };
45FBC5C81DF8575700E9B410 /* CallKitCallManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FBC59A1DF8575700E9B410 /* CallKitCallManager.swift */; };
@ -297,7 +311,6 @@
76EB054018170B33006006FC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB03C318170B33006006FC /* AppDelegate.m */; };
76EB063A18170B33006006FC /* FunctionalUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04EB18170B33006006FC /* FunctionalUtil.m */; };
76EB063C18170B33006006FC /* NumberUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB04ED18170B33006006FC /* NumberUtil.m */; };
76EB068618170B34006006FC /* ContactTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 76EB052F18170B33006006FC /* ContactTableViewCell.m */; };
954AEE6A1DF33E01002E5410 /* ContactsPickerTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954AEE681DF33D32002E5410 /* ContactsPickerTest.swift */; };
A10FDF79184FB4BB007FF963 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C87F18181EFCE600C4ACAB /* MediaPlayer.framework */; };
A11CD70D17FA230600A2D1B1 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A11CD70C17FA230600A2D1B1 /* QuartzCore.framework */; };
@ -340,6 +353,12 @@
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 */; };
B660F7561C29988E00687D6E /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; };
B660F7721C29988E00687D6E /* AppStoreRating.m in Sources */ = {isa = PBXBuildFile; fileRef = B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.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 */; };
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 */; };
B69CD25119773E79005CE69A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B69CD25019773E79005CE69A /* XCTest.framework */; };
@ -349,7 +368,6 @@
B6F509971AA53F760068F56A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6F509951AA53F760068F56A /* Localizable.strings */; };
B6FE7EB71ADD62FA00A6D22F /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */; };
B90418E6183E9DD40038554A /* DateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B90418E5183E9DD40038554A /* DateUtil.m */; };
B97940271832BD2400BD66CB /* UIUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B97940261832BD2400BD66CB /* UIUtil.m */; };
B9EB5ABD1884C002007CBB57 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B9EB5ABC1884C002007CBB57 /* MessageUI.framework */; };
BFF3FB9730634F37D25903F4 /* Pods_Signal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D17BB5C25D615AB49813100C /* Pods_Signal.framework */; };
CC875800737563D6891B741D /* Pods_SignalTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 748A5CAEDD7C919FC64C6807 /* Pods_SignalTests.framework */; };
@ -629,7 +647,6 @@
34BECE2A1F74C12700D7438D /* DebugUIStress.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugUIStress.m; sourceTree = "<group>"; };
34BECE2D1F7ABCE000D7438D /* GifPickerViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GifPickerViewController.swift; sourceTree = "<group>"; };
34BECE2F1F7ABCF800D7438D /* GifPickerLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GifPickerLayout.swift; sourceTree = "<group>"; };
34C04D7F1F6195E6004308B3 /* OWSFlatButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OWSFlatButton.swift; sourceTree = "<group>"; };
34C42D591F45F7A80072EC04 /* OWSNavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSNavigationController.h; sourceTree = "<group>"; };
34C42D5A1F45F7A80072EC04 /* OWSNavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSNavigationController.m; sourceTree = "<group>"; };
34C42D621F4734ED0072EC04 /* OWSContactOffersInteraction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSContactOffersInteraction.h; sourceTree = "<group>"; };
@ -723,6 +740,8 @@
451686AA1F520CDA00AC3D4B /* MultiDeviceProfileKeyUpdateJob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MultiDeviceProfileKeyUpdateJob.swift; sourceTree = "<group>"; };
451764281DE939FD00EDB8B9 /* ContactCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ContactCell.xib; sourceTree = "<group>"; };
451764291DE939FD00EDB8B9 /* ContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactCell.swift; sourceTree = "<group>"; };
451777C71FD61554001225FF /* ConversationSearcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConversationSearcher.swift; sourceTree = "<group>"; };
45194F9A1FD7327600333B2C /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = "<group>"; };
451A13B01E13DED2000A50FD /* CallNotificationsAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; name = CallNotificationsAdapter.swift; path = ../UserInterface/Notifications/CallNotificationsAdapter.swift; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
451DE9F11DC1585F00810E42 /* PromiseKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PromiseKit.framework; path = Carthage/Build/iOS/PromiseKit.framework; sourceTree = "<group>"; };
451DE9FC1DC1A28200810E42 /* SyncPushTokensJob.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SyncPushTokensJob.swift; path = Models/SyncPushTokensJob.swift; sourceTree = "<group>"; };
@ -749,6 +768,7 @@
4539B5851F79348F007141FF /* PushRegistrationManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PushRegistrationManager.swift; sourceTree = "<group>"; };
453CC0361D08E1A60040EBA3 /* sn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sn; path = translations/sn.lproj/Localizable.strings; sourceTree = "<group>"; };
45464DBB1DFA041F001D3FD6 /* DataChannelMessage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataChannelMessage.swift; sourceTree = "<group>"; };
454A965E1FD60EA2008D2A0E /* OWSFlatButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = OWSFlatButton.swift; path = SignalMessaging/Views/OWSFlatButton.swift; sourceTree = SOURCE_ROOT; };
454B35071D08EED80026D658 /* mk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = mk; path = translations/mk.lproj/Localizable.strings; sourceTree = "<group>"; };
4556FA671F54AA9500AF40DD /* DebugUIProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugUIProfile.swift; sourceTree = "<group>"; };
455A16DB1F1FEA0000F86704 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
@ -774,14 +794,6 @@
4585C4671ED8F8D200896AEA /* SafetyNumberConfirmationAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SafetyNumberConfirmationAlert.swift; sourceTree = "<group>"; };
4589670F1DC117CC00E9DD21 /* SignalTests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SignalTests-Bridging-Header.h"; sourceTree = "<group>"; };
458967101DC117CC00E9DD21 /* AccountManagerTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = AccountManagerTest.swift; path = Models/AccountManagerTest.swift; sourceTree = "<group>"; };
458D51401FCCD82400B5BC53 /* GSR4.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GSR4.crt; sourceTree = "<group>"; };
458D51411FCCD82400B5BC53 /* GTSR3.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GTSR3.crt; sourceTree = "<group>"; };
458D51421FCCD82400B5BC53 /* GIAG2.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GIAG2.crt; sourceTree = "<group>"; };
458D51431FCCD82500B5BC53 /* GSR2.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GSR2.crt; sourceTree = "<group>"; };
458D51441FCCD82500B5BC53 /* GTSR1.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GTSR1.crt; sourceTree = "<group>"; };
458D51451FCCD82500B5BC53 /* textsecure.cer */ = {isa = PBXFileReference; lastKnownFileType = file; path = textsecure.cer; sourceTree = "<group>"; };
458D51461FCCD82500B5BC53 /* GTSR2.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GTSR2.crt; sourceTree = "<group>"; };
458D51471FCCD82500B5BC53 /* GTSR4.crt */ = {isa = PBXFileReference; lastKnownFileType = file; path = GTSR4.crt; sourceTree = "<group>"; };
458DE9D51DEE3FD00071BB03 /* PeerConnectionClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PeerConnectionClient.swift; sourceTree = "<group>"; };
458DE9D71DEE7B360071BB03 /* OWSWebRTCDataProtos.pb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OWSWebRTCDataProtos.pb.h; sourceTree = "<group>"; };
458DE9D81DEE7B360071BB03 /* OWSWebRTCDataProtos.pb.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OWSWebRTCDataProtos.pb.m; sourceTree = "<group>"; };
@ -796,7 +808,6 @@
45A6DAD51EBBF85500893231 /* ReminderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReminderView.swift; sourceTree = "<group>"; };
45AE48501E0732D6004D96C2 /* TurnServerInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TurnServerInfo.swift; sourceTree = "<group>"; };
45B201741DAECBFD00C461E0 /* Signal-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Signal-Bridging-Header.h"; sourceTree = "<group>"; };
45B72DD91FD5E70600151AF6 /* ConversationSearcher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationSearcher.swift; sourceTree = "<group>"; };
45BB93371E688E14001E3939 /* UIDevice+featureSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIDevice+featureSupport.swift"; sourceTree = "<group>"; };
45BD60811DE9547E00A8F436 /* Contacts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Contacts.framework; path = System/Library/Frameworks/Contacts.framework; sourceTree = SDKROOT; };
45C0DC1A1E68FE9000E04C47 /* UIApplication+OWS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIApplication+OWS.swift"; sourceTree = "<group>"; };
@ -1064,11 +1075,20 @@
34480B471FD0A60200BC14EF /* utils */ = {
isa = PBXGroup;
children = (
343D3D991E9283F100165CA4 /* BlockListUIUtils.h */,
343D3D9A1E9283F100165CA4 /* BlockListUIUtils.m */,
451777C71FD61554001225FF /* ConversationSearcher.swift */,
34480B4D1FD0A7A300BC14EF /* DebugLogger.h */,
34480B4E1FD0A7A300BC14EF /* DebugLogger.m */,
346129AC1FD1F34E00532771 /* ImageCache.swift */,
45666EC41D99483D008FE134 /* OWSAvatarBuilder.h */,
45666EC51D99483D008FE134 /* OWSAvatarBuilder.m */,
45855F351D9498A40084F340 /* OWSContactAvatarBuilder.h */,
45855F361D9498A40084F340 /* OWSContactAvatarBuilder.m */,
346129A81FD1F0DF00532771 /* OWSFormat.h */,
346129AA1FD1F0EE00532771 /* OWSFormat.m */,
45666EC71D994C0D008FE134 /* OWSGroupAvatarBuilder.h */,
45666EC81D994C0D008FE134 /* OWSGroupAvatarBuilder.m */,
34480B4A1FD0A7A200BC14EF /* OWSLogger.h */,
34480B4B1FD0A7A300BC14EF /* OWSLogger.m */,
34480B481FD0A60200BC14EF /* OWSMath.h */,
@ -1078,6 +1098,11 @@
34480B4F1FD0A7A300BC14EF /* OWSScrubbingLogFormatter.h */,
34480B511FD0A7A400BC14EF /* OWSScrubbingLogFormatter.m */,
346129331FD1A88700532771 /* OWSSwiftUtils.swift */,
45360B8C1F9521F800FA666C /* Searcher.swift */,
346129BD1FD2068600532771 /* ThreadUtil.h */,
346129BE1FD2068600532771 /* ThreadUtil.m */,
B97940251832BD2400BD66CB /* UIUtil.h */,
B97940261832BD2400BD66CB /* UIUtil.m */,
346129751FD1E0B500532771 /* WeakTimer.swift */,
);
path = utils;
@ -1172,6 +1197,8 @@
346129A11FD1F09100532771 /* contacts */ = {
isa = PBXGroup;
children = (
3400C7941EAF99F4008A8584 /* SelectThreadViewController.h */,
3400C7951EAF99F4008A8584 /* SelectThreadViewController.m */,
346129A21FD1F09100532771 /* OWSContactsManager.h */,
346129A31FD1F09100532771 /* OWSContactsManager.m */,
34612A041FD7238500532771 /* OWSContactsSyncing.h */,
@ -1194,8 +1221,16 @@
346129CE1FD207F200532771 /* views */ = {
isa = PBXGroup;
children = (
45F3AEB51DFDE7900080CE33 /* AvatarImageView.swift */,
76EB052E18170B33006006FC /* ContactTableViewCell.h */,
76EB052F18170B33006006FC /* ContactTableViewCell.m */,
340CB2221EAC155C0001CAA1 /* ContactsViewHelper.h */,
340CB2231EAC155C0001CAA1 /* ContactsViewHelper.m */,
346129D11FD2085A00532771 /* CommonStrings.swift */,
346129CF1FD207F200532771 /* OWSAlerts.swift */,
454A965E1FD60EA2008D2A0E /* OWSFlatButton.swift */,
3400C7971EAFB772008A8584 /* ThreadViewHelper.h */,
3400C7981EAFB772008A8584 /* ThreadViewHelper.m */,
);
path = views;
sourceTree = "<group>";
@ -1226,8 +1261,6 @@
34B3F83A1E8DF1700035BE1A /* AttachmentSharing.m */,
34D5CCA71EAE3D30005515DB /* AvatarViewHelper.h */,
34D5CCA81EAE3D30005515DB /* AvatarViewHelper.m */,
343D3D991E9283F100165CA4 /* BlockListUIUtils.h */,
343D3D9A1E9283F100165CA4 /* BlockListUIUtils.m */,
34B3F89A1E8DF3270035BE1A /* BlockListViewController.h */,
34B3F89B1E8DF3270035BE1A /* BlockListViewController.m */,
34B3F83B1E8DF1700035BE1A /* CallViewController.swift */,
@ -1235,8 +1268,6 @@
34B3F83D1E8DF1700035BE1A /* CodeVerificationViewController.m */,
34B3F83E1E8DF1700035BE1A /* ContactsPicker.swift */,
34B3F83F1E8DF1700035BE1A /* ContactsPicker.xib */,
340CB2221EAC155C0001CAA1 /* ContactsViewHelper.h */,
340CB2231EAC155C0001CAA1 /* ContactsViewHelper.m */,
3448BFC01EDF0EA7005B2D69 /* ConversationView */,
34B3F8401E8DF1700035BE1A /* CountryCodeViewController.h */,
34B3F8411E8DF1700035BE1A /* CountryCodeViewController.m */,
@ -1257,7 +1288,6 @@
34B3F8491E8DF1700035BE1A /* InboxTableViewCell.h */,
34B3F84A1E8DF1700035BE1A /* InboxTableViewCell.m */,
34B3F84C1E8DF1700035BE1A /* InviteFlow.swift */,
34CA1C281F7164F700E51C51 /* MediaMessageView.swift */,
34CA1C261F7156F300E51C51 /* MessageDetailViewController.swift */,
34D9134C1F66DB7C00722898 /* ModalActivityIndicatorViewController.swift */,
34B3F84F1E8DF1700035BE1A /* NewContactThreadViewController.h */,
@ -1272,8 +1302,6 @@
34B3F8591E8DF1700035BE1A /* NotificationSettingsViewController.m */,
34CCAF391F0C2748004084F4 /* OWSAddToContactViewController.h */,
34CCAF3A1F0C2748004084F4 /* OWSAddToContactViewController.m */,
34533F161EA8D2070006114F /* OWSAudioAttachmentPlayer.h */,
34533F171EA8D2070006114F /* OWSAudioAttachmentPlayer.m */,
34B3F85B1E8DF1700035BE1A /* OWSConversationSettingsViewController.h */,
34B3F85C1E8DF1700035BE1A /* OWSConversationSettingsViewController.m */,
34D5CCAB1EAE7136005515DB /* OWSConversationSettingsViewDelegate.h */,
@ -1287,10 +1315,6 @@
34C42D5A1F45F7A80072EC04 /* OWSNavigationController.m */,
34B3F8621E8DF1700035BE1A /* OWSQRCodeScanningViewController.h */,
34B3F8631E8DF1700035BE1A /* OWSQRCodeScanningViewController.m */,
34B3F89D1E8DF5490035BE1A /* OWSTableViewController.h */,
34B3F89E1E8DF5490035BE1A /* OWSTableViewController.m */,
34D99C8A1F27B13B00D284D6 /* OWSViewController.h */,
34D99C8B1F27B13B00D284D6 /* OWSViewController.m */,
34B3F8641E8DF1700035BE1A /* PrivacySettingsTableViewController.h */,
34B3F8651E8DF1700035BE1A /* PrivacySettingsTableViewController.m */,
34CE88E51F2FB9A10098030F /* ProfileViewController.h */,
@ -1300,16 +1324,10 @@
4585C4671ED8F8D200896AEA /* SafetyNumberConfirmationAlert.swift */,
34D5CCAF1EAE7E7F005515DB /* SelectRecipientViewController.h */,
34D5CCB01EAE7E7F005515DB /* SelectRecipientViewController.m */,
3400C7941EAF99F4008A8584 /* SelectThreadViewController.h */,
3400C7951EAF99F4008A8584 /* SelectThreadViewController.m */,
3400C7901EAF89CD008A8584 /* SendExternalFileViewController.h */,
3400C7911EAF89CD008A8584 /* SendExternalFileViewController.m */,
34B3F86A1E8DF1700035BE1A /* ShowGroupMembersViewController.h */,
34B3F86B1E8DF1700035BE1A /* ShowGroupMembersViewController.m */,
34B3F86D1E8DF1700035BE1A /* SignalsNavigationController.h */,
34B3F86E1E8DF1700035BE1A /* SignalsNavigationController.m */,
3400C7971EAFB772008A8584 /* ThreadViewHelper.h */,
3400C7981EAFB772008A8584 /* ThreadViewHelper.m */,
340CB2251EAC25820001CAA1 /* UpdateGroupViewController.h */,
340CB2261EAC25820001CAA1 /* UpdateGroupViewController.m */,
34D1F0BE1F8EC1760066283D /* Utils */,
@ -1440,6 +1458,36 @@
name = Notifications;
sourceTree = "<group>";
};
45194F911FD7214600333B2C /* Models */ = {
isa = PBXGroup;
children = (
34C42D621F4734ED0072EC04 /* OWSContactOffersInteraction.h */,
34C42D631F4734ED0072EC04 /* OWSContactOffersInteraction.m */,
34C42D641F4734ED0072EC04 /* TSUnreadIndicatorInteraction.h */,
34C42D651F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m */,
);
path = Models;
sourceTree = "<group>";
};
45194F9C1FD7368D00333B2C /* Resources */ = {
isa = PBXGroup;
children = (
45194F9A1FD7327600333B2C /* Media.xcassets */,
);
path = Resources;
sourceTree = "<group>";
};
451F8A361FD7115D005CB9DA /* ViewControllers */ = {
isa = PBXGroup;
children = (
34B3F89D1E8DF5490035BE1A /* OWSTableViewController.h */,
34B3F89E1E8DF5490035BE1A /* OWSTableViewController.m */,
34D99C8A1F27B13B00D284D6 /* OWSViewController.h */,
34D99C8B1F27B13B00D284D6 /* OWSViewController.m */,
);
path = ViewControllers;
sourceTree = "<group>";
};
453518691FC635DD00210559 /* SignalShareExtension */ = {
isa = PBXGroup;
children = (
@ -1461,6 +1509,10 @@
453518931FC63DBF00210559 /* SignalMessaging */ = {
isa = PBXGroup;
children = (
45194F9C1FD7368D00333B2C /* Resources */,
45194F911FD7214600333B2C /* Models */,
451F8A361FD7115D005CB9DA /* ViewControllers */,
454A96571FD600B4008D2A0E /* attachments */,
34480B5C1FD0A98800BC14EF /* categories */,
346129A11FD1F09100532771 /* contacts */,
3461293F1FD1D74B00532771 /* environment */,
@ -1487,6 +1539,19 @@
name = Signaling;
sourceTree = "<group>";
};
454A96571FD600B4008D2A0E /* attachments */ = {
isa = PBXGroup;
children = (
3400C7901EAF89CD008A8584 /* SendExternalFileViewController.h */,
3400C7911EAF89CD008A8584 /* SendExternalFileViewController.m */,
34533F161EA8D2070006114F /* OWSAudioAttachmentPlayer.h */,
34533F171EA8D2070006114F /* OWSAudioAttachmentPlayer.m */,
34D913491F62D4A500722898 /* SignalAttachment.swift */,
34CA1C281F7164F700E51C51 /* MediaMessageView.swift */,
);
path = attachments;
sourceTree = "<group>";
};
45794E841E0061CF00066731 /* UserInterface */ = {
isa = PBXGroup;
children = (
@ -1504,19 +1569,8 @@
children = (
45CD81EE1DC030E7004C9430 /* AccountManager.swift */,
45DF5DF11DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift */,
45666EC41D99483D008FE134 /* OWSAvatarBuilder.h */,
45666EC51D99483D008FE134 /* OWSAvatarBuilder.m */,
45855F351D9498A40084F340 /* OWSContactAvatarBuilder.h */,
45855F361D9498A40084F340 /* OWSContactAvatarBuilder.m */,
34C42D621F4734ED0072EC04 /* OWSContactOffersInteraction.h */,
34C42D631F4734ED0072EC04 /* OWSContactOffersInteraction.m */,
458E38351D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.h */,
458E38361D668EBF0094BD24 /* OWSDeviceProvisioningURLParser.m */,
45666EC71D994C0D008FE134 /* OWSGroupAvatarBuilder.h */,
45666EC81D994C0D008FE134 /* OWSGroupAvatarBuilder.m */,
34D913491F62D4A500722898 /* SignalAttachment.swift */,
34C42D641F4734ED0072EC04 /* TSUnreadIndicatorInteraction.h */,
34C42D651F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m */,
);
path = Models;
sourceTree = "<group>";
@ -1640,8 +1694,8 @@
76EB04C818170B33006006FC /* util */ = {
isa = PBXGroup;
children = (
B6DA6B051B8A2F9A00CA6F98 /* AppStoreRating.h */,
B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.m */,
B6DA6B051B8A2F9A00CA6F98 /* AppStoreRating.h */,
34CCAF361F0C0599004084F4 /* AppUpdateNag.h */,
34CCAF371F0C0599004084F4 /* AppUpdateNag.m */,
B90418E4183E9DD40038554A /* DateUtil.h */,
@ -1658,17 +1712,11 @@
4579431C1E7C8CE9008ED0C0 /* Pastelog.h */,
4579431D1E7C8CE9008ED0C0 /* Pastelog.m */,
450DF2041E0D74AC003D14BE /* Platform.swift */,
45360B8C1F9521F800FA666C /* Searcher.swift */,
4521C3BF1F59F3BA00B4C582 /* TextFieldHelper.swift */,
346129BD1FD2068600532771 /* ThreadUtil.h */,
346129BE1FD2068600532771 /* ThreadUtil.m */,
FCFA64B11A24F29E0007FB87 /* UI Categories */,
FCC81A961A44558300DFEC7D /* UIDevice+TSHardwareVersion.h */,
FCC81A971A44558300DFEC7D /* UIDevice+TSHardwareVersion.m */,
B97940251832BD2400BD66CB /* UIUtil.h */,
B97940261832BD2400BD66CB /* UIUtil.m */,
45F170D51E315310003FC1F2 /* Weak.swift */,
45B72DD91FD5E70600151AF6 /* ConversationSearcher.swift */,
);
path = util;
sourceTree = "<group>";
@ -1679,17 +1727,13 @@
45E5A6981F61E6DD001E4A8A /* MarqueeLabel.swift */,
452EA09D1EA7ABE00078744B /* AttachmentPointerView.swift */,
34E3E5671EC4B19400495BAC /* AudioProgressView.swift */,
45F3AEB51DFDE7900080CE33 /* AvatarImageView.swift */,
451764291DE939FD00EDB8B9 /* ContactCell.swift */,
45A663C41F92EC760027B59E /* GroupTableViewCell.swift */,
451764281DE939FD00EDB8B9 /* ContactCell.xib */,
76EB052E18170B33006006FC /* ContactTableViewCell.h */,
76EB052F18170B33006006FC /* ContactTableViewCell.m */,
34F308A01ECB469700BB7697 /* OWSBezierPathView.h */,
34F308A11ECB469700BB7697 /* OWSBezierPathView.m */,
459311FA1D75C948008DD4F0 /* OWSDeviceTableViewCell.h */,
459311FB1D75C948008DD4F0 /* OWSDeviceTableViewCell.m */,
34C04D7F1F6195E6004308B3 /* OWSFlatButton.swift */,
34330AA11E79686200DF2FB9 /* OWSProgressView.h */,
34330AA21E79686200DF2FB9 /* OWSProgressView.m */,
45A6DAD51EBBF85500893231 /* ReminderView.swift */,
@ -1836,21 +1880,6 @@
name = Translations;
sourceTree = "<group>";
};
B6C6AE521A305ED1006BAF8F /* Certificates */ = {
isa = PBXGroup;
children = (
458D51421FCCD82400B5BC53 /* GIAG2.crt */,
458D51431FCCD82500B5BC53 /* GSR2.crt */,
458D51401FCCD82400B5BC53 /* GSR4.crt */,
458D51441FCCD82500B5BC53 /* GTSR1.crt */,
458D51461FCCD82500B5BC53 /* GTSR2.crt */,
458D51411FCCD82400B5BC53 /* GTSR3.crt */,
458D51471FCCD82500B5BC53 /* GTSR4.crt */,
458D51451FCCD82500B5BC53 /* textsecure.cer */,
);
path = Certificates;
sourceTree = "<group>";
};
D221A07E169C9E5E00537ABF = {
isa = PBXGroup;
children = (
@ -1935,7 +1964,6 @@
D221A094169C9E5E00537ABF /* Supporting Files */ = {
isa = PBXGroup;
children = (
B6C6AE521A305ED1006BAF8F /* Certificates */,
B6B6C3C419193F5B00C0B76B /* Translations */,
E18AB40618A05754001A532A /* AudioFiles */,
D221A099169C9E5E00537ABF /* main.m */,
@ -1979,6 +2007,7 @@
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
451F8A3A1FD711D9005CB9DA /* ContactsViewHelper.h in Headers */,
34480B491FD0A60200BC14EF /* OWSMath.h in Headers */,
346129E71FD5C0C600532771 /* OWSDatabaseMigrationRunner.h in Headers */,
34480B521FD0A7A400BC14EF /* OWSLogger.h in Headers */,
@ -1990,12 +2019,17 @@
346129711FD1D74C00532771 /* SignalKeyingStorage.h in Headers */,
34612A011FD5F31400532771 /* OWS104CreateRecipientIdentities.h in Headers */,
346129C71FD2072E00532771 /* NSString+OWS.h in Headers */,
451F8A3C1FD71392005CB9DA /* UIUtil.h in Headers */,
346129D61FD20ADC00532771 /* UIViewController+OWS.h in Headers */,
451F8A401FD7145D005CB9DA /* OWSTableViewController.h in Headers */,
451F8A321FD70DFA005CB9DA /* SendExternalFileViewController.h in Headers */,
3461296F1FD1D74C00532771 /* Release.h in Headers */,
34612A061FD7238600532771 /* OWSContactsSyncing.h in Headers */,
34480B571FD0A7A400BC14EF /* OWSScrubbingLogFormatter.h in Headers */,
346129FC1FD5F31400532771 /* OWS101ExistingUsersBlockOnIdentityChange.h in Headers */,
451F8A491FD715CF005CB9DA /* OWSAvatarBuilder.h in Headers */,
346129951FD1E30000532771 /* OWSDatabaseMigration.h in Headers */,
45194F961FD7226300333B2C /* SelectThreadViewController.h in Headers */,
346129B41FD1F7E800532771 /* OWSProfileManager.h in Headers */,
346129FA1FD5F31400532771 /* OWS100RemoveTSRecipientsMigration.h in Headers */,
346129E21FD5C0BE00532771 /* VersionMigrations.h in Headers */,
@ -2003,11 +2037,21 @@
453518961FC63DBF00210559 /* SignalMessaging.h in Headers */,
3461295A1FD1D74C00532771 /* Environment.h in Headers */,
34480B631FD0A98800BC14EF /* UIView+OWS.h in Headers */,
451F8A4B1FD715E1005CB9DA /* OWSGroupAvatarBuilder.h in Headers */,
451F8A371FD71179005CB9DA /* OWSViewController.h in Headers */,
454A965D1FD602B1008D2A0E /* OWSAudioAttachmentPlayer.h in Headers */,
451F8A3E1FD713D2005CB9DA /* ThreadViewHelper.h in Headers */,
346129391FD1B47300532771 /* OWSPreferences.h in Headers */,
346129DE1FD5C02A00532771 /* LockInteractionController.h in Headers */,
451F8A451FD71570005CB9DA /* BlockListUIUtils.h in Headers */,
451F8A4A1FD715D9005CB9DA /* OWSContactAvatarBuilder.h in Headers */,
34480B5B1FD0A7E300BC14EF /* SignalMessaging-Prefix.pch in Headers */,
45194F921FD7215600333B2C /* OWSContactOffersInteraction.h in Headers */,
346129A51FD1F09100532771 /* OWSContactsManager.h in Headers */,
451F8A421FD714C7005CB9DA /* ContactTableViewCell.h in Headers */,
34480B681FD0AA9400BC14EF /* UIFont+OWS.h in Headers */,
45194F941FD7216000333B2C /* TSUnreadIndicatorInteraction.h in Headers */,
45194F901FD7200000333B2C /* ThreadUtil.h in Headers */,
346129CC1FD2072E00532771 /* NSAttributedString+OWS.h in Headers */,
346129FD1FD5F31400532771 /* OWS102MoveLoggingPreferenceToUserDefaults.h in Headers */,
);
@ -2274,6 +2318,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
45194F9B1FD7327600333B2C /* Media.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2283,11 +2328,9 @@
files = (
AD41D7B61A6F6F0600241130 /* play_button@2x.png in Resources */,
AD83FF3F1A73426500B5C81A /* audio_pause_button_blue.png in Resources */,
458D514E1FCCD82500B5BC53 /* GTSR2.crt in Resources */,
34330A5A1E7875FB00DF2FB9 /* fontawesome-webfont.ttf in Resources */,
A5509ECA1A69AB8B00ABA4BC /* Main.storyboard in Resources */,
AD83FF421A73426500B5C81A /* audio_play_button.png in Resources */,
458D51491FCCD82500B5BC53 /* GTSR3.crt in Resources */,
34330A5C1E787A9800DF2FB9 /* dripicons-v2.ttf in Resources */,
B633C5C41A1D190B0059AC12 /* mute_on@2x.png in Resources */,
B633C5CE1A1D190B0059AC12 /* quit@2x.png in Resources */,
@ -2298,17 +2341,14 @@
FC5CDF391A3393DD00B47253 /* error_white@2x.png in Resources */,
B633C5D21A1D190B0059AC12 /* savephoto@2x.png in Resources */,
B10C9B611A7049EC00ECA2BF /* play_icon.png in Resources */,
458D514D1FCCD82500B5BC53 /* textsecure.cer in Resources */,
AD83FF401A73426500B5C81A /* audio_pause_button_blue@2x.png in Resources */,
B66DBF4A19D5BBC8006EA940 /* Images.xcassets in Resources */,
4517642A1DE939FD00EDB8B9 /* ContactCell.xib in Resources */,
AD83FF431A73426500B5C81A /* audio_play_button@2x.png in Resources */,
458D51481FCCD82500B5BC53 /* GSR4.crt in Resources */,
45CB2FA81CB7146C00E1B343 /* Launch Screen.storyboard in Resources */,
34B3F8781E8DF1700035BE1A /* ContactsPicker.xib in Resources */,
B633C5C31A1D190B0059AC12 /* mute_off@2x.png in Resources */,
AD83FF411A73426500B5C81A /* audio_play_button_blue@2x.png in Resources */,
458D514B1FCCD82500B5BC53 /* GSR2.crt in Resources */,
FC5CDF3A1A3393DD00B47253 /* warning_white@2x.png in Resources */,
E1370BE018A0686600826894 /* busy.mp3 in Resources */,
E1370BE218A0686C00826894 /* failure.mp3 in Resources */,
@ -2319,13 +2359,10 @@
B67EBF5D19194AC60084CCFD /* Settings.bundle in Resources */,
E1370BE418A0686C00826894 /* outring.mp3 in Resources */,
B10C9B601A7049EC00ECA2BF /* pause_icon@2x.png in Resources */,
458D514C1FCCD82500B5BC53 /* GTSR1.crt in Resources */,
E1370BE518A0686C00826894 /* r.caf in Resources */,
FC9120411A39EFB70074545C /* qr@2x.png in Resources */,
458D514A1FCCD82500B5BC53 /* GIAG2.crt in Resources */,
E1370BE618A0686C00826894 /* sonarping.mp3 in Resources */,
B10C9B5F1A7049EC00ECA2BF /* pause_icon.png in Resources */,
458D514F1FCCD82500B5BC53 /* GTSR4.crt in Resources */,
AD83FF471A73428300B5C81A /* audio_play_button_blue.png in Resources */,
34330A5E1E787BD800DF2FB9 /* ElegantIcons.ttf in Resources */,
AD83FF451A73426500B5C81A /* audio_pause_button@2x.png in Resources */,
@ -2651,7 +2688,9 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
45194F951FD7216600333B2C /* TSUnreadIndicatorInteraction.m in Sources */,
346129F71FD5F31400532771 /* OWS105AttachmentFilePaths.m in Sources */,
45194F931FD7215C00333B2C /* OWSContactOffersInteraction.m in Sources */,
346129761FD1E0B500532771 /* WeakTimer.swift in Sources */,
346129F81FD5F31400532771 /* OWS100RemoveTSRecipientsMigration.m in Sources */,
346129B51FD1F7E800532771 /* OWSProfileManager.m in Sources */,
@ -2663,31 +2702,51 @@
34480B671FD0AA9400BC14EF /* UIFont+OWS.m in Sources */,
346129E61FD5C0C600532771 /* OWSDatabaseMigrationRunner.m in Sources */,
346129AB1FD1F0EE00532771 /* OWSFormat.m in Sources */,
451F8A461FD715BA005CB9DA /* OWSGroupAvatarBuilder.m in Sources */,
346129961FD1E30000532771 /* OWSDatabaseMigration.m in Sources */,
346129CD1FD2072E00532771 /* UIImage+OWS.m in Sources */,
346129FB1FD5F31400532771 /* OWS101ExistingUsersBlockOnIdentityChange.m in Sources */,
451F8A3D1FD713CA005CB9DA /* ThreadViewHelper.m in Sources */,
346129AD1FD1F34E00532771 /* ImageCache.swift in Sources */,
451F8A341FD710C3005CB9DA /* ConversationSearcher.swift in Sources */,
346129341FD1A88700532771 /* OWSSwiftUtils.swift in Sources */,
346129FE1FD5F31400532771 /* OWS106EnsureProfileComplete.swift in Sources */,
346129F91FD5F31400532771 /* OWS104CreateRecipientIdentities.m in Sources */,
346129D01FD207F300532771 /* OWSAlerts.swift in Sources */,
454A965F1FD60EA3008D2A0E /* OWSFlatButton.swift in Sources */,
346129B61FD1F7E800532771 /* ProfileFetcherJob.swift in Sources */,
346129F51FD5F31400532771 /* OWS102MoveLoggingPreferenceToUserDefaults.m in Sources */,
45194F8F1FD71FF500333B2C /* ThreadUtil.m in Sources */,
451F8A3B1FD71297005CB9DA /* UIUtil.m in Sources */,
451F8A331FD71083005CB9DA /* SelectThreadViewController.m in Sources */,
454A965A1FD6017E008D2A0E /* SignalAttachment.swift in Sources */,
454A965B1FD601BF008D2A0E /* MediaMessageView.swift in Sources */,
3461295B1FD1D74C00532771 /* Environment.m in Sources */,
346129D51FD20ADC00532771 /* UIViewController+OWS.m in Sources */,
451F8A431FD714FE005CB9DA /* AvatarImageView.swift in Sources */,
346129C91FD2072E00532771 /* NSString+OWS.m in Sources */,
346129CB1FD2072E00532771 /* Promise+retainUntilComplete.swift in Sources */,
346129FF1FD5F31400532771 /* OWS103EnableVideoCalling.m in Sources */,
346129E31FD5C0BE00532771 /* VersionMigrations.m in Sources */,
451F8A3F1FD71455005CB9DA /* OWSTableViewController.m in Sources */,
451F8A351FD710DE005CB9DA /* Searcher.swift in Sources */,
451F8A481FD715BA005CB9DA /* OWSContactAvatarBuilder.m in Sources */,
346129A61FD1F09100532771 /* OWSContactsManager.m in Sources */,
346129D21FD2085A00532771 /* CommonStrings.swift in Sources */,
34612A071FD7238600532771 /* OWSContactsSyncing.m in Sources */,
346129DF1FD5C02A00532771 /* LockInteractionController.m in Sources */,
451F8A471FD715BA005CB9DA /* OWSAvatarBuilder.m in Sources */,
454A96601FD61165008D2A0E /* OWSAudioAttachmentPlayer.m in Sources */,
34480B591FD0A7A400BC14EF /* OWSScrubbingLogFormatter.m in Sources */,
451F8A441FD7156B005CB9DA /* BlockListUIUtils.m in Sources */,
451F8A381FD7117E005CB9DA /* OWSViewController.m in Sources */,
346129721FD1D74C00532771 /* SignalKeyingStorage.m in Sources */,
34480B561FD0A7A400BC14EF /* DebugLogger.m in Sources */,
3461293C1FD1D46A00532771 /* OWSMath.m in Sources */,
451F8A391FD711D6005CB9DA /* ContactsViewHelper.m in Sources */,
346129AF1FD1F5D900532771 /* SystemContactsFetcher.swift in Sources */,
451F8A311FD70DE9005CB9DA /* SendExternalFileViewController.m in Sources */,
451F8A411FD714B8005CB9DA /* ContactTableViewCell.m in Sources */,
346129C81FD2072E00532771 /* NSAttributedString+OWS.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -2705,7 +2764,6 @@
45C9DEB81DF4E35A0065CA84 /* WebRTCCallMessageHandler.swift in Sources */,
34D1F0501F7D45A60066283D /* GifPickerCell.swift in Sources */,
34D99C931F2937CC00D284D6 /* OWSAnalytics.swift in Sources */,
34D9134B1F62D4A500722898 /* SignalAttachment.swift in Sources */,
34B3F88E1E8DF1700035BE1A /* PrivacySettingsTableViewController.m in Sources */,
341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */,
34E3EF0D1EFC235B007F6822 /* DebugUIDiskUsage.m in Sources */,
@ -2714,11 +2772,8 @@
451A13B11E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */,
450DF2091E0DD2C6003D14BE /* UserNotificationsAdaptee.swift in Sources */,
34D1F0821F8678AA0066283D /* ConversationHeaderView.m in Sources */,
340CB2241EAC155C0001CAA1 /* ContactsViewHelper.m in Sources */,
45B72DDA1FD5E70600151AF6 /* ConversationSearcher.swift in Sources */,
34D1F0AB1F867BFC0066283D /* OWSContactOffersCell.m in Sources */,
343A65981FC4CFE7000477A1 /* ConversationScrollButton.m in Sources */,
B97940271832BD2400BD66CB /* UIUtil.m in Sources */,
34B3F8791E8DF1700035BE1A /* CountryCodeViewController.m in Sources */,
34D1F0A91F867BFC0066283D /* ConversationViewCell.m in Sources */,
4505C2BF1E648EA300CEBF41 /* ExperienceUpgrade.swift in Sources */,
@ -2730,17 +2785,13 @@
450D19131F85236600970622 /* RemoteVideoView.m in Sources */,
B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */,
45DF5DF21DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */,
34C04D801F6195E6004308B3 /* OWSFlatButton.swift in Sources */,
458DE9D91DEE7B360071BB03 /* OWSWebRTCDataProtos.pb.m in Sources */,
76EB063C18170B33006006FC /* NumberUtil.m in Sources */,
34CA1C291F7164F700E51C51 /* MediaMessageView.swift in Sources */,
3400C7961EAF99F4008A8584 /* SelectThreadViewController.m in Sources */,
34D5CCB11EAE7E7F005515DB /* SelectRecipientViewController.m in Sources */,
34B3F88F1E8DF1710035BE1A /* RegistrationViewController.m in Sources */,
3430FE181F7751D4000EC51B /* GiphyAPI.swift in Sources */,
34B3F8901E8DF1710035BE1A /* AppSettingsViewController.m in Sources */,
34FD93701E3BD43A00109093 /* OWSAnyTouchGestureRecognizer.m in Sources */,
343D3D9B1E9283F100165CA4 /* BlockListUIUtils.m in Sources */,
34B3F8931E8DF1710035BE1A /* SignalsNavigationController.m in Sources */,
34D1F0AC1F867BFC0066283D /* OWSExpirationTimerView.m in Sources */,
76EB063A18170B33006006FC /* FunctionalUtil.m in Sources */,
@ -2756,9 +2807,7 @@
452037D11EE84975004E4CDF /* DebugUISessionState.m in Sources */,
D221A09A169C9E5E00537ABF /* main.m in Sources */,
34B3F87B1E8DF1700035BE1A /* ExperienceUpgradesPageViewController.swift in Sources */,
34533F181EA8D2070006114F /* OWSAudioAttachmentPlayer.m in Sources */,
452EA09E1EA7ABE00078744B /* AttachmentPointerView.swift in Sources */,
45666EC91D994C0D008FE134 /* OWSGroupAvatarBuilder.m in Sources */,
3471B1DA1EB7C63600F6AEC8 /* NewNonContactConversationViewController.m in Sources */,
34B3F87C1E8DF1700035BE1A /* FingerprintViewController.m in Sources */,
4523149C1F7D7F81003A428C /* OWSMessagesBubbleImageFactory.swift in Sources */,
@ -2776,13 +2825,10 @@
452ECA4D1E087E7200E2F016 /* MessageFetcherJob.swift in Sources */,
4556FA681F54AA9500AF40DD /* DebugUIProfile.swift in Sources */,
34DFCB851E8E04B500053165 /* AddToBlockListViewController.m in Sources */,
45855F371D9498A40084F340 /* OWSContactAvatarBuilder.m in Sources */,
45A6DAD61EBBF85500893231 /* ReminderView.swift in Sources */,
45666EC61D99483D008FE134 /* OWSAvatarBuilder.m in Sources */,
45E615161E8C590B0018AD52 /* DisplayableText.swift in Sources */,
34B3F88A1E8DF1700035BE1A /* OWSLinkDeviceViewController.m in Sources */,
34D1F0881F8678AA0066283D /* ConversationViewLayout.m in Sources */,
76EB068618170B34006006FC /* ContactTableViewCell.m in Sources */,
3497DBEF1ECE2E4700DB2605 /* DomainFrontingCountryViewController.m in Sources */,
452314A01F7E9E18003A428C /* DirectionalPanGestureRecognizer.swift in Sources */,
34330AA31E79686200DF2FB9 /* OWSProgressView.m in Sources */,
@ -2807,7 +2853,6 @@
34B3F8771E8DF1700035BE1A /* ContactsPicker.swift in Sources */,
45C0DC1B1E68FE9000E04C47 /* UIApplication+OWS.swift in Sources */,
45638BDF1F3DDB2200128435 /* MessageSender+Promise.swift in Sources */,
45F3AEB61DFDE7900080CE33 /* AvatarImageView.swift in Sources */,
45FBC5C81DF8575700E9B410 /* CallKitCallManager.swift in Sources */,
34B3F8911E8DF1710035BE1A /* ShowGroupMembersViewController.m in Sources */,
4539B5861F79348F007141FF /* PushRegistrationManager.swift in Sources */,
@ -2816,7 +2861,6 @@
452C468F1E427E200087B011 /* OutboundCallInitiator.swift in Sources */,
45F170BB1E2FC5D3003FC1F2 /* CallAudioService.swift in Sources */,
34B3F8711E8DF1700035BE1A /* AboutTableViewController.m in Sources */,
45360B8D1F9521F800FA666C /* Searcher.swift in Sources */,
34B3F88D1E8DF1700035BE1A /* OWSQRCodeScanningViewController.m in Sources */,
34BECE2E1F7ABCE000D7438D /* GifPickerViewController.swift in Sources */,
34CCAF3B1F0C2748004084F4 /* OWSAddToContactViewController.m in Sources */,
@ -2825,19 +2869,14 @@
45BB93381E688E14001E3939 /* UIDevice+featureSupport.swift in Sources */,
458DE9D61DEE3FD00071BB03 /* PeerConnectionClient.swift in Sources */,
451DE9FD1DC1A28200810E42 /* SyncPushTokensJob.swift in Sources */,
34D99C8C1F27B13B00D284D6 /* OWSViewController.m in Sources */,
34D1F0841F8678AA0066283D /* ConversationInputToolbar.m in Sources */,
340CB2271EAC25820001CAA1 /* UpdateGroupViewController.m in Sources */,
34B3F89F1E8DF5490035BE1A /* OWSTableViewController.m in Sources */,
3400C7931EAF89CD008A8584 /* SendExternalFileViewController.m in Sources */,
FCC81A981A44558300DFEC7D /* UIDevice+TSHardwareVersion.m in Sources */,
3400C7991EAFB772008A8584 /* ThreadViewHelper.m in Sources */,
76EB054018170B33006006FC /* AppDelegate.m in Sources */,
34D1F0831F8678AA0066283D /* ConversationInputTextView.m in Sources */,
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 */,
B609597C1C2C0FC6004E8797 /* iRate.m in Sources */,
4574A5D61DD6704700C6B692 /* CallService.swift in Sources */,
@ -2846,11 +2885,9 @@
45F170D61E315310003FC1F2 /* Weak.swift in Sources */,
4521C3C01F59F3BA00B4C582 /* TextFieldHelper.swift in Sources */,
34B3F8891E8DF1700035BE1A /* OWSConversationSettingsViewController.m in Sources */,
34C42D671F4734ED0072EC04 /* TSUnreadIndicatorInteraction.m in Sources */,
34B3F87E1E8DF1700035BE1A /* InboxTableViewCell.m in Sources */,
34B3F88B1E8DF1700035BE1A /* OWSLinkedDevicesTableViewController.m in Sources */,
4579431E1E7C8CE9008ED0C0 /* Pastelog.m in Sources */,
34C42D661F4734ED0072EC04 /* OWSContactOffersInteraction.m in Sources */,
34B3F8941E8DF1710035BE1A /* HomeViewController.m in Sources */,
34E8BF381EE9E2FD00F5F4CA /* FingerprintViewScanController.m in Sources */,
346B66311F4E29B200E5122F /* CropScaleImageViewController.swift in Sources */,
@ -2874,6 +2911,14 @@
458E383A1D6699FA0094BD24 /* OWSDeviceProvisioningURLParserTest.m in Sources */,
452D1EE81DCA90D100A57EC4 /* MesssagesBubblesSizeCalculatorTest.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 */,
45DF5DF31DDB843F00C936C7 /* CompareSafetyNumbersActivity.swift in Sources */,
456AC8341E3A775E00A3C7FC /* Weak.swift in Sources */,
454EBAB41F2BE14C00ACE0BB /* OWSAnalytics.swift in Sources */,
B660F7721C29988E00687D6E /* AppStoreRating.m in Sources */,
954AEE6A1DF33E01002E5410 /* ContactsPickerTest.swift in Sources */,
45666F581D9B2880008FE134 /* OWSScrubbingLogFormatterTest.m in Sources */,
B660F6E01C29868000687D6E /* UtilTest.m in Sources */,

View File

@ -372,7 +372,7 @@ class GifPickerViewController: OWSViewController, UISearchBarDelegate, UICollect
owsFail("\(strongSelf.TAG) couldn't load asset.")
return
}
let attachment = SignalAttachment(dataSource: dataSource, dataUTI: asset.rendition.utiType)
let attachment = SignalAttachment.imageAttachment(dataSource: dataSource, dataUTI: asset.rendition.utiType)
strongSelf.delegate?.gifPickerDidSelect(attachment: attachment)

View File

@ -434,7 +434,7 @@ class MessageDetailViewController: OWSViewController, UIScrollViewDelegate {
let contentType = attachment.contentType
if let dataUTI = MIMETypeUtil.utiType(forMIMEType: contentType) {
let attachment = SignalAttachment(dataSource: dataSource, dataUTI: dataUTI)
let attachment = SignalAttachment.attachment(dataSource: dataSource, dataUTI: dataUTI)
let mediaMessageView = MediaMessageView(attachment: attachment, mode: .small)
mediaMessageView.backgroundColor = UIColor.white
self.mediaMessageView = mediaMessageView

View File

@ -28,6 +28,11 @@ NS_ASSUME_NONNULL_BEGIN
[[UIApplication sharedApplication] userInterfaceLayoutDirection] == UIUserInterfaceLayoutDirectionRightToLeft;
}
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle
{
[[UIApplication sharedApplication] setStatusBarStyle:statusBarStyle];
}
- (UIApplicationState)mainApplicationState
{
return [UIApplication sharedApplication].applicationState;

View File

@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"filename" : "file-thin-black-w-shadow-large.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -14,10 +14,17 @@ FOUNDATION_EXPORT const unsigned char SignalMessagingVersionString[];
#import <SignalMessaging/DebugLogger.h>
#import <SignalMessaging/Environment.h>
#import <SignalMessaging/NSString+OWS.h>
#import <SignalMessaging/OWSAudioAttachmentPlayer.h>
#import <SignalMessaging/OWSContactsManager.h>
#import <SignalMessaging/OWSDatabaseMigration.h>
#import <SignalMessaging/OWSFormat.h>
#import <SignalMessaging/OWSLogger.h>
#import <SignalMessaging/OWSMath.h>
#import <SignalMessaging/OWSProfileManager.h>
#import <SignalMessaging/Release.h>
#import <SignalMessaging/SendExternalFileViewController.h>
#import <SignalMessaging/UIColor+OWS.h>
#import <SignalMessaging/UIFont+OWS.h>
#import <SignalMessaging/UIImage+OWS.h>
#import <SignalMessaging/UIView+OWS.h>
#import <SignalMessaging/UIViewController+OWS.h>

View File

@ -31,7 +31,7 @@ const CGFloat kOWSTable_DefaultCellHeight = 45.f;
- (void)addSection:(OWSTableSection *)section
{
OWSAssert(section);
[_sections addObject:section];
}
@ -100,7 +100,7 @@ const CGFloat kOWSTable_DefaultCellHeight = 45.f;
+ (OWSTableItem *)itemWithTitle:(NSString *)title actionBlock:(nullable OWSTableActionBlock)actionBlock
{
OWSAssert(title.length > 0);
OWSTableItem *item = [OWSTableItem new];
item.itemType = OWSTableItemTypeAction;
item.actionBlock = actionBlock;
@ -330,7 +330,7 @@ const CGFloat kOWSTable_DefaultCellHeight = 45.f;
#pragma mark -
NSString * const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
NSString *const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
@implementation OWSTableViewController
@ -379,7 +379,7 @@ NSString * const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
- (void)loadView
{
[super loadView];
OWSAssert(self.contents);
if (self.contents.title.length > 0) {
@ -422,21 +422,21 @@ NSString * const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
- (OWSTableSection *)sectionForIndex:(NSInteger)sectionIndex
{
OWSAssert(self.contents);
OWSAssert(sectionIndex >= 0 && sectionIndex < (NSInteger) self.contents.sections.count);
OWSTableSection *section = self.contents.sections[(NSUInteger) sectionIndex];
OWSAssert(sectionIndex >= 0 && sectionIndex < (NSInteger)self.contents.sections.count);
OWSTableSection *section = self.contents.sections[(NSUInteger)sectionIndex];
return section;
}
- (OWSTableItem *)itemForIndexPath:(NSIndexPath *)indexPath
{
OWSAssert(self.contents);
OWSAssert(indexPath.section >= 0 && indexPath.section < (NSInteger) self.contents.sections.count);
OWSTableSection *section = self.contents.sections[(NSUInteger) indexPath.section];
OWSAssert(indexPath.item >= 0 && indexPath.item < (NSInteger) section.items.count);
OWSTableItem *item = section.items[(NSUInteger) indexPath.item];
OWSAssert(indexPath.section >= 0 && indexPath.section < (NSInteger)self.contents.sections.count);
OWSTableSection *section = self.contents.sections[(NSUInteger)indexPath.section];
OWSAssert(indexPath.item >= 0 && indexPath.item < (NSInteger)section.items.count);
OWSTableItem *item = section.items[(NSUInteger)indexPath.item];
return item;
}
@ -455,14 +455,14 @@ NSString * const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
OWSAssert(self.contents);
return (NSInteger) self.contents.sections.count;
return (NSInteger)self.contents.sections.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)sectionIndex
{
OWSTableSection *section = [self sectionForIndex:sectionIndex];
OWSAssert(section.items);
return (NSInteger) section.items.count;
return (NSInteger)section.items.count;
}
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)sectionIndex
@ -488,9 +488,9 @@ NSString * const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kOWSTableCellIdentifier];
OWSAssert(cell);
cell.textLabel.text = item.title;
return cell;
}
@ -598,15 +598,14 @@ NSString * const kOWSTableCellIdentifier = @"kOWSTableCellIdentifier";
- (void)presentFromViewController:(UIViewController *)fromViewController
{
OWSAssert(fromViewController);
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop
target:self
action:@selector(donePressed:)];
[fromViewController presentViewController:navigationController
animated:YES
completion:nil];
self.navigationItem.leftBarButtonItem =
[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop
target:self
action:@selector(donePressed:)];
[fromViewController presentViewController:navigationController animated:YES completion:nil];
}
- (void)donePressed:(id)sender

View File

@ -4,9 +4,10 @@
import UIKit
class AvatarImageView: UIImageView {
@objc
public class AvatarImageView: UIImageView {
init() {
public init() {
super.init(frame: CGRect.zero)
self.configureView()
}
@ -16,7 +17,7 @@ class AvatarImageView: UIImageView {
self.configureView()
}
required init?(coder aDecoder: NSCoder) {
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.configureView()
}
@ -34,7 +35,7 @@ class AvatarImageView: UIImageView {
self.contentMode = .scaleToFill
}
override func layoutSubviews() {
override public func layoutSubviews() {
self.layer.borderColor = UIColor.black.cgColor.copy(alpha: 0.15)
self.layer.cornerRadius = self.frame.size.width / 2
}

View File

@ -2,7 +2,6 @@
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "OWSContactsManager.h"
/**

View File

@ -6,11 +6,12 @@
#import "Environment.h"
#import "OWSContactAvatarBuilder.h"
#import "OWSContactsManager.h"
#import "Signal-Swift.h"
#import "UIFont+OWS.h"
#import "UIUtil.h"
#import "UIView+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/SignalAccount.h>
#import <SignalServiceKit/TSContactThread.h>
#import <SignalServiceKit/TSGroupThread.h>
#import <SignalServiceKit/TSThread.h>
@ -117,12 +118,10 @@ const CGFloat kContactTableViewCellAvatarTextMargin = 12;
- (void)configureWithSignalAccount:(SignalAccount *)signalAccount contactsManager:(OWSContactsManager *)contactsManager
{
[self configureWithRecipientId:signalAccount.recipientId
contactsManager:contactsManager];
[self configureWithRecipientId:signalAccount.recipientId contactsManager:contactsManager];
}
- (void)configureWithRecipientId:(NSString *)recipientId
contactsManager:(OWSContactsManager *)contactsManager
- (void)configureWithRecipientId:(NSString *)recipientId contactsManager:(OWSContactsManager *)contactsManager
{
self.recipientId = recipientId;
self.contactsManager = contactsManager;
@ -162,11 +161,11 @@ const CGFloat kContactTableViewCellAvatarTextMargin = 12;
threadName = [MessageStrings newGroupDefaultTitle];
}
NSAttributedString *attributedText = [[NSAttributedString alloc]
initWithString:threadName
attributes:@{
NSForegroundColorAttributeName : [UIColor blackColor],
}];
NSAttributedString *attributedText =
[[NSAttributedString alloc] initWithString:threadName
attributes:@{
NSForegroundColorAttributeName : [UIColor blackColor],
}];
self.nameLabel.attributedText = attributedText;
if ([thread isKindOfClass:[TSContactThread class]]) {

View File

@ -5,8 +5,10 @@
#import "ContactsViewHelper.h"
#import "Environment.h"
#import "NSString+OWS.h"
#import "Signal-Swift.h"
#import "UIUtil.h"
#import <SignalMessaging/OWSProfileManager.h>
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/AppContext.h>
#import <SignalServiceKit/Contact.h>
#import <SignalServiceKit/OWSBlockingManager.h>
#import <SignalServiceKit/PhoneNumber.h>
@ -284,7 +286,7 @@ NS_ASSUME_NONNULL_BEGIN
@"Button text which opens the settings app")
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action) {
[[UIApplication sharedApplication] openSystemSettings];
[CurrentAppContext() openSystemSettings];
}]];
[viewController presentViewController:alertController animated:YES completion:nil];

View File

@ -4,9 +4,9 @@
import Foundation
import SignalServiceKit
import SignalMessaging
@objc class OWSFlatButton: UIView {
@objc
public class OWSFlatButton: UIView {
let TAG = "[OWSFlatButton]"
private let button: UIButton
@ -16,13 +16,14 @@ import SignalMessaging
private var upColor: UIColor?
private var downColor: UIColor?
override var backgroundColor: UIColor? {
override public var backgroundColor: UIColor? {
willSet {
owsFail("Use setBackgroundColors(upColor:) instead.")
}
}
init() {
@objc
public init() {
AssertIsOnMainThread()
button = UIButton(type:.custom)
@ -33,7 +34,7 @@ import SignalMessaging
}
@available(*, unavailable, message:"use other constructor instead.")
required init?(coder aDecoder: NSCoder) {
required public init?(coder aDecoder: NSCoder) {
fatalError("\(#function) is unimplemented.")
}
@ -43,6 +44,7 @@ import SignalMessaging
button.autoPinToSuperviewEdges()
}
@objc
public class func button(title: String,
font: UIFont,
titleColor: UIColor,
@ -62,6 +64,7 @@ import SignalMessaging
return button
}
@objc
public class func button(title: String,
titleColor: UIColor,
backgroundColor: UIColor,
@ -79,6 +82,7 @@ import SignalMessaging
selector:selector)
}
@objc
public class func button(title: String,
font: UIFont,
titleColor: UIColor,
@ -95,6 +99,7 @@ import SignalMessaging
return button
}
@objc
public class func fontForHeight(_ height: CGFloat) -> UIFont {
// Cap the "button height" at 40pt or button text can look
// excessively large.
@ -104,6 +109,7 @@ import SignalMessaging
// MARK: Methods
@objc
public func setTitle(title: String, font: UIFont,
titleColor: UIColor ) {
button.setTitle(title, for: .normal)
@ -111,22 +117,26 @@ import SignalMessaging
button.titleLabel!.font = font
}
@objc
public func setBackgroundColors(upColor: UIColor,
downColor: UIColor ) {
button.setBackgroundImage(UIImage(color:upColor), for: .normal)
button.setBackgroundImage(UIImage(color:downColor), for: .highlighted)
}
@objc
public func setBackgroundColors(upColor: UIColor ) {
setBackgroundColors(upColor: upColor,
downColor: upColor.withAlphaComponent(0.7) )
}
@objc
public func setSize(width: CGFloat, height: CGFloat) {
button.autoSetDimension(.width, toSize:width)
button.autoSetDimension(.height, toSize:height)
}
@objc
public func useDefaultCornerRadius() {
// To my eye, this radius tends to look right regardless of button size
// (within reason) or device size.
@ -134,15 +144,18 @@ import SignalMessaging
button.clipsToBounds = true
}
@objc
public func setEnabled(_ isEnabled: Bool) {
button.isEnabled = isEnabled
}
@objc
public func addTarget(target:Any,
selector: Selector) {
button.addTarget(target, action:selector, for:.touchUpInside)
}
@objc
public func setPressedBlock(_ pressedBlock: @escaping () -> Void) {
guard self.pressedBlock == nil else {
owsFail("Button already has pressed block.")
@ -151,6 +164,7 @@ import SignalMessaging
self.pressedBlock = pressedBlock
}
@objc
internal func buttonPressed() {
pressedBlock?()
}

View File

@ -8,26 +8,35 @@ import YYImage
import SignalServiceKit
@objc
enum MediaMessageViewMode: UInt {
public enum MediaMessageViewMode: UInt {
case large
case small
}
class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
@objc
public class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
let TAG = "[MediaMessageView]"
// MARK: Properties
let mode: MediaMessageViewMode
@objc
public let mode: MediaMessageViewMode
let attachment: SignalAttachment
@objc
public let attachment: SignalAttachment
var videoPlayer: MPMoviePlayerController?
@objc
public var videoPlayer: MPMoviePlayerController?
var audioPlayer: OWSAudioAttachmentPlayer?
var audioPlayButton: UIButton?
var playbackState = AudioPlaybackState.stopped {
@objc
public var audioPlayer: OWSAudioAttachmentPlayer?
@objc
public var audioPlayButton: UIButton?
@objc
public var playbackState = AudioPlaybackState.stopped {
didSet {
AssertIsOnMainThread()
@ -35,19 +44,24 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
}
}
var audioProgressSeconds: CGFloat = 0
var audioDurationSeconds: CGFloat = 0
@objc
public var audioProgressSeconds: CGFloat = 0
var contentView: UIView?
@objc
public var audioDurationSeconds: CGFloat = 0
@objc
public var contentView: UIView?
// MARK: Initializers
@available(*, unavailable, message:"use other constructor instead.")
required init?(coder aDecoder: NSCoder) {
required public init?(coder aDecoder: NSCoder) {
fatalError("\(#function) is unimplemented.")
}
required init(attachment: SignalAttachment, mode: MediaMessageViewMode) {
@objc
public required init(attachment: SignalAttachment, mode: MediaMessageViewMode) {
assert(!attachment.hasError)
self.mode = mode
self.attachment = attachment
@ -62,12 +76,14 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
// MARK: View Lifecycle
func viewWillAppear(_ animated: Bool) {
ViewControllerUtils.setAudioIgnoresHardwareMuteSwitch(true)
@objc
public func viewWillAppear(_ animated: Bool) {
OWSAudioAttachmentPlayer.setAudioIgnoresHardwareMuteSwitch(true)
}
func viewWillDisappear(_ animated: Bool) {
ViewControllerUtils.setAudioIgnoresHardwareMuteSwitch(false)
@objc
public func viewWillDisappear(_ animated: Bool) {
OWSAudioAttachmentPlayer.setAudioIgnoresHardwareMuteSwitch(false)
}
// MARK: - Create Views
@ -275,7 +291,8 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
private func createHeroImageView(imageName: String) -> UIView {
let imageSize = createHeroViewSize()
let image = UIImage(named: imageName)
let image = UIImage(named: imageName, inBundleForClass: type(of:self))
assert(image != nil)
let imageView = UIImageView(image: image)
imageView.layer.minificationFilter = kCAFilterTrilinear
@ -353,6 +370,7 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
// MARK: - Event Handlers
@objc
func audioPlayButtonPressed(sender: UIButton) {
audioPlayer?.togglePlayState()
}
@ -396,6 +414,7 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
// MARK: - Full Screen Image
@objc
func imageTapped(sender: UIGestureRecognizer) {
guard sender.state == .recognized else {
return
@ -406,14 +425,17 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
guard let fromViewController = CurrentAppContext().frontmostViewController() else {
return
}
let window = UIApplication.shared.keyWindow
let convertedRect = fromView.convert(fromView.bounds, to:window)
let viewController = FullImageViewController(attachment:attachment, from:convertedRect)
viewController.present(from:fromViewController)
// let window = UIApplication.shared.keyWindow
// let convertedRect = fromView.convert(fromView.bounds, to:window)
// let viewController = FullImageViewController(attachment:attachment, from:convertedRect)
// viewController.present(from:fromViewController)
Logger.error("\(TAG) FIXME. image tapped.")
}
// MARK: - Video Playback
@objc
func videoTapped(sender: UIGestureRecognizer) {
guard sender.state == .recognized else {
return
@ -440,7 +462,7 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
videoPlayer.view.frame = self.bounds
self.videoPlayer = videoPlayer
videoPlayer.view.autoPinToSuperviewEdges()
ViewControllerUtils.setAudioIgnoresHardwareMuteSwitch(true)
OWSAudioAttachmentPlayer.setAudioIgnoresHardwareMuteSwitch(true)
videoPlayer.setFullscreen(true, animated:false)
}
@ -456,6 +478,14 @@ class MediaMessageView: UIView, OWSAudioAttachmentPlayerDelegate {
videoPlayer?.stop()
videoPlayer?.view.removeFromSuperview()
videoPlayer = nil
ViewControllerUtils.setAudioIgnoresHardwareMuteSwitch(false)
OWSAudioAttachmentPlayer.setAudioIgnoresHardwareMuteSwitch(false)
}
}
extension UIImage {
public convenience init?(named: String, inBundleForClass someClass: AnyClass) {
// let image = UIImage(named: imageName, inBundleForClass: type(of:self))
let bundle = Bundle(for: someClass)
self.init(named: named, in: bundle, compatibleWith: nil)
}
}

View File

@ -25,6 +25,8 @@ typedef NS_ENUM(NSInteger, AudioPlaybackState) {
@interface OWSAudioAttachmentPlayer : NSObject
+ (void)setAudioIgnoresHardwareMuteSwitch:(BOOL)shouldIgnore;
@property (nonatomic, readonly, weak) id<OWSAudioAttachmentPlayerDelegate> delegate;
// This property can be used to associate instances of the player with view

View File

@ -3,10 +3,9 @@
//
#import "OWSAudioAttachmentPlayer.h"
#import "Signal-Swift.h"
#import "TSAttachmentStream.h"
#import "ViewControllerUtils.h"
#import <AVFoundation/AVFoundation.h>
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/NSTimer+OWS.h>
NS_ASSUME_NONNULL_BEGIN
@ -23,6 +22,17 @@ NS_ASSUME_NONNULL_BEGIN
@implementation OWSAudioAttachmentPlayer
+ (void)setAudioIgnoresHardwareMuteSwitch:(BOOL)shouldIgnore
{
NSError *error = nil;
BOOL success = [[AVAudioSession sharedInstance]
setCategory:(shouldIgnore ? AVAudioSessionCategoryPlayback : AVAudioSessionCategoryPlayAndRecord)error:&error];
OWSAssert(!error);
if (!success || error) {
DDLogError(@"%@ Error in setAudioIgnoresHardwareMuteSwitch: %d", self.logTag, shouldIgnore);
}
}
- (instancetype)initWithMediaUrl:(NSURL *)mediaUrl delegate:(id<OWSAudioAttachmentPlayerDelegate>)delegate
{
self = [super init];
@ -48,7 +58,8 @@ NS_ASSUME_NONNULL_BEGIN
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
// FIXME SHARINGEXTENSION
// [DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
[self stop];
}
@ -66,7 +77,7 @@ NS_ASSUME_NONNULL_BEGIN
OWSAssert(self.mediaUrl);
OWSAssert([self.delegate audioPlaybackState] != AudioPlaybackState_Playing);
[ViewControllerUtils setAudioIgnoresHardwareMuteSwitch:YES];
[[self class] setAudioIgnoresHardwareMuteSwitch:YES];
[self.audioPlayerPoller invalidate];
@ -101,7 +112,8 @@ NS_ASSUME_NONNULL_BEGIN
repeats:YES];
// Prevent device from sleeping while playing audio.
[DeviceSleepManager.sharedInstance addBlockWithBlockObject:self];
// FIXME SHARINGEXTENSION
// [DeviceSleepManager.sharedInstance addBlockWithBlockObject:self];
}
- (void)pause
@ -113,7 +125,8 @@ NS_ASSUME_NONNULL_BEGIN
[self.audioPlayerPoller invalidate];
[self.delegate setAudioProgress:[self.audioPlayer currentTime] duration:[self.audioPlayer duration]];
[DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
// FIXME SHARINGEXTENSION
// [DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
}
- (void)stop
@ -125,7 +138,8 @@ NS_ASSUME_NONNULL_BEGIN
[self.audioPlayerPoller invalidate];
[self.delegate setAudioProgress:0 duration:0];
[DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
// FIXME SHARINGEXTENSION
// [DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self];
}
- (void)togglePlayState

View File

@ -5,11 +5,12 @@
#import "SendExternalFileViewController.h"
#import "Environment.h"
#import "NSString+OWS.h"
#import "Signal-Swift.h"
#import "SignalApp.h"
#import "ThreadUtil.h"
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import "UIView+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/OWSMessageSender.h>
#import <SignalServiceKit/TSThread.h>
@ -53,22 +54,34 @@ NS_ASSUME_NONNULL_BEGIN
__weak typeof(self) weakSelf = self;
BOOL didShowSNAlert =
[SafetyNumberConfirmationAlert presentAlertIfNecessaryWithRecipientIds:thread.recipientIdentifiers
confirmationText:[SafetyNumberStrings confirmSendButton]
contactsManager:self.contactsManager
completion:^(BOOL didConfirm) {
if (didConfirm) {
[weakSelf threadWasSelected:thread];
}
}];
if (didShowSNAlert) {
return;
}
// FIXME SHARINGEXTENSION
// Handling safety number changes brings in a lot of machinery.
// How do we want to handle this?
// e.g. fingerprint scanning, etc. in the SAE or just redirect the user to the main app?
// BOOL didShowSNAlert =
// [SafetyNumberConfirmationAlert presentAlertIfNecessaryWithRecipientIds:thread.recipientIdentifiers
// confirmationText:[SafetyNumberStrings
// confirmSendButton]
// contactsManager:self.contactsManager
// completion:^(BOOL didConfirm) {
// if (didConfirm) {
// [weakSelf threadWasSelected:thread];
// }
// }];
// if (didShowSNAlert) {
// return;
// }
[ThreadUtil addThreadToProfileWhitelistIfEmptyContactThread:thread];
[ThreadUtil sendMessageWithAttachment:self.attachment inThread:thread messageSender:self.messageSender];
[SignalApp.sharedApp presentConversationForThread:thread];
// FIXME SHARINGEXTENSION
// Show loading screen and dismiss when complete
// TODO Show share annotation UI (add caption, preview, cancel)
//
// This implemenation was for the "import with signal" functionality:
// [SignalApp.sharedApp presentConversationForThread:thread];
}
- (BOOL)canSelectBlockedContact
@ -100,7 +113,9 @@ NS_ASSUME_NONNULL_BEGIN
[fileView autoHCenterInSuperview];
[fileView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:titleLabel withOffset:titleVSpacing];
UIImage *image = [UIImage imageNamed:@"file-thin-black-filled-large"];
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
UIImage *image =
[UIImage imageNamed:@"file-thin-black-filled-large" inBundle:bundle compatibleWithTraitCollection:nil];
OWSAssert(image);
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.layer.minificationFilter = kCAFilterTrilinear;

View File

@ -5,7 +5,7 @@
import Foundation
import MobileCoreServices
import SignalServiceKit
import SignalMessaging
import AVFoundation
enum SignalAttachmentError: Error {
case missingData
@ -74,27 +74,38 @@ enum TSImageQuality {
// [SignalAttachment hasError] will be true for non-valid attachments.
//
// TODO: Perhaps do conversion off the main thread?
class SignalAttachment: NSObject {
@objc
public class SignalAttachment: NSObject {
static let TAG = "[SignalAttachment]"
let TAG = "[SignalAttachment]"
// MARK: Properties
@objc
let dataSource: DataSource
@objc
public var data: Data {
return dataSource.data()
}
@objc
public var dataLength: UInt {
return dataSource.dataLength()
}
@objc
public var dataUrl: URL? {
return dataSource.dataUrl()
}
@objc
public var sourceFilename: String? {
return dataSource.sourceFilename
}
@objc
public var isValidImage: Bool {
return dataSource.isValidImage()
}
@ -102,7 +113,8 @@ class SignalAttachment: NSObject {
// Attachment types are identified using UTIs.
//
// See: https://developer.apple.com/library/content/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html
let dataUTI: String
@objc
public let dataUTI: String
var error: SignalAttachmentError? {
didSet {
@ -119,6 +131,7 @@ class SignalAttachment: NSObject {
private var cachedImage: UIImage?
private var cachedVideoPreview: UIImage?
@objc
private(set) public var isVoiceMessage = false
// MARK: Constants
@ -138,7 +151,8 @@ class SignalAttachment: NSObject {
// This method should not be called directly; use the factory
// methods instead.
internal required init(dataSource: DataSource, dataUTI: String) {
@objc
internal init(dataSource: DataSource, dataUTI: String) {
self.dataSource = dataSource
self.dataUTI = dataUTI
super.init()
@ -146,11 +160,13 @@ class SignalAttachment: NSObject {
// MARK: Methods
var hasError: Bool {
@objc
public var hasError: Bool {
return error != nil
}
var errorName: String? {
@objc
public var errorName: String? {
guard let error = error else {
// This method should only be called if there is an error.
owsFail("Missing error")
@ -160,7 +176,8 @@ class SignalAttachment: NSObject {
return "\(error)"
}
var localizedErrorDescription: String? {
@objc
public var localizedErrorDescription: String? {
guard let error = self.error else {
// This method should only be called if there is an error.
owsFail("Missing error")
@ -170,10 +187,12 @@ class SignalAttachment: NSObject {
return "\(error.errorDescription)"
}
class var missingDataErrorMessage: String {
@objc
public class var missingDataErrorMessage: String {
return SignalAttachmentError.missingData.errorDescription
}
@objc
public func image() -> UIImage? {
if let cachedImage = cachedImage {
return cachedImage
@ -185,6 +204,7 @@ class SignalAttachment: NSObject {
return image
}
@objc
public func videoPreview() -> UIImage? {
if let cachedVideoPreview = cachedVideoPreview {
return cachedVideoPreview
@ -212,7 +232,8 @@ class SignalAttachment: NSObject {
// Returns the MIME type for this attachment or nil if no MIME type
// can be identified.
var mimeType: String {
@objc
public var mimeType: String {
if isVoiceMessage {
// Legacy iOS clients don't handle "audio/mp4" files correctly;
// they are written to disk as .mp4 instead of .m4a which breaks
@ -249,7 +270,8 @@ class SignalAttachment: NSObject {
// Use the filename if known. If not, e.g. if the attachment was copy/pasted, we'll generate a filename
// like: "signal-2017-04-24-095918.zip"
var filenameOrDefault: String {
@objc
public var filenameOrDefault: String {
if let filename = sourceFilename {
return filename
} else {
@ -270,7 +292,8 @@ class SignalAttachment: NSObject {
// Returns the file extension for this attachment or nil if no file extension
// can be identified.
var fileExtension: String? {
@objc
public var fileExtension: String? {
if let filename = sourceFilename {
let fileExtension = (filename as NSString).pathExtension
if fileExtension.count > 0 {
@ -333,26 +356,32 @@ class SignalAttachment: NSObject {
return audioUTISet.union(videoUTISet).union(animatedImageUTISet).union(inputImageUTISet)
}
@objc
public var isImage: Bool {
return SignalAttachment.outputImageUTISet.contains(dataUTI)
}
@objc
public var isAnimatedImage: Bool {
return SignalAttachment.animatedImageUTISet.contains(dataUTI)
}
@objc
public var isVideo: Bool {
return SignalAttachment.videoUTISet.contains(dataUTI)
}
@objc
public var isAudio: Bool {
return SignalAttachment.audioUTISet.contains(dataUTI)
}
@objc
public class func pasteboardHasPossibleAttachment() -> Bool {
return UIPasteboard.general.numberOfItems > 0
}
@objc
public class func pasteboardHasText() -> Bool {
if UIPasteboard.general.numberOfItems < 1 {
return false
@ -401,6 +430,7 @@ class SignalAttachment: NSObject {
//
// NOTE: The attachment returned by this method may not be valid.
// Check the attachment's error property.
@objc
public class func attachmentFromPasteboard() -> SignalAttachment? {
guard UIPasteboard.general.numberOfItems >= 1 else {
return nil
@ -476,7 +506,8 @@ class SignalAttachment: NSObject {
//
// NOTE: The attachment returned by this method may not be valid.
// Check the attachment's error property.
private class func imageAttachment(dataSource: DataSource?, dataUTI: String) -> SignalAttachment {
@objc
public class func imageAttachment(dataSource: DataSource?, dataUTI: String) -> SignalAttachment {
assert(dataUTI.count > 0)
assert(dataSource != nil)
@ -576,6 +607,7 @@ class SignalAttachment: NSObject {
//
// NOTE: The attachment returned by this method may nil or not be valid.
// Check the attachment's error property.
@objc
public class func imageAttachment(image: UIImage?, dataUTI: String, filename: String?) -> SignalAttachment {
assert(dataUTI.count > 0)
@ -744,6 +776,7 @@ class SignalAttachment: NSObject {
// MARK: Voice Messages
@objc
public class func voiceMessageAttachment(dataSource: DataSource?, dataUTI: String) -> SignalAttachment {
let attachment = audioAttachment(dataSource : dataSource, dataUTI : dataUTI)
attachment.isVoiceMessage = true
@ -756,6 +789,7 @@ class SignalAttachment: NSObject {
//
// NOTE: The attachment returned by this method may not be valid.
// Check the attachment's error property.
@objc
public class func attachment(dataSource: DataSource?, dataUTI: String) -> SignalAttachment {
if inputImageUTISet.contains(dataUTI) {
return imageAttachment(dataSource : dataSource, dataUTI : dataUTI)
@ -768,6 +802,7 @@ class SignalAttachment: NSObject {
}
}
@objc
public class func empty() -> SignalAttachment {
return SignalAttachment.attachment(dataSource : DataSourceValue.emptyDataSource(),
dataUTI: kUTTypeContent as String)

View File

@ -2,7 +2,7 @@
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface UIImage (normalizeImage)
@ -16,3 +16,5 @@
+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size;
@end
NS_ASSUME_NONNULL_END

View File

@ -10,11 +10,11 @@
#import "NSString+OWS.h"
#import "OWSContactsManager.h"
#import "OWSTableViewController.h"
#import "Signal-Swift.h"
#import "ThreadViewHelper.h"
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import "UIView+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/PhoneNumber.h>
#import <SignalServiceKit/SignalAccount.h>
#import <SignalServiceKit/TSAccountManager.h>

View File

@ -5,7 +5,7 @@
#import "BlockListUIUtils.h"
#import "OWSContactsManager.h"
#import "PhoneNumber.h"
#import "Signal-Swift.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/Contact.h>
#import <SignalServiceKit/OWSBlockingManager.h>
#import <SignalServiceKit/SignalAccount.h>
@ -86,7 +86,7 @@ typedef void (^BlockAlertCompletionBlock)(UIAlertAction *action);
UIAlertController *actionSheetController =
[UIAlertController alertControllerWithTitle:title
message:NSLocalizedString(@"BLOCK_BEHAVIOR_EXPLANATION",
@"An explanation of the consequences of blocking another user.")
@"An explanation of the consequences of blocking another user.")
preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *unblockAction = [UIAlertAction

View File

@ -3,12 +3,14 @@
//
#import "OWSAvatarBuilder.h"
#import "JSQMessagesAvatarImageFactory.h"
#import "OWSContactAvatarBuilder.h"
#import "OWSGroupAvatarBuilder.h"
#import "TSContactThread.h"
#import "TSGroupThread.h"
#import "UIColor+OWS.h"
// SHARINGEXTENSION FIXME
// intern or reimplement this so that SignalMessaging doesn't depend on JSQ
#import <JSQMessagesViewController/JSQMessagesAvatarImageFactory.h>
NS_ASSUME_NONNULL_BEGIN
@ -21,7 +23,9 @@ NS_ASSUME_NONNULL_BEGIN
OWSAvatarBuilder *avatarBuilder;
if ([thread isKindOfClass:[TSContactThread class]]) {
TSContactThread *contactThread = (TSContactThread *)thread;
avatarBuilder = [[OWSContactAvatarBuilder alloc] initWithSignalId:contactThread.contactIdentifier diameter:diameter contactsManager:contactsManager];
avatarBuilder = [[OWSContactAvatarBuilder alloc] initWithSignalId:contactThread.contactIdentifier
diameter:diameter
contactsManager:contactsManager];
} else if ([thread isKindOfClass:[TSGroupThread class]]) {
avatarBuilder = [[OWSGroupAvatarBuilder alloc] initWithThread:(TSGroupThread *)thread];
} else {

View File

@ -4,12 +4,14 @@
#import "OWSContactAvatarBuilder.h"
#import "OWSContactsManager.h"
#import "Signal-Swift.h"
#import "TSContactThread.h"
#import "TSGroupThread.h"
#import "TSThread.h"
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import <SignalMessaging/SignalMessaging-Swift.h>
// SHARINGEXTENSION FIXME
// intern or reimplement this so that SignalMessaging doesn't depend on JSQ
#import <JSQMessagesViewController/JSQMessagesAvatarImageFactory.h>
NS_ASSUME_NONNULL_BEGIN
@ -36,12 +38,12 @@ NS_ASSUME_NONNULL_BEGIN
if (!self) {
return self;
}
_signalId = contactId;
_contactName = name;
_diameter = diameter;
_contactsManager = contactsManager;
return self;
}
@ -99,7 +101,7 @@ NS_ASSUME_NONNULL_BEGIN
[initials appendString:[firstLetter uppercaseString]];
}
}
NSRange stringRange = { 0, MIN([initials length], (NSUInteger)3) }; // Rendering max 3 letters.
initials = [[initials substringWithRange:stringRange] mutableCopy];
}
@ -108,7 +110,7 @@ NS_ASSUME_NONNULL_BEGIN
// We don't have a name for this contact, so we can't make an "initials" image
[initials appendString:@"#"];
}
CGFloat fontSize = (CGFloat)self.diameter / 2.8;
UIColor *backgroundColor = [UIColor backgroundColorForContact:self.signalId];
UIImage *image = [[JSQMessagesAvatarImageFactory avatarImageWithUserInitials:initials

View File

@ -1,5 +1,6 @@
// Created by Michael Kirk on 9/26/16.
// Copyright © 2016 Open Whisper Systems. All rights reserved.
//
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import "OWSAvatarBuilder.h"

View File

@ -5,9 +5,9 @@
#import "ThreadUtil.h"
#import "OWSContactOffersInteraction.h"
#import "OWSContactsManager.h"
#import "Signal-Swift.h"
#import "TSUnreadIndicatorInteraction.h"
#import <SignalMessaging/OWSProfileManager.h>
#import <SignalMessaging/SignalMessaging-Swift.h>
#import <SignalServiceKit/NSDate+OWS.h>
#import <SignalServiceKit/OWSAddToContactsOfferMessage.h>
#import <SignalServiceKit/OWSAddToProfileWhitelistOfferMessage.h>
@ -15,6 +15,9 @@
#import <SignalServiceKit/OWSDisappearingMessagesConfiguration.h>
#import <SignalServiceKit/OWSMessageSender.h>
#import <SignalServiceKit/OWSUnknownContactBlockOfferMessage.h>
#import <SignalServiceKit/TSAccountManager.h>
#import <SignalServiceKit/TSCall.h>
#import <SignalServiceKit/TSContactThread.h>
#import <SignalServiceKit/TSDatabaseView.h>
#import <SignalServiceKit/TSIncomingMessage.h>
#import <SignalServiceKit/TSInvalidIdentityKeyErrorMessage.h>

View File

@ -2,10 +2,10 @@
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import <SignalServiceKit/MIMETypeUtil.h>
#import "UIColor+OWS.h"
#import "UIFont+OWS.h"
#import "UIImage+OWS.h"
#import <SignalServiceKit/MIMETypeUtil.h>
typedef void (^completionBlock)(void);

View File

@ -3,6 +3,7 @@
//
#import "UIUtil.h"
#import <SignalServiceKit/AppContext.h>
#define CONTACT_PICTURE_VIEW_BORDER_WIDTH 0.5f
@ -16,14 +17,16 @@
imageView.layer.masksToBounds = YES;
}
+ (void)removeRoundedBorderToImageView:(UIImageView *__strong *)imageView {
+ (void)removeRoundedBorderToImageView:(UIImageView *__strong *)imageView
{
[[*imageView layer] setBorderWidth:0];
[[*imageView layer] setCornerRadius:0];
}
+ (completionBlock)modalCompletionBlock {
+ (completionBlock)modalCompletionBlock
{
completionBlock block = ^void() {
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[CurrentAppContext() setStatusBarStyle:UIStatusBarStyleLightContent];
};
return block;
@ -31,18 +34,18 @@
+ (void)applyDefaultSystemAppearence
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault];
[CurrentAppContext() setStatusBarStyle:UIStatusBarStyleDefault];
[[UINavigationBar appearance] setBarStyle:UIBarStyleDefault];
[[UINavigationBar appearance] setTintColor:[UIColor blackColor]];
[[UIBarButtonItem appearance] setTintColor:[UIColor blackColor]];
[[UINavigationBar appearance] setTitleTextAttributes:@{
NSForegroundColorAttributeName : [UIColor blackColor],
}];
NSForegroundColorAttributeName : [UIColor blackColor],
}];
}
+ (void)applySignalAppearence
{
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
[CurrentAppContext() setStatusBarStyle:UIStatusBarStyleLightContent];
[[UINavigationBar appearance] setBarTintColor:[UIColor ows_materialBlueColor]];
[[UINavigationBar appearance] setTintColor:[UIColor whiteColor]];
@ -54,8 +57,8 @@
// If we set NSShadowAttributeName, the NSForegroundColorAttributeName value is ignored.
[[UINavigationBar appearance] setTitleTextAttributes:@{
NSForegroundColorAttributeName : [UIColor whiteColor],
}];
NSForegroundColorAttributeName : [UIColor whiteColor],
}];
}
@end

View File

@ -36,6 +36,8 @@ An Objective-C library for communicating with the Signal messaging service.
s.prefix_header_file = 'SignalServiceKit/src/TSPrefix.h'
s.xcconfig = { 'OTHER_CFLAGS' => '$(inherited) -DSQLITE_HAS_CODEC' }
s.resources = ["SignalServiceKit/Resources/Certificates/*"]
s.dependency 'Curve25519Kit'
s.dependency 'CocoaLumberjack'
s.dependency 'AFNetworking'

View File

@ -3,7 +3,6 @@
//
#import "TSYapDatabaseObject.h"
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

View File

@ -242,8 +242,9 @@ NSUInteger const OWSSendMessageOperationMaxRetries = 4;
AssertIsOnMainThread();
// Should only be sent once per operation
OWSAssert(_backgroundTaskIdentifier == UIBackgroundTaskInvalid);
OWSAssert(backgroundTaskIdentifier != UIBackgroundTaskInvalid);
// FIXME SHARINGEXTENSION
// OWSAssert(_backgroundTaskIdentifier == UIBackgroundTaskInvalid);
// OWSAssert(backgroundTaskIdentifier != UIBackgroundTaskInvalid);
_backgroundTaskIdentifier = backgroundTaskIdentifier;
}

View File

@ -265,7 +265,8 @@ NSString *const kNSNotificationName_IsCensorshipCircumventionActiveDidChange =
return nil;
}
NSString *path = [NSBundle.mainBundle pathForResource:name ofType:@"crt"];
NSBundle *bundle = [NSBundle bundleForClass:self.class];
NSString *path = [bundle pathForResource:name ofType:@"crt"];
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
OWSFail(@"%@ Missing certificate for name: %@", self.logTag, name);
*error = OWSErrorMakeAssertionError();

View File

@ -1,6 +1,5 @@
//
// Created by Fred on 01/09/15.
// Copyright © 2015 Open Whisper Systems. All rights reserved.
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
//
#import "OWSHTTPSecurityPolicy.h"
@ -40,7 +39,9 @@
}
- (SecCertificateRef)certificateForService:(NSString *)service {
NSString *path = [NSBundle.mainBundle pathForResource:service ofType:@"cer"];
NSBundle *bundle = [NSBundle bundleForClass:self.class];
NSString *path = [bundle pathForResource:service ofType:@"cer"];
if (![[NSFileManager defaultManager] fileExistsAtPath:path]) {
@throw [NSException

View File

@ -30,6 +30,7 @@ typedef void (^BackgroundTaskExpirationHandler)(void);
- (void)setMainAppBadgeNumber:(NSInteger)value;
- (BOOL)isRTL;
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle;
// Returns the VC that should be used to present alerts, modals, etc.
- (nullable UIViewController *)frontmostViewController;

View File

@ -9,6 +9,7 @@ import PureLayout
// All Observer methods will be invoked from the main thread.
protocol SAELoadViewDelegate: class {
func shareExtensionWasCancelled()
func shareExtensionIsReady()
}
class SAELoadViewController: UIViewController {
@ -65,6 +66,14 @@ class SAELoadViewController: UIViewController {
activityIndicator.startAnimating()
}
override func viewDidAppear(_ animated: Bool) {
// FIXME not until ready, and ideally before view appears to avoid any "loading flicker"
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
Logger.error("Simulating readiness...")
self.delegate?.shareExtensionIsReady()
}
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)

View File

@ -7,6 +7,7 @@ import UIKit
import SignalMessaging
import PureLayout
import SignalServiceKit
import PromiseKit
@objc
public class ShareViewController: UINavigationController, SAELoadViewDelegate, SAEFailedViewDelegate {
@ -347,4 +348,70 @@ public class ShareViewController: UINavigationController, SAELoadViewDelegate, S
public func shareExtensionWasCancelled() {
self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
}
public func shareExtensionIsReady() {
self.presentConversationPicker()
}
// MARK: Helpers
private func presentConversationPicker() {
let conversationPicker = SendExternalFileViewController()
buildAttachment().then { attachment -> Void in
conversationPicker.attachment = attachment
self.pushViewController(conversationPicker, animated: false)
Logger.info("presented conversation picker with attachment")
}.catch { error in
owsFail("\(self.logTag) building attachment failed with error: \(error)")
}.retainUntilComplete()
}
enum ShareViewControllerError: Error {
case assertionError(description: String)
}
private func buildAttachment() -> Promise<SignalAttachment> {
guard let inputItem: NSExtensionItem = self.extensionContext?.inputItems.first as? NSExtensionItem else {
let error = ShareViewControllerError.assertionError(description: "no input item")
return Promise(error: error)
}
// TODO Multiple attachments. In that case I'm unclear if we'll
// be given multile inputItems or a signle inputItem with multiple attachments.
guard let itemProvider: NSItemProvider = inputItem.attachments?.first as? NSItemProvider else {
let error = ShareViewControllerError.assertionError(description: "No item provider in input item attachments")
return Promise(error: error)
}
Logger.info("\(self.logTag) attachment: \(itemProvider)")
guard itemProvider.hasItemConformingToTypeIdentifier(kUTTypeJPEG as String) else {
let error = ShareViewControllerError.assertionError(description: "only supporting jpegs for now")
return Promise(error: error)
}
let (promise, fulfill, reject) = Promise<UIImage>.pending()
// TODO accept other data types
// TODO whitelist attachment types
// TODO coerce when necessary and possible
itemProvider.loadPreviewImage(options: nil,
completionHandler: { (previewImage, error) in
guard error == nil else {
reject(error!)
return
}
guard let image = previewImage as? UIImage else {
let unexpectedTypeError = ShareViewControllerError.assertionError(description: "unexpected item type: \(String(describing: previewImage))")
reject(unexpectedTypeError)
return
}
fulfill(image)
})
return promise.then { (image: UIImage) in
return SignalAttachment.imageAttachment(image: image, dataUTI: kUTTypeJPEG as String, filename: "from-share-extension-2345")
}
}
}

View File

@ -53,6 +53,11 @@ NS_ASSUME_NONNULL_BEGIN
== NSLocaleLanguageDirectionRightToLeft;
}
- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle
{
DDLogInfo(@"Ignoring request to set status bar style since we're in an app extension");
}
- (UIApplicationState)mainApplicationState
{
OWSFail(@"%@ called %s.", self.logTag, __PRETTY_FUNCTION__);