Compare commits

...

167 Commits

Author SHA1 Message Date
Christine Corbett
26fb5cbcf4 groups and calls have optional avatar; consumer must specify that it should be used and provide images in project of naming convention. otherwise no image will be used 2015-01-27 22:53:25 -10:00
Christine Corbett
c8262eee36 calls and group update messages now blue styled in correct font 2015-01-25 19:10:42 -10:00
Joyce Yan
184f53b07b Design tweaks based on @abolishme's work. 2015-01-24 08:31:23 -10:00
dtsbourg
ed9858bd6d revert b73b5d 2014-12-29 23:48:01 +01:00
dtsbourg
9dffc05aa7 Merge branch 'FredericJacobs-JSignalQ' into JSignalQ 2014-12-29 22:07:24 +01:00
Frederic Jacobs
cb5c4facbc Removing unused properties + bug fix call label 2014-12-29 21:56:58 +01:00
dtsbourg
84d1b659f3 Typo fix 2014-12-29 21:21:19 +01:00
dtsbourg
b73b5d9983 Performance enhancement for collection view reloading 2014-12-29 19:25:29 +01:00
dtsbourg
6a30411791 Merge remote-tracking branch 'jsq/master' into JSignalQ-6.1.1 2014-12-23 18:04:39 +01:00
Jesse Squires
395b1342a9 unit tests and refinements 2014-12-19 17:41:19 -05:00
Jesse Squires
ea3b8cc6fc bump version numbers 2014-12-19 16:44:57 -05:00
Jesse Squires
697c839c80 clean up from PR #644 code review 2014-12-19 16:39:26 -05:00
Jesse Squires
d6c9dd0ce9 Merge pull request #644 from evilstudios/develop
fix #480: scrollToBottomAnimated: fix long message handling
2014-12-19 16:13:44 -05:00
Jesse Squires
16c42a11e5 fix #648. fix #646. close #649. 2014-12-19 16:03:56 -05:00
Jesse Squires
9980266b62 address code review comments from PR #646, ref #645, #314, #640 2014-12-19 15:42:21 -05:00
Jesse Squires
38c14c19e7 Merge pull request #646 from evilstudios/keyboard-notification-fix
Fix #645: add 'keyboardDidHide' notification handling
2014-12-19 15:33:04 -05:00
Jesse Squires
736d110eba Update README.md 2014-12-14 18:16:49 -05:00
Jesse Squires
7c57677738 fix keyboard dismissal and firstResponder bugs. close #640. close #510. 2014-12-14 16:12:07 -05:00
Jesse Squires
69e2518345 add assert to didPressAccessoryButton: 2014-12-13 17:35:05 -05:00
Jesse Squires
3a50f7f9c2 clean up from PR #651. update docs. 2014-12-13 17:34:03 -05:00
Jesse Squires
6e4857ab8d Merge pull request #651 from deepakraj89/Fix_ScrollAnimation
Fix for Scroll Animation (close #515)
2014-12-13 17:13:19 -05:00
Jesse Squires
260e51ce2c update README for customizing toolbar buttons. close #669 2014-12-13 17:10:54 -05:00
Jesse Squires
a81bfa2277 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2014-12-13 16:57:02 -05:00
Jesse Squires
847f49e6e7 add button customization comments to demo. #669 2014-12-13 16:56:53 -05:00
dtsbourg
8703ce020c JSQDisplayedMessage: implement tap delegate 2014-12-10 21:45:29 +01:00
Jesse Squires
7d8cd7b867 Merge pull request #673 from ranunez/develop
Updated link in README for updated iOS 6 adoption stats
2014-12-09 15:37:59 -08:00
Ricardo Nunez
8d9f241038 Updated link in README for updated iOS 6 adoption stats 2014-12-09 15:16:40 -08:00
dtsbourg
fcbbfdc43f Fix crash on long tap on error and info messages 2014-12-09 22:37:56 +01:00
Jesse Squires
66fb14161d Update README.md 2014-12-08 00:29:00 -08:00
dtsbourg
bc976a04d9 Cells: change isKindOfClass to messageType check 2014-12-07 14:42:27 +01:00
Jesse Squires
4ab13ad7ac Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2014-12-07 01:58:34 -08:00
Jesse Squires
d5f8d4291b proj settings 2014-12-06 17:09:40 -08:00
dtsbourg
43f6e75bbf Set adapter type as property 2014-12-06 18:23:03 +01:00
dtsbourg
59ea2b6920 Revert to TSMessageAdapterType for naming to avoid conflicts 2014-12-06 16:57:31 +01:00
dtsbourg
dee758a3ff TSMessageType added to JSQMessageData 2014-12-06 16:52:16 +01:00
Jesse Squires
17153bdd38 add migration section to README. close #663 2014-12-04 22:19:25 -08:00
dtsbourg
82482a1fc5 Remove call button on toolbar 2014-12-04 16:11:34 +01:00
Deepak
442b597c95 More refactoring to the newly added methods 2014-12-01 22:32:58 -08:00
Jesse Squires
1bb258691b Merge pull request #655 from evermeer/patch-1
Update README. Added EVCloudKitDao as app using this library.
2014-12-01 00:45:54 -08:00
dtsbourg
7c2cec63f9 Remove unnecessary res 2014-11-30 19:55:56 +01:00
dtsbourg
91fbb4dce7 JSQDisplayedMessage: Update UI 2014-11-30 19:55:27 +01:00
Edwin Vermeer
681b6d329b Added EVCloudKitDao as app using this library.
EVCloudKitDao is a library for simplified access to CloudKit. As a sample there is a fully functional chat demo included which is using this library
2014-11-30 17:28:26 +01:00
dtsbourg
0d8fabe142 Calls: Update UI 2014-11-30 16:51:24 +01:00
dtsbourg
4049f54789 JSQDisplayedMessage: Link to UI 2014-11-29 15:30:53 +01:00
dtsbourg
54ae40b07a JSQDisplayedMessageCollectionViewCell: Base class 2014-11-29 15:06:43 +01:00
dtsbourg
bcf0ac6e1f JSQErrorMessage: Model 2014-11-29 14:48:59 +01:00
dtsbourg
e70cec697f JSQDisplayedMessage: Model + JSQInfoMessage: Model 2014-11-29 14:39:59 +01:00
Deepak
7234f10f81 Added two public methods to control collectionview scroll animation 2014-11-28 13:13:26 -08:00
Deepak
fd7f27b74b Fix for Scroll Animation 2014-11-27 11:57:04 -08:00
dtsbourg
b22b7a4caf JSQMessagesBubbleImageFactory: Add a failed message bubble 2014-11-27 12:43:24 +01:00
dtsbourg
b8b3fb9122 JSQMessageData: add message status field 2014-11-27 12:29:49 +01:00
dtsbourg
5fc12f5cba Merge branch 'master' of https://github.com/jessesquires/JSQMessagesViewController into JSignalQ 2014-11-26 18:04:32 +01:00
dtsbourg
4cad607ae2 none 2014-11-26 18:01:19 +01:00
Sean Conrad
276e9f94a6 add 'keyboardDidHide' notification handling
:: JSQMessagesKeyboardControllerDelegate protocol adds options `keyboardControllerDidReceiveKeyboardHideNotification:` method
:: this method is called within the completion block of the typical keyboard frame change notification handler, ensuring that the 'hide' message is received last
:: `JSQMessagesViewController` uses this delegate callback to call `jsq_setToolbarBottomLayoutGuideConstant:` with a value of `0.0f` (ensuring that a 'hidden' keyboard results in a 0-position input toolbar)
2014-11-25 18:24:30 -08:00
Sean Conrad
6a04d7585d improve layout for smaller cells
in some cases, `Top` alignment is best - this commit handles those cases
2014-11-25 16:02:44 -08:00
Sean Conrad
28b17896cc scrollToBottomAnimated: fix long message handling
fixes #480
2014-11-25 15:08:37 -08:00
Jesse Squires
8f28bc513e v6.1.0 2014-11-23 16:43:10 -08:00
Jesse Squires
512d2a9394 fix semantics regarding avatarPlaceholderImage and avatarHighlightedImage. close #624 2014-11-23 16:29:19 -08:00
Jesse Squires
81488d5ee6 add an emptyCache property to invalidation context for explicitly clearing the cache via invalidation. close #633 2014-11-23 16:20:49 -08:00
Jesse Squires
08ebf9b608 Update README.md 2014-11-23 12:39:09 -08:00
Jesse Squires
56f0d40214 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2014-11-22 13:47:03 -08:00
Jesse Squires
5d83de37cd expose left and right bar button container views. update docs. close #634 2014-11-22 13:46:31 -08:00
Jesse Squires
2626e8419b make hash required for message data protocols. close #631 2014-11-22 13:21:50 -08:00
dtsbourg
597670e446 JSQCallCollectionViewCell: UI 2014-11-21 23:01:16 +01:00
dtsbourg
881ddddeb4 Demo: make JSQM6.0 work with JSQCall 2014-11-21 22:14:53 +01:00
dtsbourg
32395453ff Finish merging 2014-11-21 13:43:21 +01:00
dtsbourg
5c6dce5a04 Fix merge from master conflicts 2014-11-21 13:37:28 +01:00
dtsbourg
3d248e4af0 JSQCall : layout 2014-11-21 12:02:20 +01:00
dtsbourg
6bbef1949b JSQCall model 2014-11-20 14:57:18 +01:00
dtsbourg
1031a89858 JSQMessage: Add failed state 2014-11-20 10:10:55 +01:00
dtsbourg
21d877492e InputToolbar: blue BarButtonItems 2014-11-19 13:05:35 +01:00
dtsbourg
5670accd2c General: Font update 2014-11-18 18:05:24 +01:00
dtsbourg
d138d4f3a3 InputToolbar: Fine tune enabling on rightBarButtonItem 2014-11-17 20:41:08 +01:00
dtsbourg
cddbbf2c75 InputToolbar: Bar button item always responds to tap events 2014-11-17 20:27:57 +01:00
dtsbourg
104ba0e023 MessageStatus: add kMessageNone status 2014-11-17 20:22:59 +01:00
dtsbourg
a27fa1091e Test: Custom UIButton in factory 2014-11-17 20:17:08 +01:00
Jesse Squires
a7a9cd7c64 Update README.md 2014-11-12 20:50:36 -08:00
dtsbourg
7446b63cbb remove * 2014-11-12 22:31:22 +01:00
dtsbourg
73482f6ace ≈Merge branch 'issue_492_scrollviewperformance' into JSignalQ 2014-11-12 22:26:40 +01:00
dtsbourg
2dad6e3036 add message status 2014-11-12 22:22:59 +01:00
Jesse Squires
b20af9e524 Merge pull request #618 from ranunez/develop
Updated link in README to reflect new stats on iOS 6 adoption
2014-11-11 22:28:42 -08:00
Ricardo Nunez
5ba9d2ee09 Updated link in README to reflect new stats on iOS 6 adoption 2014-11-11 21:45:31 -08:00
Jesse Squires
fe0540167b force toolbar to dismiss to bottom of view on viewDidDisappear. fix #314 2014-11-11 18:32:01 -08:00
Jesse Squires
45ce02baa6 remove todo 2014-11-11 18:05:31 -08:00
Jesse Squires
7722bce9d8 fix pod spec 2014-11-09 15:11:39 -08:00
Jesse Squires
ea74142adb Update README.md 2014-11-09 13:27:27 -08:00
Jesse Squires
ae9869d7ff update screenshots and spec 2014-11-09 13:25:50 -08:00
Jesse Squires
36b066fbdc Update README.md 2014-11-09 13:14:56 -08:00
Jesse Squires
387a7544b3 update pod spec 2014-11-09 13:11:12 -08:00
Jesse Squires
484a4b59bd update screenshots 2014-11-09 13:09:59 -08:00
Jesse Squires
f6e96e9a07 add message bubble red color 2014-11-09 12:21:36 -08:00
Jesse Squires
cdc86cc0a3 Update README.md 2014-11-09 12:08:58 -08:00
Jesse Squires
03b74fe77e Update README.md 2014-11-09 11:37:39 -08:00
Jesse Squires
280ff293f1 Update README.md 2014-11-09 11:21:25 -08:00
Jesse Squires
3b8cf0fa35 Update README.md 2014-11-09 11:20:14 -08:00
Jesse Squires
591e9198bb fix version numbers 2014-11-09 11:10:39 -08:00
Jesse Squires
0d20dadb8e refactor JSQMessage hierarchy. remove Text and Media subclasses, absorb into single JSQMessage class. close #602 2014-11-09 10:58:04 -08:00
Jesse Squires
72a4b5b970 adjust input toolbar layout and button sizes. 2014-11-07 19:27:50 -08:00
Jesse Squires
b291898161 fix toolbar constraints and correctly size send button to fit text. close #603 2014-11-07 19:13:36 -08:00
Jesse Squires
5627228464 expose cache countLimit. set default to 200. ref: #492 2014-11-07 18:18:46 -08:00
Jesse Squires
4281751534 verify outlets. close #604 2014-11-07 18:06:27 -08:00
Jesse Squires
c81aa93726 subclass text view to prevent unwanted text selection. close #591 2014-11-04 22:56:39 -08:00
Jesse Squires
468e102a7c minor optimizations 2014-11-04 22:26:36 -08:00
Jesse Squires
b3a80d9afc minor optimizations 2014-11-04 22:25:03 -08:00
Jesse Squires
dbfe58fc6d revert 4aedb06. close #597. cc: #484. sad face. 2014-11-04 21:35:04 -08:00
Jesse Squires
2070cde22d implement better message bubble size caching in layout for scrolling performance. #492 2014-11-02 20:17:54 -08:00
Jesse Squires
e99b127694 fix scroll position #256 2014-11-02 20:13:47 -08:00
Jesse Squires
08a9ec95fa fix message hashes 2014-11-02 19:56:42 -08:00
Jesse Squires
0d8667d14e fix issue where scroll to bottom fails until contentSize is at least a certain height. close #256 2014-11-02 19:36:40 -08:00
Jesse Squires
5c8dee520c Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2014-11-02 19:13:40 -08:00
Jesse Squires
42c29ce4a1 fix auto layout constraint issues and warnings. set bubble width instead of margin. close #584, close #322 2014-11-02 19:13:05 -08:00
Jesse Squires
66a7d47ff3 edit cell 2014-11-02 18:22:27 -08:00
Jesse Squires
049035cdb6 Update README.md 2014-11-02 01:19:41 -07:00
Jesse Squires
4aedb062cc remove FIXME for radar 18326340. issue has been resolved as of Xcode 6.1 ref #484 2014-11-01 15:44:58 -07:00
Jesse Squires
c0edc6f7aa fix tests 2014-10-30 22:32:41 -07:00
Jesse Squires
9b579e91b9 fix composer text view insets. prevent single-line scrolling. fix #559 2014-10-30 21:40:27 -07:00
Jesse Squires
e88501ed61 prevent cell tap delegate methods from being called with a nil indexPath. fix #586 2014-10-30 21:36:43 -07:00
Jesse Squires
49f2c24533 fix #589. update insets when setting topContentAdditional inset 2014-10-30 21:33:17 -07:00
Jesse Squires
74965225f0 Merge pull request #585 from dtsbourg/issue_492_scrollviewperformance
Rasterize collection view cell for scrolling performance, ref #492
2014-10-28 17:20:45 -07:00
dtsbourg
99971a8d38 Merge branch 'JSignalQ' of https://github.com/dtsbourg/JSQMessagesViewController into JSignalQ 2014-10-28 23:39:44 +01:00
dtsbourg
da7203dee2 [UIColor whiteColor] 2014-10-28 23:37:11 +01:00
dtsbourg
88e16ac830 white bg ? 2014-10-28 23:37:11 +01:00
dtsbourg
41dddfea3a cell xib white bg 2014-10-28 23:37:11 +01:00
dtsbourg
ebea4ef0b8 Restore white bg 2014-10-28 23:37:11 +01:00
dtsbourg
f115194efa Signal 2014-10-28 23:37:11 +01:00
dtsbourg
39393e4b8b Rasterize collection view cell for scrolling performance 2014-10-28 23:36:27 +01:00
dtsbourg
06e7c2bec9 [UIColor whiteColor] 2014-10-28 22:51:14 +01:00
dtsbourg
6dded2cce9 white bg ? 2014-10-28 22:28:47 +01:00
dtsbourg
f03bac13a0 cell xib white bg 2014-10-28 22:23:39 +01:00
dtsbourg
33b81ca6b0 Restore white bg 2014-10-28 22:19:28 +01:00
dtsbourg
752edc4f0f Signal 2014-10-28 21:49:55 +01:00
Jesse Squires
71acc85bb4 Update README.md 2014-10-25 15:59:40 -07:00
Jesse Squires
3868620d62 Update README.md 2014-10-25 15:45:16 -07:00
Jesse Squires
58e4ac6624 fix #422 2014-10-25 15:34:22 -07:00
Jesse Squires
b5b6e8c2af update version numbers 2014-10-20 23:23:09 -07:00
Jesse Squires
065d60d997 update umbrella header 2014-10-20 23:22:03 -07:00
Jesse Squires
3f0f52f704 more unit test refinements 2014-10-20 23:17:14 -07:00
Jesse Squires
188ab824b8 refine category unit tests. update image category for asset methods. 2014-10-20 23:07:35 -07:00
Jesse Squires
e2b62c4996 change JSQVideoMediaItem to inherit from JSQMediaItem. mask JSQVideoMediaItem. closes #571. 2014-10-20 22:32:17 -07:00
Jesse Squires
1af170b983 change JSQLocationMediaItem to inherit from JSQMediaItem. mask JSQLocationMediaItem. #571 2014-10-20 22:23:35 -07:00
Jesse Squires
b590303a4f new abstract base class, JSQMediaItem, for pulling out common media item behavior. refactor JSQPhotoMediaItem to inherit from JSQMediaItem. #571 2014-10-20 22:08:23 -07:00
Jesse Squires
a38125e726 mask media views for JSQPhotoMediaItem. ref #571 2014-10-20 21:26:05 -07:00
Jesse Squires
b75870a241 add convenience method to JSQMessagesMediaViewBubbleImageMasker. #571 2014-10-20 21:06:16 -07:00
Jesse Squires
d4a5bc6d09 add new JSQMessagesMediaViewBubbleImageMasker. ref #571 2014-10-20 20:22:44 -07:00
Jesse Squires
da92497d42 update default map region span to 500 meters 2014-10-20 18:44:25 -07:00
Jesse Squires
6f7f318bcd update pods 2014-10-20 18:35:33 -07:00
Jesse Squires
45549628ae more edits for #563 2014-10-19 23:34:07 -07:00
Jesse Squires
02fdee07d0 Allow using a custom nib. ref #563 2014-10-19 23:30:29 -07:00
Jesse Squires
005378f8f3 update demo 2014-10-19 18:44:01 -07:00
Jesse Squires
0638d8caf2 refactor assets directory. use asset bundle. update categories for bundle. update tests 2014-10-19 18:22:22 -07:00
Jesse Squires
a023fee709 complete localization! close #237 whoo! :) 2014-10-19 17:22:42 -07:00
Jesse Squires
f201b085e3 add new empty strings file. ref #237 2014-10-19 16:33:29 -07:00
Jesse Squires
a56ceebdd3 use new collection view layout size helper method. cap label heights and avatar sizes constraints to 1.0 to fix auto-layout warnings. ref #322 2014-10-19 15:49:27 -07:00
Jesse Squires
f914b81044 new flow layout item size helper method 2014-10-19 15:27:29 -07:00
Jesse Squires
639df113ff improve scrolling performance. we don't need to keep calling setNeedsUpdateConstraints. ref #492. 2014-10-19 15:09:02 -07:00
Jesse Squires
3954411213 prepareForReuse 2014-10-19 14:39:18 -07:00
Jesse Squires
3e8a3cbfc1 add spec to project 2014-10-19 14:02:12 -07:00
Jesse Squires
833cf417f5 update JSQLocationMediaItem to specify a custom map region. close #565 2014-10-19 12:18:50 -07:00
Jesse Squires
3684895342 minor fixes 2014-10-19 11:22:08 -07:00
Jesse Squires
dee7714d9e re-add video item 2014-10-19 11:15:31 -07:00
Jesse Squires
dd9458a70f remove video item 2014-10-19 11:14:39 -07:00
Jesse Squires
d85c94e57f fix JSQVideoMediaItem typo. close #570 2014-10-19 11:12:58 -07:00
Jesse Squires
454be29f8d revert @import for #import. fix #541 2014-10-15 21:16:47 -07:00
Jesse Squires
d0fd6e58ec refactor 2014-10-15 21:08:36 -07:00
Jesse Squires
3b159c1df9 Merge pull request #560 from ghazel/menu_disable_scroll_554
don't scroll if the menu is visible. fix #554
2014-10-15 21:00:04 -07:00
Jesse Squires
33e780e535 adjust bubble size calculations. fix #553. 2014-10-15 20:57:13 -07:00
Greg Hazel
ddca80232a don't scroll if the menu is visible 2014-10-14 20:14:20 -07:00
182 changed files with 3886 additions and 1360 deletions

View File

@ -10,12 +10,8 @@
36CF33BD29CF36EB06D0CCFD /* libPods-JSQMessagesTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 782026E9E518622532ED474D /* libPods-JSQMessagesTests.a */; };
77CC17A895E6E12BC9CB549A /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E6750B77E8A7042BA0754B /* libPods.a */; };
88078A9D19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */; };
88078AA119D8FFEA005B4595 /* clip.png in Resources */ = {isa = PBXBuildFile; fileRef = 88078A9E19D8FFEA005B4595 /* clip.png */; };
88078AA219D8FFEA005B4595 /* clip@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88078A9F19D8FFEA005B4595 /* clip@2x.png */; };
88078AA319D8FFEA005B4595 /* clip@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88078AA019D8FFEA005B4595 /* clip@3x.png */; };
88078AA719D9034F005B4595 /* typing@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88078AA419D9034F005B4595 /* typing@3x.png */; };
88078AA819D9034F005B4595 /* typing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88078AA519D9034F005B4595 /* typing@2x.png */; };
88078AA919D9034F005B4595 /* typing.png in Resources */ = {isa = PBXBuildFile; fileRef = 88078AA619D9034F005B4595 /* typing.png */; };
88324C3419F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88324C3319F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m */; };
883C11781A09FB100092A16D /* JSQMessagesCellTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */; };
88445B3119E0AE3F0014F889 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3019E0AE3F0014F889 /* UIKit.framework */; };
88445B3319E0AE450014F889 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3219E0AE450014F889 /* Foundation.framework */; };
88445B3519E0AE4A0014F889 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3419E0AE4A0014F889 /* CoreGraphics.framework */; };
@ -30,18 +26,9 @@
88445B4419E1B5110014F889 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4319E1B5110014F889 /* MapKit.framework */; };
88445B4519E1B5210014F889 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4119E1B50B0014F889 /* CoreLocation.framework */; };
88445B4619E1B5290014F889 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4319E1B5110014F889 /* MapKit.framework */; };
8846441819EB15B2001EBA43 /* bubble_stroked@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441419EB15B2001EBA43 /* bubble_stroked@3x.png */; };
8846441919EB15B2001EBA43 /* bubble_min_tailless@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441519EB15B2001EBA43 /* bubble_min_tailless@3x.png */; };
8846441A19EB15B2001EBA43 /* bubble_min@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441619EB15B2001EBA43 /* bubble_min@3x.png */; };
8846441B19EB15B2001EBA43 /* bubble_stroked_tailless@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441719EB15B2001EBA43 /* bubble_stroked_tailless@3x.png */; };
8846441F19EB17CF001EBA43 /* play@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441C19EB17CF001EBA43 /* play@3x.png */; };
8846442019EB17CF001EBA43 /* play@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441D19EB17CF001EBA43 /* play@2x.png */; };
8846442119EB17CF001EBA43 /* play.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846441E19EB17CF001EBA43 /* play.png */; };
8846442519EB1830001EBA43 /* bubble@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846442319EB1830001EBA43 /* bubble@3x.png */; };
8846442719EB189E001EBA43 /* bubble_tailless@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846442619EB189E001EBA43 /* bubble_tailless@3x.png */; };
8846442A19EB18A5001EBA43 /* bubble_tailless@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846442819EB18A5001EBA43 /* bubble_tailless@2x.png */; };
8846442B19EB18A5001EBA43 /* bubble_tailless.png in Resources */ = {isa = PBXBuildFile; fileRef = 8846442919EB18A5001EBA43 /* bubble_tailless.png */; };
8846442E19EB2BF4001EBA43 /* JSQVideoMediaitem.m in Sources */ = {isa = PBXBuildFile; fileRef = 8846442D19EB2BF4001EBA43 /* JSQVideoMediaitem.m */; };
8861666D19F492B70025B958 /* JSQMessagesAssets.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */; };
886C33FD19F4371E006B4997 /* JSQVideoMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 886C33FC19F4371E006B4997 /* JSQVideoMediaItem.m */; };
886C33FF19F45E30006B4997 /* JSQMessagesViewController.podspec in Resources */ = {isa = PBXBuildFile; fileRef = 886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */; };
886FFD2E19E9A65D00EB8485 /* UIDevice+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 886FFD2D19E9A65D00EB8485 /* UIDevice+JSQMessages.m */; };
8885734A19DE540400E89D20 /* DemoSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8885734919DE540400E89D20 /* DemoSettingsViewController.m */; };
8885734D19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m in Sources */ = {isa = PBXBuildFile; fileRef = 8885734C19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m */; };
@ -49,14 +36,6 @@
88A25F3919D8DF2500924534 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F3019D8DF2500924534 /* Main.storyboard */; };
88A25F3A19D8DF2500924534 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F3219D8DF2500924534 /* Images.xcassets */; };
88A25F3C19D8DF2500924534 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F3419D8DF2500924534 /* main.m */; };
88A25FA319D8E01A00924534 /* bubble.png in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F4119D8E01A00924534 /* bubble.png */; };
88A25FA419D8E01A00924534 /* bubble@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F4219D8E01A00924534 /* bubble@2x.png */; };
88A25FA519D8E01A00924534 /* bubble_min.png in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F4319D8E01A00924534 /* bubble_min.png */; };
88A25FA619D8E01A00924534 /* bubble_min@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F4419D8E01A00924534 /* bubble_min@2x.png */; };
88A25FA719D8E01A00924534 /* bubble_min_tailless.png in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F4519D8E01A00924534 /* bubble_min_tailless.png */; };
88A25FA819D8E01A00924534 /* bubble_min_tailless@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F4619D8E01A00924534 /* bubble_min_tailless@2x.png */; };
88A25FB319D8E01A00924534 /* message_received.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F5219D8E01A00924534 /* message_received.aiff */; };
88A25FB419D8E01A00924534 /* message_sent.aiff in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F5319D8E01A00924534 /* message_sent.aiff */; };
88A25FB519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5619D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m */; };
88A25FB619D8E01A00924534 /* NSString+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */; };
88A25FB719D8E01A00924534 /* UIColor+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */; };
@ -72,18 +51,14 @@
88A25FC119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m */; };
88A25FC219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7319D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m */; };
88A25FC319D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7519D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m */; };
88A25FC419D8E01A00924534 /* JSQMediaMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7819D8E01A00924534 /* JSQMediaMessage.m */; };
88A25FC519D8E01A00924534 /* JSQMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F7A19D8E01A00924534 /* JSQMessage.m */; };
88A25FC619D8E01A00924534 /* JSQMessagesAvatarImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8019D8E01A00924534 /* JSQMessagesAvatarImage.m */; };
88A25FC719D8E01A00924534 /* JSQMessagesBubbleImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8219D8E01A00924534 /* JSQMessagesBubbleImage.m */; };
88A25FC819D8E01A00924534 /* JSQPhotoMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.m */; };
88A25FC919D8E01A00924534 /* JSQTextMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8819D8E01A00924534 /* JSQTextMessage.m */; };
88A25FCA19D8E01A00924534 /* JSQMessagesCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */; };
88A25FCB19D8E01A00924534 /* JSQMessagesCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */; };
88A25FCC19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */; };
88A25FCD19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9019D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib */; };
88A25FCE19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */; };
88A25FCF19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9319D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib */; };
88A25FD019D8E01A00924534 /* JSQMessagesComposerTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */; };
88A25FD119D8E01A00924534 /* JSQMessagesInputToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9719D8E01A00924534 /* JSQMessagesInputToolbar.m */; };
88A25FD219D8E01A00924534 /* JSQMessagesLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9919D8E01A00924534 /* JSQMessagesLabel.m */; };
@ -108,11 +83,10 @@
88A2600A19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FEE19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m */; };
88A2600B19D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF019D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m */; };
88A2600C19D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF119D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m */; };
88A2600D19D8E18400924534 /* JSQMediaMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF319D8E18400924534 /* JSQMediaMessageTests.m */; };
88A2600D19D8E18400924534 /* JSQMessageMediaTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */; };
88A2600E19D8E18400924534 /* JSQMessagesAvatarImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */; };
88A2600F19D8E18400924534 /* JSQMessagesBubbleImageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF519D8E18400924534 /* JSQMessagesBubbleImageTests.m */; };
88A2601019D8E18400924534 /* JSQMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF619D8E18400924534 /* JSQMessageTests.m */; };
88A2601119D8E18400924534 /* JSQTextMessageTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF719D8E18400924534 /* JSQTextMessageTests.m */; };
88A2601019D8E18400924534 /* JSQMessageTextTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF619D8E18400924534 /* JSQMessageTextTests.m */; };
88A2601219D8E18400924534 /* JSQMessagesCollectionViewCellTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FF919D8E18400924534 /* JSQMessagesCollectionViewCellTests.m */; };
88A2601319D8E18400924534 /* JSQMessagesCollectionViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFA19D8E18400924534 /* JSQMessagesCollectionViewTests.m */; };
88A2601419D8E18400924534 /* JSQMessagesComposerTextViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFB19D8E18400924534 /* JSQMessagesComposerTextViewTests.m */; };
@ -122,11 +96,30 @@
88A2601819D8E18400924534 /* JSQMessagesToolbarContentViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FFF19D8E18400924534 /* JSQMessagesToolbarContentViewTests.m */; };
88A2601919D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A2600019D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m */; };
88A2601B19D8E45600924534 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 88A2601A19D8E45600924534 /* Info.plist */; };
88AE58ED19E77FBF0042B0DE /* bubble_stroked_tailless.png in Resources */ = {isa = PBXBuildFile; fileRef = 88AE58E919E77FBF0042B0DE /* bubble_stroked_tailless.png */; };
88AE58EE19E77FBF0042B0DE /* bubble_stroked_tailless@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88AE58EA19E77FBF0042B0DE /* bubble_stroked_tailless@2x.png */; };
88AE58EF19E77FBF0042B0DE /* bubble_stroked.png in Resources */ = {isa = PBXBuildFile; fileRef = 88AE58EB19E77FBF0042B0DE /* bubble_stroked.png */; };
88AE58F019E77FBF0042B0DE /* bubble_stroked@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 88AE58EC19E77FBF0042B0DE /* bubble_stroked@2x.png */; };
88A901B619F618B100F99777 /* JSQMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A901B519F618B100F99777 /* JSQMediaItem.m */; };
88C00A4E1A44D4C600B004B3 /* JSQLocationMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */; };
88C00A501A44D4D800B004B3 /* JSQPhotoMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C00A4F1A44D4D800B004B3 /* JSQPhotoMediaItemTests.m */; };
88C00A521A44D4E500B004B3 /* JSQVideoMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C00A511A44D4E500B004B3 /* JSQVideoMediaItemTests.m */; };
88C4583019F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */; };
88E4D7131A0DBD6B000CC061 /* JSQMessages.strings in Resources */ = {isa = PBXBuildFile; fileRef = 8841B88719F4988800EA16B6 /* JSQMessages.strings */; };
94A4FA20C2FBD0D62614D5A8 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 97E6750B77E8A7042BA0754B /* libPods.a */; };
FC15B7A91A1E880900F59801 /* JSQCallCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7A81A1E880900F59801 /* JSQCallCollectionViewCell.xib */; };
FC15B7B01A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */; };
FC15B7B11A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */ = {isa = PBXBuildFile; fileRef = FC15B7AF1A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib */; };
FC4FA03A1A1E1BD100DA100A /* JSQCall.m in Sources */ = {isa = PBXBuildFile; fileRef = FC4FA0391A1E1BD100DA100A /* JSQCall.m */; };
FC4FA03D1A1E81AF00DA100A /* JSQCallCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FC4FA03C1A1E81AF00DA100A /* JSQCallCollectionViewCell.m */; };
FCA52AEF1A2B6ECE00CCADFA /* call_missed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AEE1A2B6ECE00CCADFA /* call_missed@2x.png */; };
FCA52AF51A2B6FAE00CCADFA /* call_canceled@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF11A2B6FAE00CCADFA /* call_canceled@2x.png */; };
FCA52AF61A2B6FAE00CCADFA /* call_failed@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF21A2B6FAE00CCADFA /* call_failed@2x.png */; };
FCA52AF71A2B6FAE00CCADFA /* call_incoming@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF31A2B6FAE00CCADFA /* call_incoming@2x.png */; };
FCA52AF81A2B6FAE00CCADFA /* call_outgoing@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52AF41A2B6FAE00CCADFA /* call_outgoing@2x.png */; };
FCA52B021A2B9F0E00CCADFA /* warning_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52B001A2B9F0E00CCADFA /* warning_white@2x.png */; };
FCA52B031A2B9F0E00CCADFA /* error_white@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = FCA52B011A2B9F0E00CCADFA /* error_white@2x.png */; };
FCFA5E131A29FC1000C8E32E /* JSQDisplayedMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E121A29FC1000C8E32E /* JSQDisplayedMessage.m */; };
FCFA5E161A29FE3B00C8E32E /* JSQInfoMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E151A29FE3B00C8E32E /* JSQInfoMessage.m */; };
FCFA5E191A2A044500C8E32E /* JSQErrorMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E181A2A044500C8E32E /* JSQErrorMessage.m */; };
FCFA5E1D1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = FCFA5E1B1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m */; };
FCFA5E1E1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = FCFA5E1C1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -146,12 +139,24 @@
782026E9E518622532ED474D /* libPods-JSQMessagesTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JSQMessagesTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
88078A9B19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesMediaPlaceholderView.h; sourceTree = "<group>"; };
88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesMediaPlaceholderView.m; sourceTree = "<group>"; };
88078A9E19D8FFEA005B4595 /* clip.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = clip.png; sourceTree = "<group>"; };
88078A9F19D8FFEA005B4595 /* clip@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "clip@2x.png"; sourceTree = "<group>"; };
88078AA019D8FFEA005B4595 /* clip@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "clip@3x.png"; sourceTree = "<group>"; };
88078AA419D9034F005B4595 /* typing@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "typing@3x.png"; sourceTree = "<group>"; };
88078AA519D9034F005B4595 /* typing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "typing@2x.png"; sourceTree = "<group>"; };
88078AA619D9034F005B4595 /* typing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = typing.png; sourceTree = "<group>"; };
88324C3319F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesMediaViewBubbleImageMaskerTests.m; sourceTree = "<group>"; };
883C11761A09FB100092A16D /* JSQMessagesCellTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCellTextView.h; sourceTree = "<group>"; };
883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCellTextView.m; sourceTree = "<group>"; };
8841B88619F4988800EA16B6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B88819F4988900EA16B6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B88919F4988A00EA16B6 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B88A19F4988B00EA16B6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B88B19F4988C00EA16B6 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/JSQMessages.strings"; sourceTree = "<group>"; };
8841B88C19F4988F00EA16B6 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/JSQMessages.strings"; sourceTree = "<group>"; };
8841B88D19F4989000EA16B6 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B88E19F4989100EA16B6 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B88F19F4989200EA16B6 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B89019F4989200EA16B6 /* pt */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pt; path = pt.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B89119F4989300EA16B6 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B89219F4989400EA16B6 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B89319F4989500EA16B6 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B89419F4989500EA16B6 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/JSQMessages.strings; sourceTree = "<group>"; };
8841B89519F4989600EA16B6 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/JSQMessages.strings; sourceTree = "<group>"; };
88445B3019E0AE3F0014F889 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
88445B3219E0AE450014F889 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
88445B3419E0AE4A0014F889 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
@ -161,19 +166,10 @@
88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQLocationMediaItem.m; sourceTree = "<group>"; };
88445B4119E1B50B0014F889 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
88445B4319E1B5110014F889 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; };
8846441419EB15B2001EBA43 /* bubble_stroked@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_stroked@3x.png"; sourceTree = "<group>"; };
8846441519EB15B2001EBA43 /* bubble_min_tailless@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_min_tailless@3x.png"; sourceTree = "<group>"; };
8846441619EB15B2001EBA43 /* bubble_min@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_min@3x.png"; sourceTree = "<group>"; };
8846441719EB15B2001EBA43 /* bubble_stroked_tailless@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_stroked_tailless@3x.png"; sourceTree = "<group>"; };
8846441C19EB17CF001EBA43 /* play@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play@3x.png"; sourceTree = "<group>"; };
8846441D19EB17CF001EBA43 /* play@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play@2x.png"; sourceTree = "<group>"; };
8846441E19EB17CF001EBA43 /* play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play.png; sourceTree = "<group>"; };
8846442319EB1830001EBA43 /* bubble@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble@3x.png"; sourceTree = "<group>"; };
8846442619EB189E001EBA43 /* bubble_tailless@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_tailless@3x.png"; sourceTree = "<group>"; };
8846442819EB18A5001EBA43 /* bubble_tailless@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_tailless@2x.png"; sourceTree = "<group>"; };
8846442919EB18A5001EBA43 /* bubble_tailless.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bubble_tailless.png; sourceTree = "<group>"; };
8846442C19EB2BF4001EBA43 /* JSQVideoMediaitem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQVideoMediaitem.h; sourceTree = "<group>"; };
8846442D19EB2BF4001EBA43 /* JSQVideoMediaitem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQVideoMediaitem.m; sourceTree = "<group>"; };
8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = JSQMessagesAssets.bundle; sourceTree = "<group>"; };
886C33FB19F4371E006B4997 /* JSQVideoMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQVideoMediaItem.h; sourceTree = "<group>"; };
886C33FC19F4371E006B4997 /* JSQVideoMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQVideoMediaItem.m; sourceTree = "<group>"; };
886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = JSQMessagesViewController.podspec; sourceTree = "<group>"; };
886FFD2C19E9A65D00EB8485 /* UIDevice+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIDevice+JSQMessages.h"; sourceTree = "<group>"; };
886FFD2D19E9A65D00EB8485 /* UIDevice+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIDevice+JSQMessages.m"; sourceTree = "<group>"; };
8885734819DE540400E89D20 /* DemoSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoSettingsViewController.h; sourceTree = "<group>"; };
@ -188,14 +184,6 @@
88A25F3119D8DF2500924534 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
88A25F3219D8DF2500924534 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = "<group>"; };
88A25F3419D8DF2500924534 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
88A25F4119D8E01A00924534 /* bubble.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bubble.png; sourceTree = "<group>"; };
88A25F4219D8E01A00924534 /* bubble@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble@2x.png"; sourceTree = "<group>"; };
88A25F4319D8E01A00924534 /* bubble_min.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bubble_min.png; sourceTree = "<group>"; };
88A25F4419D8E01A00924534 /* bubble_min@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_min@2x.png"; sourceTree = "<group>"; };
88A25F4519D8E01A00924534 /* bubble_min_tailless.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bubble_min_tailless.png; sourceTree = "<group>"; };
88A25F4619D8E01A00924534 /* bubble_min_tailless@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_min_tailless@2x.png"; sourceTree = "<group>"; };
88A25F5219D8E01A00924534 /* message_received.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = message_received.aiff; sourceTree = "<group>"; };
88A25F5319D8E01A00924534 /* message_sent.aiff */ = {isa = PBXFileReference; lastKnownFileType = audio.aiff; path = message_sent.aiff; sourceTree = "<group>"; };
88A25F5519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "JSQSystemSoundPlayer+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5619D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSQSystemSoundPlayer+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5719D8E01A00924534 /* NSString+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+JSQMessages.h"; sourceTree = "<group>"; };
@ -226,8 +214,6 @@
88A25F7319D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewFlowLayoutInvalidationContext.m; sourceTree = "<group>"; };
88A25F7419D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewLayoutAttributes.h; sourceTree = "<group>"; };
88A25F7519D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewLayoutAttributes.m; sourceTree = "<group>"; };
88A25F7719D8E01A00924534 /* JSQMediaMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMediaMessage.h; sourceTree = "<group>"; };
88A25F7819D8E01A00924534 /* JSQMediaMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMediaMessage.m; sourceTree = "<group>"; };
88A25F7919D8E01A00924534 /* JSQMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessage.h; sourceTree = "<group>"; };
88A25F7A19D8E01A00924534 /* JSQMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessage.m; sourceTree = "<group>"; };
88A25F7B19D8E01A00924534 /* JSQMessageAvatarImageDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageAvatarImageDataSource.h; sourceTree = "<group>"; };
@ -242,18 +228,14 @@
88A25F8419D8E01A00924534 /* JSQMessagesCollectionViewDelegateFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewDelegateFlowLayout.h; sourceTree = "<group>"; };
88A25F8519D8E01A00924534 /* JSQPhotoMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQPhotoMediaItem.h; sourceTree = "<group>"; };
88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQPhotoMediaItem.m; sourceTree = "<group>"; };
88A25F8719D8E01A00924534 /* JSQTextMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQTextMessage.h; sourceTree = "<group>"; };
88A25F8819D8E01A00924534 /* JSQTextMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQTextMessage.m; sourceTree = "<group>"; };
88A25F8A19D8E01A00924534 /* JSQMessagesCollectionView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionView.h; sourceTree = "<group>"; };
88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionView.m; sourceTree = "<group>"; };
88A25F8C19D8E01A00924534 /* JSQMessagesCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewCell.h; sourceTree = "<group>"; };
88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCell.m; sourceTree = "<group>"; };
88A25F8E19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewCellIncoming.h; sourceTree = "<group>"; };
88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCellIncoming.m; sourceTree = "<group>"; };
88A25F9019D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellIncoming.xib; sourceTree = "<group>"; };
88A25F9119D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewCellOutgoing.h; sourceTree = "<group>"; };
88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCellOutgoing.m; sourceTree = "<group>"; };
88A25F9319D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellOutgoing.xib; sourceTree = "<group>"; };
88A25F9419D8E01A00924534 /* JSQMessagesComposerTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesComposerTextView.h; sourceTree = "<group>"; };
88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesComposerTextView.m; sourceTree = "<group>"; };
88A25F9619D8E01A00924534 /* JSQMessagesInputToolbar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesInputToolbar.h; sourceTree = "<group>"; };
@ -287,11 +269,10 @@
88A25FEE19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarButtonFactoryTests.m; sourceTree = "<group>"; };
88A25FF019D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewFlowLayoutTests.m; sourceTree = "<group>"; };
88A25FF119D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewLayoutAttributesTests.m; sourceTree = "<group>"; };
88A25FF319D8E18400924534 /* JSQMediaMessageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMediaMessageTests.m; sourceTree = "<group>"; };
88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessageMediaTests.m; sourceTree = "<group>"; };
88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImageTests.m; sourceTree = "<group>"; };
88A25FF519D8E18400924534 /* JSQMessagesBubbleImageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImageTests.m; sourceTree = "<group>"; };
88A25FF619D8E18400924534 /* JSQMessageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessageTests.m; sourceTree = "<group>"; };
88A25FF719D8E18400924534 /* JSQTextMessageTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQTextMessageTests.m; sourceTree = "<group>"; };
88A25FF619D8E18400924534 /* JSQMessageTextTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessageTextTests.m; sourceTree = "<group>"; };
88A25FF919D8E18400924534 /* JSQMessagesCollectionViewCellTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewCellTests.m; sourceTree = "<group>"; };
88A25FFA19D8E18400924534 /* JSQMessagesCollectionViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewTests.m; sourceTree = "<group>"; };
88A25FFB19D8E18400924534 /* JSQMessagesComposerTextViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesComposerTextViewTests.m; sourceTree = "<group>"; };
@ -301,12 +282,38 @@
88A25FFF19D8E18400924534 /* JSQMessagesToolbarContentViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarContentViewTests.m; sourceTree = "<group>"; };
88A2600019D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTypingIndicatorFooterViewTests.m; sourceTree = "<group>"; };
88A2601A19D8E45600924534 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
88AE58E919E77FBF0042B0DE /* bubble_stroked_tailless.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bubble_stroked_tailless.png; sourceTree = "<group>"; };
88AE58EA19E77FBF0042B0DE /* bubble_stroked_tailless@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_stroked_tailless@2x.png"; sourceTree = "<group>"; };
88AE58EB19E77FBF0042B0DE /* bubble_stroked.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = bubble_stroked.png; sourceTree = "<group>"; };
88AE58EC19E77FBF0042B0DE /* bubble_stroked@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bubble_stroked@2x.png"; sourceTree = "<group>"; };
88A901B419F618B100F99777 /* JSQMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMediaItem.h; sourceTree = "<group>"; };
88A901B519F618B100F99777 /* JSQMediaItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMediaItem.m; sourceTree = "<group>"; };
88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQLocationMediaItemTests.m; sourceTree = "<group>"; };
88C00A4F1A44D4D800B004B3 /* JSQPhotoMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQPhotoMediaItemTests.m; sourceTree = "<group>"; };
88C00A511A44D4E500B004B3 /* JSQVideoMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQVideoMediaItemTests.m; sourceTree = "<group>"; };
88C4582E19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesMediaViewBubbleImageMasker.h; sourceTree = "<group>"; };
88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesMediaViewBubbleImageMasker.m; sourceTree = "<group>"; };
97E6750B77E8A7042BA0754B /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
FC15B7A81A1E880900F59801 /* JSQCallCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQCallCollectionViewCell.xib; sourceTree = "<group>"; };
FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellIncoming.xib; sourceTree = "<group>"; };
FC15B7AF1A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesCollectionViewCellOutgoing.xib; sourceTree = "<group>"; };
FC4FA0381A1E1BD100DA100A /* JSQCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQCall.h; sourceTree = "<group>"; };
FC4FA0391A1E1BD100DA100A /* JSQCall.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQCall.m; sourceTree = "<group>"; };
FC4FA03B1A1E81AF00DA100A /* JSQCallCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQCallCollectionViewCell.h; sourceTree = "<group>"; };
FC4FA03C1A1E81AF00DA100A /* JSQCallCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQCallCollectionViewCell.m; sourceTree = "<group>"; };
FC5C727E4CCDA2B95A7BA30C /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
FCA52AEE1A2B6ECE00CCADFA /* call_missed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "call_missed@2x.png"; path = "../../JSQMessagesDemo/call_missed@2x.png"; sourceTree = "<group>"; };
FCA52AF11A2B6FAE00CCADFA /* call_canceled@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_canceled@2x.png"; sourceTree = "<group>"; };
FCA52AF21A2B6FAE00CCADFA /* call_failed@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_failed@2x.png"; sourceTree = "<group>"; };
FCA52AF31A2B6FAE00CCADFA /* call_incoming@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_incoming@2x.png"; sourceTree = "<group>"; };
FCA52AF41A2B6FAE00CCADFA /* call_outgoing@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "call_outgoing@2x.png"; sourceTree = "<group>"; };
FCA52B001A2B9F0E00CCADFA /* warning_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "warning_white@2x.png"; sourceTree = "<group>"; };
FCA52B011A2B9F0E00CCADFA /* error_white@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "error_white@2x.png"; sourceTree = "<group>"; };
FCFA5E111A29FC1000C8E32E /* JSQDisplayedMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQDisplayedMessage.h; sourceTree = "<group>"; };
FCFA5E121A29FC1000C8E32E /* JSQDisplayedMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQDisplayedMessage.m; sourceTree = "<group>"; };
FCFA5E141A29FE3B00C8E32E /* JSQInfoMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQInfoMessage.h; sourceTree = "<group>"; };
FCFA5E151A29FE3B00C8E32E /* JSQInfoMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQInfoMessage.m; sourceTree = "<group>"; };
FCFA5E171A2A044500C8E32E /* JSQErrorMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQErrorMessage.h; sourceTree = "<group>"; };
FCFA5E181A2A044500C8E32E /* JSQErrorMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQErrorMessage.m; sourceTree = "<group>"; };
FCFA5E1A1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQDisplayedMessageCollectionViewCell.h; sourceTree = "<group>"; };
FCFA5E1B1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQDisplayedMessageCollectionViewCell.m; sourceTree = "<group>"; };
FCFA5E1C1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQDisplayedMessageCollectionViewCell.xib; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -368,15 +375,24 @@
88445B3A19E0C0B10014F889 /* XCTest.framework */,
);
name = Frameworks;
path = ../..;
sourceTree = "<group>";
};
8841B88219F4983C00EA16B6 /* Strings */ = {
isa = PBXGroup;
children = (
8841B88719F4988800EA16B6 /* JSQMessages.strings */,
);
path = Strings;
sourceTree = "<group>";
};
88A25EF919D8DEC400924534 = {
isa = PBXGroup;
children = (
886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */,
88A25F3E19D8E01A00924534 /* JSQMessagesViewController */,
88A25F1E19D8DEC500924534 /* JSQMessagesTests */,
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */,
636A8663AEEE5C37B65C515D /* Frameworks */,
88A25F1E19D8DEC500924534 /* JSQMessagesTests */,
2BBEF3CD91C31A49E5FF9E3C /* Pods */,
88A25F0319D8DEC400924534 /* Products */,
);
@ -454,55 +470,14 @@
88A25F3F19D8E01A00924534 /* Assets */ = {
isa = PBXGroup;
children = (
88A25F4019D8E01A00924534 /* Images */,
88A25F5119D8E01A00924534 /* Sounds */,
FCA52AFB1A2B9BAD00CCADFA /* InfoError */,
FCA52AF01A2B6F8A00CCADFA /* Calls */,
8841B88219F4983C00EA16B6 /* Strings */,
8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */,
);
path = Assets;
sourceTree = "<group>";
};
88A25F4019D8E01A00924534 /* Images */ = {
isa = PBXGroup;
children = (
88A25F4519D8E01A00924534 /* bubble_min_tailless.png */,
88A25F4619D8E01A00924534 /* bubble_min_tailless@2x.png */,
8846441519EB15B2001EBA43 /* bubble_min_tailless@3x.png */,
88A25F4319D8E01A00924534 /* bubble_min.png */,
88A25F4419D8E01A00924534 /* bubble_min@2x.png */,
8846441619EB15B2001EBA43 /* bubble_min@3x.png */,
88AE58E919E77FBF0042B0DE /* bubble_stroked_tailless.png */,
88AE58EA19E77FBF0042B0DE /* bubble_stroked_tailless@2x.png */,
8846441719EB15B2001EBA43 /* bubble_stroked_tailless@3x.png */,
88AE58EB19E77FBF0042B0DE /* bubble_stroked.png */,
88AE58EC19E77FBF0042B0DE /* bubble_stroked@2x.png */,
8846441419EB15B2001EBA43 /* bubble_stroked@3x.png */,
8846442919EB18A5001EBA43 /* bubble_tailless.png */,
8846442819EB18A5001EBA43 /* bubble_tailless@2x.png */,
8846442619EB189E001EBA43 /* bubble_tailless@3x.png */,
88A25F4119D8E01A00924534 /* bubble.png */,
88A25F4219D8E01A00924534 /* bubble@2x.png */,
8846442319EB1830001EBA43 /* bubble@3x.png */,
88078A9E19D8FFEA005B4595 /* clip.png */,
88078A9F19D8FFEA005B4595 /* clip@2x.png */,
88078AA019D8FFEA005B4595 /* clip@3x.png */,
8846441E19EB17CF001EBA43 /* play.png */,
8846441D19EB17CF001EBA43 /* play@2x.png */,
8846441C19EB17CF001EBA43 /* play@3x.png */,
88078AA619D9034F005B4595 /* typing.png */,
88078AA519D9034F005B4595 /* typing@2x.png */,
88078AA419D9034F005B4595 /* typing@3x.png */,
);
path = Images;
sourceTree = "<group>";
};
88A25F5119D8E01A00924534 /* Sounds */ = {
isa = PBXGroup;
children = (
88A25F5219D8E01A00924534 /* message_received.aiff */,
88A25F5319D8E01A00924534 /* message_sent.aiff */,
);
path = Sounds;
sourceTree = "<group>";
};
88A25F5419D8E01A00924534 /* Categories */ = {
isa = PBXGroup;
children = (
@ -541,6 +516,8 @@
88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */,
88A25F6819D8E01A00924534 /* JSQMessagesBubbleImageFactory.h */,
88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */,
88C4582E19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.h */,
88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */,
88A25F6A19D8E01A00924534 /* JSQMessagesTimestampFormatter.h */,
88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */,
88A25F6C19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.h */,
@ -567,8 +544,8 @@
children = (
88445B3E19E1B4470014F889 /* JSQLocationMediaItem.h */,
88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */,
88A25F7719D8E01A00924534 /* JSQMediaMessage.h */,
88A25F7819D8E01A00924534 /* JSQMediaMessage.m */,
88A901B419F618B100F99777 /* JSQMediaItem.h */,
88A901B519F618B100F99777 /* JSQMediaItem.m */,
88A25F7919D8E01A00924534 /* JSQMessage.h */,
88A25F7A19D8E01A00924534 /* JSQMessage.m */,
88A25F7B19D8E01A00924534 /* JSQMessageAvatarImageDataSource.h */,
@ -583,10 +560,16 @@
88A25F8419D8E01A00924534 /* JSQMessagesCollectionViewDelegateFlowLayout.h */,
88A25F8519D8E01A00924534 /* JSQPhotoMediaItem.h */,
88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.m */,
88A25F8719D8E01A00924534 /* JSQTextMessage.h */,
88A25F8819D8E01A00924534 /* JSQTextMessage.m */,
8846442C19EB2BF4001EBA43 /* JSQVideoMediaitem.h */,
8846442D19EB2BF4001EBA43 /* JSQVideoMediaitem.m */,
886C33FB19F4371E006B4997 /* JSQVideoMediaItem.h */,
886C33FC19F4371E006B4997 /* JSQVideoMediaItem.m */,
FC4FA0381A1E1BD100DA100A /* JSQCall.h */,
FC4FA0391A1E1BD100DA100A /* JSQCall.m */,
FCFA5E111A29FC1000C8E32E /* JSQDisplayedMessage.h */,
FCFA5E121A29FC1000C8E32E /* JSQDisplayedMessage.m */,
FCFA5E141A29FE3B00C8E32E /* JSQInfoMessage.h */,
FCFA5E151A29FE3B00C8E32E /* JSQInfoMessage.m */,
FCFA5E171A2A044500C8E32E /* JSQErrorMessage.h */,
FCFA5E181A2A044500C8E32E /* JSQErrorMessage.m */,
);
path = Model;
sourceTree = "<group>";
@ -594,16 +577,19 @@
88A25F8919D8E01A00924534 /* Views */ = {
isa = PBXGroup;
children = (
636A8663AEEE5C37B65C515D /* Frameworks */,
883C11761A09FB100092A16D /* JSQMessagesCellTextView.h */,
883C11771A09FB100092A16D /* JSQMessagesCellTextView.m */,
88A25F8A19D8E01A00924534 /* JSQMessagesCollectionView.h */,
88A25F8B19D8E01A00924534 /* JSQMessagesCollectionView.m */,
88A25F8C19D8E01A00924534 /* JSQMessagesCollectionViewCell.h */,
88A25F8D19D8E01A00924534 /* JSQMessagesCollectionViewCell.m */,
88A25F8E19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.h */,
88A25F8F19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m */,
88A25F9019D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib */,
FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */,
88A25F9119D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.h */,
88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */,
88A25F9319D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib */,
FC15B7AF1A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib */,
88A25F9419D8E01A00924534 /* JSQMessagesComposerTextView.h */,
88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */,
88A25F9619D8E01A00924534 /* JSQMessagesInputToolbar.h */,
@ -621,6 +607,12 @@
88A25FA019D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.h */,
88A25FA119D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m */,
88A25FA219D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib */,
FC4FA03B1A1E81AF00DA100A /* JSQCallCollectionViewCell.h */,
FC4FA03C1A1E81AF00DA100A /* JSQCallCollectionViewCell.m */,
FC15B7A81A1E880900F59801 /* JSQCallCollectionViewCell.xib */,
FCFA5E1A1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.h */,
FCFA5E1B1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m */,
FCFA5E1C1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib */,
);
path = Views;
sourceTree = "<group>";
@ -650,6 +642,7 @@
children = (
88A25FEB19D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m */,
88A25FEC19D8E18400924534 /* JSQMessagesBubbleImageFactoryTests.m */,
88324C3319F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m */,
88A25FED19D8E18400924534 /* JSQMessagesTimestampFormatterTests.m */,
88A25FEE19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m */,
);
@ -668,11 +661,13 @@
88A25FF219D8E18400924534 /* ModelTests */ = {
isa = PBXGroup;
children = (
88A25FF319D8E18400924534 /* JSQMediaMessageTests.m */,
88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */,
88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */,
88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */,
88A25FF519D8E18400924534 /* JSQMessagesBubbleImageTests.m */,
88A25FF619D8E18400924534 /* JSQMessageTests.m */,
88A25FF719D8E18400924534 /* JSQTextMessageTests.m */,
88A25FF619D8E18400924534 /* JSQMessageTextTests.m */,
88C00A4F1A44D4D800B004B3 /* JSQPhotoMediaItemTests.m */,
88C00A511A44D4E500B004B3 /* JSQVideoMediaItemTests.m */,
);
path = ModelTests;
sourceTree = "<group>";
@ -692,6 +687,27 @@
path = ViewTests;
sourceTree = "<group>";
};
FCA52AF01A2B6F8A00CCADFA /* Calls */ = {
isa = PBXGroup;
children = (
FCA52AF11A2B6FAE00CCADFA /* call_canceled@2x.png */,
FCA52AF21A2B6FAE00CCADFA /* call_failed@2x.png */,
FCA52AF31A2B6FAE00CCADFA /* call_incoming@2x.png */,
FCA52AF41A2B6FAE00CCADFA /* call_outgoing@2x.png */,
FCA52AEE1A2B6ECE00CCADFA /* call_missed@2x.png */,
);
name = Calls;
sourceTree = "<group>";
};
FCA52AFB1A2B9BAD00CCADFA /* InfoError */ = {
isa = PBXGroup;
children = (
FCA52B001A2B9F0E00CCADFA /* warning_white@2x.png */,
FCA52B011A2B9F0E00CCADFA /* error_white@2x.png */,
);
name = InfoError;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@ -759,6 +775,19 @@
knownRegions = (
en,
Base,
es,
de,
"zh-Hans",
"zh-Hant",
ro,
ru,
pl,
pt,
fr,
it,
he,
nl,
tr,
);
mainGroup = 88A25EF919D8DEC400924534;
productRefGroup = 88A25F0319D8DEC400924534 /* Products */;
@ -776,43 +805,26 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
88078AA919D9034F005B4595 /* typing.png in Resources */,
8846441919EB15B2001EBA43 /* bubble_min_tailless@3x.png in Resources */,
88078AA719D9034F005B4595 /* typing@3x.png in Resources */,
8846441B19EB15B2001EBA43 /* bubble_stroked_tailless@3x.png in Resources */,
88A25FB319D8E01A00924534 /* message_received.aiff in Resources */,
88078AA119D8FFEA005B4595 /* clip.png in Resources */,
88AE58EE19E77FBF0042B0DE /* bubble_stroked_tailless@2x.png in Resources */,
88A25FCF19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */,
88AE58ED19E77FBF0042B0DE /* bubble_stroked_tailless.png in Resources */,
88A25FA719D8E01A00924534 /* bubble_min_tailless.png in Resources */,
8846441F19EB17CF001EBA43 /* play@3x.png in Resources */,
88A25FA319D8E01A00924534 /* bubble.png in Resources */,
88A25FA519D8E01A00924534 /* bubble_min.png in Resources */,
8846441A19EB15B2001EBA43 /* bubble_min@3x.png in Resources */,
8846442B19EB18A5001EBA43 /* bubble_tailless.png in Resources */,
88A25FA619D8E01A00924534 /* bubble_min@2x.png in Resources */,
88A25FCD19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */,
88E4D7131A0DBD6B000CC061 /* JSQMessages.strings in Resources */,
886C33FF19F45E30006B4997 /* JSQMessagesViewController.podspec in Resources */,
8861666D19F492B70025B958 /* JSQMessagesAssets.bundle in Resources */,
FC15B7B11A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib in Resources */,
88A25FD619D8E01A00924534 /* JSQMessagesToolbarContentView.xib in Resources */,
FCA52AF71A2B6FAE00CCADFA /* call_incoming@2x.png in Resources */,
88A25F3A19D8DF2500924534 /* Images.xcassets in Resources */,
88A25FBC19D8E01A00924534 /* JSQMessagesViewController.xib in Resources */,
8846442A19EB18A5001EBA43 /* bubble_tailless@2x.png in Resources */,
88078AA219D8FFEA005B4595 /* clip@2x.png in Resources */,
88A25FA419D8E01A00924534 /* bubble@2x.png in Resources */,
88078AA319D8FFEA005B4595 /* clip@3x.png in Resources */,
88A25FA819D8E01A00924534 /* bubble_min_tailless@2x.png in Resources */,
FCA52AF81A2B6FAE00CCADFA /* call_outgoing@2x.png in Resources */,
FCA52B021A2B9F0E00CCADFA /* warning_white@2x.png in Resources */,
FCA52AF51A2B6FAE00CCADFA /* call_canceled@2x.png in Resources */,
FCA52B031A2B9F0E00CCADFA /* error_white@2x.png in Resources */,
FCA52AEF1A2B6ECE00CCADFA /* call_missed@2x.png in Resources */,
88A25FD819D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib in Resources */,
88AE58F019E77FBF0042B0DE /* bubble_stroked@2x.png in Resources */,
88A25FB419D8E01A00924534 /* message_sent.aiff in Resources */,
FCFA5E1E1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib in Resources */,
88A25F3919D8DF2500924534 /* Main.storyboard in Resources */,
FC15B7B01A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */,
88A25FD419D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib in Resources */,
8846442519EB1830001EBA43 /* bubble@3x.png in Resources */,
88078AA819D9034F005B4595 /* typing@2x.png in Resources */,
8846442719EB189E001EBA43 /* bubble_tailless@3x.png in Resources */,
8846442119EB17CF001EBA43 /* play.png in Resources */,
88AE58EF19E77FBF0042B0DE /* bubble_stroked.png in Resources */,
8846442019EB17CF001EBA43 /* play@2x.png in Resources */,
8846441819EB15B2001EBA43 /* bubble_stroked@3x.png in Resources */,
FC15B7A91A1E880900F59801 /* JSQCallCollectionViewCell.xib in Resources */,
FCA52AF61A2B6FAE00CCADFA /* call_failed@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -900,7 +912,9 @@
88A25FCB19D8E01A00924534 /* JSQMessagesCollectionViewCell.m in Sources */,
88A25FBB19D8E01A00924534 /* JSQMessagesViewController.m in Sources */,
8885734D19DE55D000E89D20 /* NSUserDefaults+DemoSettings.m in Sources */,
883C11781A09FB100092A16D /* JSQMessagesCellTextView.m in Sources */,
88A25FB919D8E01A00924534 /* UIView+JSQMessages.m in Sources */,
FCFA5E131A29FC1000C8E32E /* JSQDisplayedMessage.m in Sources */,
88A25FCA19D8E01A00924534 /* JSQMessagesCollectionView.m in Sources */,
88A25FD219D8E01A00924534 /* JSQMessagesLabel.m in Sources */,
88445B4019E1B4470014F889 /* JSQLocationMediaItem.m in Sources */,
@ -908,28 +922,33 @@
88A25FD519D8E01A00924534 /* JSQMessagesToolbarContentView.m in Sources */,
88A25FC119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m in Sources */,
8885734A19DE540400E89D20 /* DemoSettingsViewController.m in Sources */,
FC4FA03A1A1E1BD100DA100A /* JSQCall.m in Sources */,
88A25FC719D8E01A00924534 /* JSQMessagesBubbleImage.m in Sources */,
88A25FC519D8E01A00924534 /* JSQMessage.m in Sources */,
88A25FD719D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m in Sources */,
88A25FD319D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m in Sources */,
FC4FA03D1A1E81AF00DA100A /* JSQCallCollectionViewCell.m in Sources */,
88A25FC819D8E01A00924534 /* JSQPhotoMediaItem.m in Sources */,
88C4583019F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m in Sources */,
88A25FB819D8E01A00924534 /* UIImage+JSQMessages.m in Sources */,
88A25FBF19D8E01A00924534 /* JSQMessagesTimestampFormatter.m in Sources */,
88A25FE019D8E0C400924534 /* DemoModelData.m in Sources */,
FCFA5E1D1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.m in Sources */,
88A25F3C19D8DF2500924534 /* main.m in Sources */,
88A25F3719D8DF2500924534 /* AppDelegate.m in Sources */,
886FFD2E19E9A65D00EB8485 /* UIDevice+JSQMessages.m in Sources */,
88A25FB619D8E01A00924534 /* NSString+JSQMessages.m in Sources */,
FCFA5E191A2A044500C8E32E /* JSQErrorMessage.m in Sources */,
88A901B619F618B100F99777 /* JSQMediaItem.m in Sources */,
88A25FCC19D8E01A00924534 /* JSQMessagesCollectionViewCellIncoming.m in Sources */,
88A25FBE19D8E01A00924534 /* JSQMessagesBubbleImageFactory.m in Sources */,
88A25FDF19D8E0C400924534 /* DemoMessagesViewController.m in Sources */,
88A25FB719D8E01A00924534 /* UIColor+JSQMessages.m in Sources */,
886C33FD19F4371E006B4997 /* JSQVideoMediaItem.m in Sources */,
88A25FBA19D8E01A00924534 /* JSQMessagesKeyboardController.m in Sources */,
FCFA5E161A29FE3B00C8E32E /* JSQInfoMessage.m in Sources */,
88A25FC019D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m in Sources */,
88A25FC919D8E01A00924534 /* JSQTextMessage.m in Sources */,
88A25FC419D8E01A00924534 /* JSQMediaMessage.m in Sources */,
88A25FC219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m in Sources */,
8846442E19EB2BF4001EBA43 /* JSQVideoMediaitem.m in Sources */,
88A25FE119D8E0C400924534 /* TableViewController.m in Sources */,
88A25FBD19D8E01A00924534 /* JSQMessagesAvatarImageFactory.m in Sources */,
88A25FB519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m in Sources */,
@ -944,13 +963,14 @@
files = (
88A2600219D8E18400924534 /* JSQMessagesUIColorTests.m in Sources */,
88A2601819D8E18400924534 /* JSQMessagesToolbarContentViewTests.m in Sources */,
88C00A521A44D4E500B004B3 /* JSQVideoMediaItemTests.m in Sources */,
88A2601519D8E18400924534 /* JSQMessagesInputToolbarTests.m in Sources */,
88A2601719D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m in Sources */,
88A2601219D8E18400924534 /* JSQMessagesCollectionViewCellTests.m in Sources */,
88A2601619D8E18400924534 /* JSQMessagesLabelTests.m in Sources */,
88A2600B19D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m in Sources */,
88A2601019D8E18400924534 /* JSQMessageTests.m in Sources */,
88A2600D19D8E18400924534 /* JSQMediaMessageTests.m in Sources */,
88A2601019D8E18400924534 /* JSQMessageTextTests.m in Sources */,
88A2600D19D8E18400924534 /* JSQMessageMediaTests.m in Sources */,
88A2600719D8E18400924534 /* JSQMessagesAvatarImageFactoryTests.m in Sources */,
88A2600419D8E18400924534 /* JSQMessagesUIViewTests.m in Sources */,
88A2600F19D8E18400924534 /* JSQMessagesBubbleImageTests.m in Sources */,
@ -959,10 +979,12 @@
88A2601419D8E18400924534 /* JSQMessagesComposerTextViewTests.m in Sources */,
88A2601319D8E18400924534 /* JSQMessagesCollectionViewTests.m in Sources */,
88A2600119D8E18400924534 /* JSQMessagesNSStringTests.m in Sources */,
88A2601119D8E18400924534 /* JSQTextMessageTests.m in Sources */,
88A2600A19D8E18400924534 /* JSQMessagesToolbarButtonFactoryTests.m in Sources */,
88C00A501A44D4D800B004B3 /* JSQPhotoMediaItemTests.m in Sources */,
88324C3419F6301C00BC732D /* JSQMessagesMediaViewBubbleImageMaskerTests.m in Sources */,
88A2601919D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m in Sources */,
88A2600319D8E18400924534 /* JSQMessagesUIImageTests.m in Sources */,
88C00A4E1A44D4C600B004B3 /* JSQLocationMediaItemTests.m in Sources */,
88A2600C19D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m in Sources */,
88A2600619D8E18400924534 /* JSQMessagesViewControllerTests.m in Sources */,
88A2600519D8E18400924534 /* JSQMessagesKeyboardControllerTests.m in Sources */,
@ -981,6 +1003,28 @@
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
8841B88719F4988800EA16B6 /* JSQMessages.strings */ = {
isa = PBXVariantGroup;
children = (
8841B88619F4988800EA16B6 /* Base */,
8841B88819F4988900EA16B6 /* en */,
8841B88919F4988A00EA16B6 /* es */,
8841B88A19F4988B00EA16B6 /* de */,
8841B88B19F4988C00EA16B6 /* zh-Hans */,
8841B88C19F4988F00EA16B6 /* zh-Hant */,
8841B88D19F4989000EA16B6 /* ro */,
8841B88E19F4989100EA16B6 /* pl */,
8841B88F19F4989200EA16B6 /* ru */,
8841B89019F4989200EA16B6 /* pt */,
8841B89119F4989300EA16B6 /* fr */,
8841B89219F4989400EA16B6 /* it */,
8841B89319F4989500EA16B6 /* he */,
8841B89419F4989500EA16B6 /* nl */,
8841B89519F4989600EA16B6 /* tr */,
);
name = JSQMessages.strings;
sourceTree = "<group>";
};
88A25F3019D8DF2500924534 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
@ -1077,11 +1121,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
INFOPLIST_FILE = "$(SRCROOT)/JSQMessagesDemo/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
};
name = Debug;
};
@ -1092,11 +1139,14 @@
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
INFOPLIST_FILE = "$(SRCROOT)/JSQMessagesDemo/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
};
name = Release;
};

View File

@ -16,8 +16,8 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import Foundation;
@import UIKit;
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>

View File

@ -45,6 +45,4 @@
- (void)closePressed:(UIBarButtonItem *)sender;
// TODO: example of async avatar loading
@end

View File

@ -18,6 +18,12 @@
#import "DemoMessagesViewController.h"
#import "JSQCallCollectionViewCell.h"
#import "JSQCall.h"
#import "JSQDisplayedMessageCollectionViewCell.h"
#import "JSQErrorMessage.h"
#import "JSQInfoMessage.h"
@implementation DemoMessagesViewController
@ -43,7 +49,7 @@
*/
self.senderId = kJSQDemoAvatarIdSquires;
self.senderDisplayName = kJSQDemoAvatarDisplayNameSquires;
/**
* Load up our fake data for the demo
@ -62,10 +68,19 @@
self.collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero;
}
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"typing"]
self.showLoadEarlierMessagesHeader = YES;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage jsq_defaultTypingIndicatorImage]
style:UIBarButtonItemStyleBordered
target:self
action:@selector(receiveMessagePressed:)];
/**
* Customize your toolbar buttons
*
* self.inputToolbar.contentView.leftBarButtonItem = custom button or nil to remove
* self.inputToolbar.contentView.rightBarButtonItem = custom button or nil to remove
*/
}
- (void)viewWillAppear:(BOOL)animated
@ -93,6 +108,16 @@
#pragma mark - Testing
- (void)pushMainViewController
{
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UINavigationController *nc = [sb instantiateInitialViewController];
[self.navigationController pushViewController:nc.topViewController animated:YES];
}
#pragma mark - Actions
- (void)receiveMessagePressed:(UIBarButtonItem *)sender
@ -121,9 +146,9 @@
JSQMessage *copyMessage = [[self.demoData.messages lastObject] copy];
if (!copyMessage) {
copyMessage = [JSQTextMessage messageWithSenderId:kJSQDemoAvatarIdJobs
displayName:kJSQDemoAvatarDisplayNameJobs
text:@"First received!"];
copyMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdJobs
displayName:kJSQDemoAvatarDisplayNameJobs
text:@"First received!"];
}
/**
@ -139,7 +164,7 @@
id<JSQMessageMediaData> newMediaData = nil;
id newMediaAttachmentCopy = nil;
if ([copyMessage isKindOfClass:[JSQMediaMessage class]]) {
if ([copyMessage isKindOfClass:[JSQMessage class]]) {
/**
* Last message was a media message
*/
@ -147,6 +172,7 @@
if ([copyMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {
JSQPhotoMediaItem *photoItemCopy = [((JSQPhotoMediaItem *)copyMediaData) copy];
photoItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [UIImage imageWithCGImage:photoItemCopy.image.CGImage];
/**
@ -159,6 +185,7 @@
}
else if ([copyMediaData isKindOfClass:[JSQLocationMediaItem class]]) {
JSQLocationMediaItem *locationItemCopy = [((JSQLocationMediaItem *)copyMediaData) copy];
locationItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [locationItemCopy.location copy];
/**
@ -168,8 +195,9 @@
newMediaData = locationItemCopy;
}
else if ([copyMediaData isKindOfClass:[JSQVideoMediaitem class]]) {
JSQVideoMediaitem *videoItemCopy = [((JSQVideoMediaitem *)copyMediaData) copy];
else if ([copyMediaData isKindOfClass:[JSQVideoMediaItem class]]) {
JSQVideoMediaItem *videoItemCopy = [((JSQVideoMediaItem *)copyMediaData) copy];
videoItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [videoItemCopy.fileURL copy];
/**
@ -184,17 +212,17 @@
NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);
}
newMessage = [JSQMediaMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
media:newMediaData];
newMessage = [JSQMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
media:newMediaData];
}
else {
/**
* Last message was a text message
*/
newMessage = [JSQTextMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
text:copyMessage.text];
newMessage = [JSQMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
text:copyMessage.text];
}
/**
@ -206,10 +234,10 @@
*/
[JSQSystemSoundPlayer jsq_playMessageReceivedSound];
[self.demoData.messages addObject:newMessage];
[self finishReceivingMessage];
[self finishReceivingMessageAnimated:YES];
if ([newMessage isKindOfClass:[JSQMediaMessage class]]) {
if (newMessage.isMediaMessage) {
/**
* Simulate "downloading" media
*/
@ -231,9 +259,9 @@
[self.collectionView reloadData];
}];
}
else if ([newMediaData isKindOfClass:[JSQVideoMediaitem class]]) {
((JSQVideoMediaitem *)newMediaData).fileURL = newMediaAttachmentCopy;
((JSQVideoMediaitem *)newMediaData).isReadyToPlay = YES;
else if ([newMediaData isKindOfClass:[JSQVideoMediaItem class]]) {
((JSQVideoMediaItem *)newMediaData).fileURL = newMediaAttachmentCopy;
((JSQVideoMediaItem *)newMediaData).isReadyToPlay = YES;
[self.collectionView reloadData];
}
else {
@ -271,13 +299,14 @@
*/
[JSQSystemSoundPlayer jsq_playMessageSentSound];
JSQTextMessage *message = [[JSQTextMessage alloc] initWithSenderId:senderId
senderDisplayName:senderDisplayName
date:date
text:text];
JSQMessage *message = [[JSQMessage alloc] initWithSenderId:senderId
senderDisplayName:senderDisplayName
date:date
text:text];
[self.demoData.messages addObject:message];
[self finishSendingMessage];
[self finishSendingMessageAnimated:YES];
}
- (void)didPressAccessoryButton:(UIButton *)sender
@ -318,7 +347,8 @@
}
[JSQSystemSoundPlayer jsq_playMessageSentSound];
[self finishSendingMessage];
[self finishSendingMessageAnimated:YES];
}
@ -344,7 +374,7 @@
if ([message.senderId isEqualToString:self.senderId]) {
return self.demoData.outgoingBubbleImageData;
}
return self.demoData.incomingBubbleImageData;
}
@ -372,6 +402,8 @@
*/
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
if (![message isKindOfClass:[JSQCall class]] || ![message isKindOfClass:[JSQErrorMessage class]] || ![message isKindOfClass:[JSQInfoMessage class]]) return nil;
if ([message.senderId isEqualToString:self.senderId]) {
if (![NSUserDefaults outgoingAvatarSetting]) {
return nil;
@ -382,8 +414,7 @@
return nil;
}
}
return [self.demoData.avatars objectForKey:message.senderId];
}
@ -444,38 +475,34 @@
/**
* Override point for customizing cells
*/
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
/**
* Configure almost *anything* on the cell
*
* Text colors, label text, label colors, etc.
*
*
* DO NOT set `cell.textView.font` !
* Instead, you need to set `self.collectionView.collectionViewLayout.messageBubbleFont` to the font you want in `viewDidLoad`
*
*
* DO NOT manipulate cell layout information!
* Instead, override the properties you want on `self.collectionView.collectionViewLayout` from `viewDidLoad`
*/
JSQMessage *msg = [self.demoData.messages objectAtIndex:indexPath.item];
if ([msg isKindOfClass:[JSQTextMessage class]]) {
if ([msg.senderId isEqualToString:self.senderId]) {
cell.textView.textColor = [UIColor blackColor];
}
else {
cell.textView.textColor = [UIColor whiteColor];
if ([msg isKindOfClass:[JSQMessage class]])
{
JSQMessagesCollectionViewCell *cell = (JSQMessagesCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
if (!msg.isMediaMessage) {
if ([msg.senderId isEqualToString:self.senderId]) {
cell.textView.textColor = [UIColor blackColor];
}
else {
cell.textView.textColor = [UIColor whiteColor];
}
cell.textView.linkTextAttributes = @{ NSForegroundColorAttributeName : cell.textView.textColor,
NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle | NSUnderlinePatternSolid) };
}
cell.textView.linkTextAttributes = @{ NSForegroundColorAttributeName : cell.textView.textColor,
NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle | NSUnderlinePatternSolid) };
return cell;
} else if ([msg isKindOfClass:[JSQCall class]]) {
JSQCallCollectionViewCell *cell = (JSQCallCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
return cell;
} else {
JSQDisplayedMessageCollectionViewCell * cell = (JSQDisplayedMessageCollectionViewCell *)[super collectionView:collectionView cellForItemAtIndexPath:indexPath];
return cell;
}
return cell;
}
@ -497,9 +524,9 @@
*
* Show a timestamp for every 3rd message
*/
if (indexPath.item % 3 == 0) {
return kJSQMessagesCollectionViewCellLabelHeightDefault;
}
// if (indexPath.item % 3 == 0) {
// return kJSQMessagesCollectionViewCellLabelHeightDefault;
// }
return 0.0f;
}

View File

@ -16,9 +16,9 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import Foundation;
@import UIKit;
@import CoreLocation;
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "JSQMessages.h"

View File

@ -20,6 +20,9 @@
#import "NSUserDefaults+DemoSettings.h"
#import "JSQCall.h"
#import "JSQInfoMessage.h"
#import "JSQErrorMessage.h"
/**
* This is for demo/testing purposes only.
@ -33,7 +36,7 @@
{
self = [super init];
if (self) {
if ([NSUserDefaults emptyMessagesSetting]) {
self.messages = [NSMutableArray new];
}
@ -82,7 +85,7 @@
* Be sure to create your bubble images one time and reuse them for good performance.
*
*/
JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init];
JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init];
self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleLightGrayColor]];
self.incomingBubbleImageData = [bubbleFactory incomingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleGreenColor]];
@ -99,35 +102,75 @@
* You should have a mutable array or orderedSet, or something.
*/
self.messages = [[NSMutableArray alloc] initWithObjects:
[[JSQTextMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
[[JSQCall alloc] initWithCallerId:kJSQDemoAvatarIdWoz
callerDisplayName:kJSQDemoAvatarDisplayNameWoz
date:[NSDate date]
status:kCallOutgoing],
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
date:[NSDate distantPast]
text:@"Welcome to JSQMessages: A messaging UI framework for iOS."],
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
date:[NSDate distantPast]
text:@"Welcome to JSQMessages: A messaging UI framework for iOS."],
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdWoz
senderDisplayName:kJSQDemoAvatarDisplayNameWoz
date:[NSDate distantPast]
text:@"It is simple, elegant, and easy to use. There are super sweet default settings, but you can customize like crazy."],
[[JSQTextMessage alloc] initWithSenderId:kJSQDemoAvatarIdWoz
senderDisplayName:kJSQDemoAvatarDisplayNameWoz
date:[NSDate distantPast]
text:@"It is simple, elegant, and easy to use. There are super sweet default settings, but you can customize like crazy."],
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
date:[NSDate distantPast]
text:@"It even has data detectors. You can call me tonight. My cell number is 123-456-7890. My website is www.hexedbits.com."],
[[JSQTextMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
date:[NSDate distantPast]
text:@"It even has data detectors. You can call me tonight. My cell number is 123-456-7890. My website is www.hexedbits.com."],
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdJobs
senderDisplayName:kJSQDemoAvatarDisplayNameJobs
date:[NSDate date]
text:@"JSQMessagesViewController is nearly an exact replica of the iOS Messages App. And perhaps, better."],
[[JSQTextMessage alloc] initWithSenderId:kJSQDemoAvatarIdJobs
senderDisplayName:kJSQDemoAvatarDisplayNameJobs
date:[NSDate date]
text:@"JSQMessagesViewController is nearly an exact replica of the iOS Messages App. And perhaps, better."],
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]
text:@"It is unit-tested, free, open-source, and documented."],
[[JSQTextMessage alloc] initWithSenderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]
text:@"It is unit-tested, free, open-source, and documented."],
[[JSQTextMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
[[JSQMessage alloc] initWithSenderId:kJSQDemoAvatarIdSquires
senderDisplayName:kJSQDemoAvatarDisplayNameSquires
date:[NSDate date]
text:@"Now with media messages!"],
[[JSQCall alloc] initWithCallerId:kJSQDemoAvatarIdWoz
callerDisplayName:kJSQDemoAvatarDisplayNameWoz
date:[NSDate date]
status:kCallIncoming],
[[JSQCall alloc] initWithCallerId:kJSQDemoAvatarIdWoz
callerDisplayName:kJSQDemoAvatarDisplayNameWoz
date:[NSDate date]
status:kCallMissed],
[[JSQInfoMessage alloc] initWithInfoType:JSQInfoMessageTypeSessionDidEnd
senderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]],
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageMissingKeyId
senderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]],
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageInvalidMessage
senderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]],
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageInvalidVersion
senderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]],
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageInvalidKeyException
senderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]],
[[JSQErrorMessage alloc] initWithErrorType:JSQErrorMessageWrongTrustedIdentityKey
senderId:kJSQDemoAvatarIdCook
senderDisplayName:kJSQDemoAvatarDisplayNameCook
date:[NSDate date]],
nil];
[self addPhotoMediaMessage];
@ -148,9 +191,9 @@
* You should see "END" twice
*/
if ([NSUserDefaults longMessageSetting]) {
JSQTextMessage *reallyLongMessage = [JSQTextMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
text:@"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? END Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? END"];
JSQMessage *reallyLongMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
text:@"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? END Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur? END"];
[self.messages addObject:reallyLongMessage];
}
@ -159,9 +202,9 @@
- (void)addPhotoMediaMessage
{
JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"goldengate"]];
JSQMediaMessage *photoMessage = [JSQMediaMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:photoItem];
JSQMessage *photoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:photoItem];
[self.messages addObject:photoMessage];
}
@ -172,9 +215,9 @@
JSQLocationMediaItem *locationItem = [[JSQLocationMediaItem alloc] init];
[locationItem setLocation:ferryBuildingInSF withCompletionHandler:completion];
JSQMediaMessage *locationMessage = [JSQMediaMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:locationItem];
JSQMessage *locationMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:locationItem];
[self.messages addObject:locationMessage];
}
@ -183,10 +226,10 @@
// don't have a real video, just pretending
NSURL *videoURL = [NSURL URLWithString:@"file://"];
JSQVideoMediaitem *videoItem = [[JSQVideoMediaitem alloc] initWithFileURL:videoURL isReadyToPlay:YES];
JSQMediaMessage *videoMessage = [JSQMediaMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:videoItem];
JSQVideoMediaItem *videoItem = [[JSQVideoMediaItem alloc] initWithFileURL:videoURL isReadyToPlay:YES];
JSQMessage *videoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:videoItem];
[self.messages addObject:videoMessage];
}

View File

@ -16,8 +16,8 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import Foundation;
@import UIKit;
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* This is for demo/testing purposes only.

View File

@ -15,11 +15,11 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>6.0.0</string>
<string>6.1.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>6.0.0</string>
<string>6.1.1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>

View File

@ -16,7 +16,7 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import Foundation;
#import <Foundation/Foundation.h>
@interface NSUserDefaults (DemoSettings)

View File

@ -16,8 +16,8 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import Foundation;
@import UIKit;
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "DemoMessagesViewController.h"

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "NSString+JSQMessages.h"
@ -19,24 +19,17 @@
@implementation JSQMessagesNSStringTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testTrimingStringWhitespace
{
// GIVEN: a string of text
NSString *loremIpsum = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
// WHEN: the text is wrapped in white space
NSString *string1 = [NSString stringWithFormat:@" %@ ", loremIpsum];
NSString *string2 = [NSString stringWithFormat:@" %@", loremIpsum];
NSString *string3 = [NSString stringWithFormat:@"%@ ", loremIpsum];
// THEN: we can successfully trim extra white space
XCTAssertEqualObjects(loremIpsum, [string1 jsq_stringByTrimingWhitespace], @"Strings should be equal after trimming whitespace");
XCTAssertEqualObjects(loremIpsum, [string2 jsq_stringByTrimingWhitespace], @"Strings should be equal after trimming whitespace");

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "UIColor+JSQMessages.h"
@ -19,63 +19,20 @@
@implementation JSQMessagesUIColorTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testGreenColor
{
CGFloat h, s, b, a;
UIColor *green = [UIColor jsq_messageBubbleGreenColor];
XCTAssertNotNil(green, @"Color should not be nil");
[green getHue:&h saturation:&s brightness:&b alpha:&a];
UIColor *copyGreen = [UIColor colorWithHue:h saturation:s brightness:b alpha:a];
XCTAssertEqualObjects(green, copyGreen, @"Colors should be equal");
}
- (void)testBlueColor
{
CGFloat h, s, b, a;
UIColor *blue = [UIColor jsq_messageBubbleBlueColor];
XCTAssertNotNil(blue, @"Color should not be nil");
[blue getHue:&h saturation:&s brightness:&b alpha:&a];
UIColor *copyBlue = [UIColor colorWithHue:h saturation:s brightness:b alpha:a];
XCTAssertEqualObjects(blue, copyBlue, @"Colors should be equal");
}
- (void)testGrayColor
{
CGFloat h, s, b, a;
UIColor *gray = [UIColor jsq_messageBubbleLightGrayColor];
XCTAssertNotNil(gray, @"Color should not be nil");
[gray getHue:&h saturation:&s brightness:&b alpha:&a];
UIColor *copyGray = [UIColor colorWithHue:h saturation:s brightness:b alpha:a];
XCTAssertEqualObjects(gray, copyGray, @"Colors should be equal");
}
- (void)testDarkeningColors
{
// GIVEN: a color and darkening value
CGFloat r = 0.89f, g = 0.34f, b = 0.67f, a = 1.0f;
CGFloat darkeningValue = 0.12f;
UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:a];
// WHEN: we darken that color
UIColor *darkColor = [color jsq_colorByDarkeningColorWithValue:darkeningValue];
// THEN: each RGB value is changed accordingly
CGFloat dr, dg, db, da;
[darkColor getRed:&dr green:&dg blue:&db alpha:&da];
XCTAssertEqual(dr, r - darkeningValue, @"Red values should be equal");
XCTAssertEqual(dg, g - darkeningValue, @"Green values should be equal");
XCTAssertEqual(db, b - darkeningValue, @"Blue values should be equal");
@ -84,13 +41,15 @@
- (void)testDarkeningColorsFloorToZero
{
// GIVEN: a color and darkening value
CGFloat r = 0.89f, g = 0.24f, b = 0.67f, a = 1.0f;
CGFloat darkeningValue = 0.5f;
UIColor *color = [UIColor colorWithRed:r green:g blue:b alpha:a];
// WHEN: we dark that color, such that some RGB values will be negative
UIColor *darkColor = [color jsq_colorByDarkeningColorWithValue:darkeningValue];
// THEN: the RGB values are floored to zero instead of being negative
CGFloat dr, dg, db, da;
[darkColor getRed:&dr green:&dg blue:&db alpha:&da];
XCTAssertEqual(dr, r - darkeningValue, @"Red values should be equal");

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "UIImage+JSQMessages.h"
@ -19,24 +19,17 @@
@implementation JSQMessagesUIImageTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testImageMasking
{
UIImage *img = [UIImage imageNamed:@"bubble_min"];
// GIVEN: an image
UIImage *img = [UIImage jsq_bubbleCompactImage];
XCTAssertNotNil(img, @"Image should not be nil");
// WHEN: we mask that image
UIImage *imgMasked = [img jsq_imageMaskedWithColor:[UIColor whiteColor]];
XCTAssertNotNil(imgMasked, @"Image should not be nil");
// THEN: masking should succeed, and the new image should have the same properties
XCTAssertTrue(CGSizeEqualToSize(img.size, imgMasked.size), @"Image sizes should be equal");
XCTAssertEqual(img.scale, imgMasked.scale, @"Image scales should be equal");
@ -44,4 +37,31 @@
XCTAssertThrows([img jsq_imageMaskedWithColor:nil], @"Should throw when passing nil color");
}
- (void)testImageAssets
{
// GIVEN: our image assets
// WHEN: we create a new UIImage object
// THEN: the image is created successfully
XCTAssertNotNil([UIImage jsq_bubbleRegularImage]);
XCTAssertNotNil([UIImage jsq_bubbleRegularTaillessImage]);
XCTAssertNotNil([UIImage jsq_bubbleRegularStrokedImage]);
XCTAssertNotNil([UIImage jsq_bubbleRegularStrokedTaillessImage]);
XCTAssertNotNil([UIImage jsq_bubbleCompactImage]);
XCTAssertNotNil([UIImage jsq_bubbleCompactTaillessImage]);
XCTAssertNotNil([UIImage jsq_defaultAccessoryImage]);
XCTAssertNotNil([UIImage jsq_defaultTypingIndicatorImage]);
XCTAssertNotNil([UIImage jsq_defaultPlayImage]);
}
@end

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "UIView+JSQMessages.h"
@ -19,23 +19,24 @@
@implementation JSQMessagesUIViewTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testViewAutoLayoutPinEdges
{
// GIVEN: a superview and subview
UIView *superview = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];
[superview setTranslatesAutoresizingMaskIntoConstraints:NO];
UIView *subview = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 25.0f, 25.0f)];
[subview setTranslatesAutoresizingMaskIntoConstraints:NO];
// WHEN: we add the subview to the superview
[superview addSubview:subview];
// WHEN: we pin the edges of the subview to the superview
XCTAssertNoThrow([superview jsq_pinAllEdgesOfSubview:subview], @"Pinning edges of subview to superview should not throw");
[superview setNeedsUpdateConstraints];
[superview layoutIfNeeded];
// THEN: add the layout constraints and laying out the views succeeds
XCTAssertEqual([[superview constraints] count], 4U, @"Superview should have 4 constraints");

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesKeyboardController.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesAvatarImageFactory.h"
@ -48,7 +48,6 @@
avatar.avatarHighlightedImage = [JSQMessagesAvatarImageFactory circularAvatarHighlightedImage:image withDiameter:diameter];
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarHighlightedImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
XCTAssertEqual(avatar.avatarHighlightedImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
}
- (void)testAvatarInitialsImage

View File

@ -8,10 +8,12 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesBubbleImageFactory.h"
#import "UIImage+JSQMessages.h"
@interface JSQMessagesBubbleImageFactoryTests : XCTestCase
@ -36,7 +38,7 @@
- (void)testOutgoingMessageBubbleImageView
{
UIImage *bubble = [UIImage imageNamed:@"bubble_min"];
UIImage *bubble = [UIImage jsq_bubbleCompactImage];
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
CGPoint center = CGPointMake(bubble.size.width / 2.0f, bubble.size.height / 2.0f);
@ -61,7 +63,7 @@
- (void)testIncomingMessageBubbleImageView
{
UIImage *bubble = [UIImage imageNamed:@"bubble_min"];
UIImage *bubble = [UIImage jsq_bubbleCompactImage];
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
CGPoint center = CGPointMake(bubble.size.width / 2.0f, bubble.size.height / 2.0f);
@ -86,7 +88,7 @@
- (void)testCustomOutgoingMessageBubbleImageView
{
UIImage *bubble = [UIImage imageNamed:@"clip"];
UIImage *bubble = [UIImage jsq_bubbleRegularStrokedTaillessImage];
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
UIEdgeInsets capInsets = UIEdgeInsetsMake(1, 1, 1, 1);
@ -109,7 +111,7 @@
- (void)testCustomIncomingMessageBubbleImageView
{
UIImage *bubble = [UIImage imageNamed:@"clip"];
UIImage *bubble = [UIImage jsq_bubbleRegularStrokedTaillessImage];
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
UIEdgeInsets capInsets = UIEdgeInsetsMake(1, 1, 1, 1);

View File

@ -0,0 +1,37 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// MIT License
// Copyright (c) 2014 Jesse Squires
// http://opensource.org/licenses/MIT
//
#import <XCTest/XCTest.h>
#import "JSQMessagesMediaViewBubbleImageMasker.h"
@interface JSQMessagesMediaViewBubbleImageMaskerTests : XCTestCase
@end
@implementation JSQMessagesMediaViewBubbleImageMaskerTests
- (void)testMediaViewBubbleImageMasker
{
// GIVEN: a new masker object
JSQMessagesMediaViewBubbleImageMasker *masker = [[JSQMessagesMediaViewBubbleImageMasker alloc] init];
XCTAssertNotNil(masker);
// WHEN: we apply a mask to a view
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
// THEN: it succeeds without an error
XCTAssertNoThrow([masker applyOutgoingBubbleImageMaskToMediaView:view1]);
XCTAssertNoThrow([masker applyIncomingBubbleImageMaskToMediaView:view2]);
}
@end

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesTimestampFormatter.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesToolbarButtonFactory.h"
@ -16,56 +16,22 @@
@interface JSQMessagesToolbarButtonFactoryTests : XCTestCase
@end
@implementation JSQMessagesToolbarButtonFactoryTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testDefaultSendButtonItem
{
UIButton *button = [JSQMessagesToolbarButtonFactory defaultSendButtonItem];
XCTAssertNotNil(button, @"Button should not be nil");
XCTAssertTrue(CGRectEqualToRect(button.frame, CGRectZero), @"Button initial frame should equal CGRectZero");
NSString *title = @"Send";
XCTAssertEqualObjects([button titleForState:UIControlStateNormal], title, @"Button title should equal %@", title);
XCTAssertNil(button.imageView.image, @"Button image should be nil");
XCTAssertEqualObjects([button titleColorForState:UIControlStateNormal], [UIColor jsq_messageBubbleBlueColor], @"Button normal title color should be set");
XCTAssertEqualObjects([button titleColorForState:UIControlStateHighlighted], [[UIColor jsq_messageBubbleBlueColor] jsq_colorByDarkeningColorWithValue:0.1f], @"Button highlighted title color should be set");
XCTAssertEqualObjects([button titleColorForState:UIControlStateDisabled], [UIColor lightGrayColor], @"Button disabled title color should be set");
XCTAssertEqualObjects(button.titleLabel.font, [UIFont boldSystemFontOfSize:17.0f], @"Button font should be set");
XCTAssertEqual(button.contentMode, UIViewContentModeCenter, @"Button content mode should be set");
XCTAssertEqualObjects(button.backgroundColor, [UIColor clearColor], @"Button background color should be set");
XCTAssertEqualObjects(button.tintColor, [UIColor jsq_messageBubbleBlueColor], @"Button tint color should be set");
}
- (void)testDefaultAccessoryButtonItem
{
UIButton *button = [JSQMessagesToolbarButtonFactory defaultAccessoryButtonItem];
XCTAssertNotNil(button, @"Button should not be nil");
XCTAssertTrue(CGRectEqualToRect(button.frame, CGRectZero), @"Button frame should equal CGRectZero");
XCTAssertNil(button.titleLabel.text, @"Button title should be nil");
XCTAssertNotNil([button imageForState:UIControlStateNormal], @"Button normal image should not be nil");
XCTAssertNotNil([button imageForState:UIControlStateHighlighted], @"Button highlighted image should not be nil");
XCTAssertEqual(button.contentMode, UIViewContentModeScaleAspectFit, @"Button content mode should be set");
XCTAssertEqualObjects(button.backgroundColor, [UIColor clearColor], @"Button background color should be set");
XCTAssertEqualObjects(button.tintColor, [UIColor lightGrayColor], @"Button tint color should be set");
}
@end

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesCollectionViewFlowLayout.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesCollectionViewLayoutAttributes.h"
@ -34,7 +34,7 @@
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];
JSQMessagesCollectionViewLayoutAttributes *attrs = [JSQMessagesCollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attrs.messageBubbleFont = [UIFont systemFontOfSize:15.0f];
attrs.messageBubbleLeftRightMargin = 40.0f;
attrs.messageBubbleContainerViewWidth = 40.0f;
attrs.textViewTextContainerInsets = UIEdgeInsetsMake(10.0f, 8.0f, 10.0f, 8.0f);
attrs.textViewFrameInsets = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, 6.0f);
attrs.incomingAvatarViewSize = CGSizeMake(34.0f, 34.0f);

View File

@ -0,0 +1,64 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// MIT License
// Copyright (c) 2014 Jesse Squires
// http://opensource.org/licenses/MIT
//
#import <XCTest/XCTest.h>
#import "JSQLocationMediaItem.h"
@interface JSQLocationMediaItemTests : XCTestCase
@property (strong, nonatomic) CLLocation *location;
@end
@implementation JSQLocationMediaItemTests
- (void)setUp
{
[super setUp];
self.location = [[CLLocation alloc] initWithLatitude:37.795313 longitude:-122.393757];
}
- (void)tearDown
{
self.location = nil;
[super tearDown];
}
- (void)testLocationItemInit
{
JSQLocationMediaItem *item = [[JSQLocationMediaItem alloc] initWithLocation:self.location];
XCTAssertNotNil(item);
}
- (void)testMediaDataProtocol
{
JSQLocationMediaItem *item = [[JSQLocationMediaItem alloc] init];
XCTAssertTrue(!CGSizeEqualToSize([item mediaViewDisplaySize], CGSizeZero));
XCTAssertNotNil([item mediaPlaceholderView]);
XCTAssertNil([item mediaView], @"Media view should be nil if location is nil");
XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"%s", __PRETTY_FUNCTION__]];
[item setLocation:self.location withCompletionHandler:^{
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:5 handler:^(NSError *error) {
XCTAssertNil(error, @"Expectation should not error");
}];
XCTAssertNotNil([item mediaView], @"Media view should NOT be nil once item has media data");
}
@end

View File

@ -8,11 +8,11 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
#import "JSQMediaMessage.h"
#import "JSQMessage.h"
// Fake media object for testing
@ -35,7 +35,7 @@
@interface JSQMediaMessageTests : XCTestCase
@interface JSQMessageMediaTests : XCTestCase
@property (strong, nonatomic) NSString *senderId;
@property (strong, nonatomic) NSString *senderDisplayName;
@ -45,7 +45,7 @@
@end
@implementation JSQMediaMessageTests
@implementation JSQMessageMediaTests
- (void)setUp
{
@ -65,46 +65,46 @@
[super tearDown];
}
- (void)testTextMessageInit
- (void)testMediaMessageInit
{
JSQMediaMessage *msg = [[JSQMediaMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:self.mockMediaData];
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:self.mockMediaData];
XCTAssertNotNil(msg, @"Message should not be nil");
}
- (void)testMessageInvalidInit
- (void)testMediaMessageInvalidInit
{
XCTAssertThrows([[JSQMediaMessage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQMediaMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil media:nil], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil media:nil], @"Invalid init should throw");
}
- (void)testMessageIsEqual
- (void)testMediaMessageIsEqual
{
JSQMediaMessage *msg = [[JSQMediaMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:self.mockMediaData];
JSQMediaMessage *copy = [msg copy];
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:self.mockMediaData];
JSQMessage *copy = [msg copy];
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
XCTAssertEqual([msg hash], [copy hash], @"Copied messages hashes should be equal");
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
XCTAssertEqualObjects(msg, msg, @"Messages should be equal to itself");
}
- (void)testMessageArchiving
- (void)testMediaMessageArchiving
{
JSQMediaMessage *msg = [[JSQMediaMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:[FakeMedia new]];
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:[FakeMedia new]];
NSData *msgData = [NSKeyedArchiver archivedDataWithRootObject:msg];
JSQMediaMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];
JSQMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];
XCTAssertEqualObjects(msg, unarchivedMsg, @"Message should be equal");
}

View File

@ -8,28 +8,34 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessage.h"
@interface JSQMessageTests : XCTestCase
@interface JSQMessageTextTests : XCTestCase
@property (strong, nonatomic) NSString *senderId;
@property (strong, nonatomic) NSString *senderDisplayName;
@property (strong, nonatomic) NSDate *date;
@property (strong, nonatomic) NSString *text;
@end
@implementation JSQMessageTests
@implementation JSQMessageTextTests
- (void)setUp
{
[super setUp];
self.senderId = @"324543-43556-212343";
self.senderDisplayName = @"Jesse Squires";
self.date = [NSDate date];
self.text = @"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque"
@"laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi"
@"architecto beatae vitae dicta sunt explicabo.";
}
- (void)tearDown
@ -37,39 +43,48 @@
self.senderId = nil;
self.senderDisplayName = nil;
self.date = nil;
self.text = nil;
[super tearDown];
}
- (void)testMessageInit
#pragma mark - Text messages
- (void)testTextMessageInit
{
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId senderDisplayName:self.senderDisplayName date:self.date isMedia:NO];
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
XCTAssertNotNil(msg, @"Message should not be nil");
}
- (void)testMessageInvalidInit
- (void)testTextMessageInvalidInit
{
XCTAssertThrows([[JSQMessage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil isMedia:NO], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:self.senderId senderDisplayName:nil date:nil isMedia:YES], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:self.senderDisplayName date:nil isMedia:NO], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:self.date isMedia:YES], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil text:nil], @"Invalid init should throw");
}
- (void)testMessageIsEqual
- (void)testTextMessageIsEqual
{
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId senderDisplayName:self.senderDisplayName date:self.date isMedia:NO];
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
JSQMessage *copy = [msg copy];
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
XCTAssertEqual([msg hash], [copy hash], @"Copied messages hashes should be equal");
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
XCTAssertEqualObjects(msg, msg, @"Messages should be equal to itself");
}
- (void)testMessageArchiving
- (void)testTextMessageArchiving
{
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId senderDisplayName:self.senderDisplayName date:self.date isMedia:YES];
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
NSData *msgData = [NSKeyedArchiver archivedDataWithRootObject:msg];
JSQMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesAvatarImage.h"

View File

@ -8,10 +8,12 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesBubbleImage.h"
#import "UIImage+JSQMessages.h"
@interface JSQMessagesBubbleImageTests : XCTestCase
@ -38,14 +40,14 @@
- (void)testInitValid
{
UIImage *mockImage = [UIImage imageNamed:@"bubble_min"];
UIImage *mockImage = [UIImage jsq_bubbleCompactImage];
JSQMessagesBubbleImage *bubbleImage = [[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:mockImage highlightedImage:mockImage];
XCTAssertNotNil(bubbleImage, @"Valid init should succeed");
}
- (void)testCopy
{
UIImage *mockImage = [UIImage imageNamed:@"bubble_min"];
UIImage *mockImage = [UIImage jsq_bubbleCompactImage];
JSQMessagesBubbleImage *bubbleImage = [[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:mockImage highlightedImage:mockImage];
JSQMessagesBubbleImage *copy = [bubbleImage copy];

View File

@ -0,0 +1,76 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// MIT License
// Copyright (c) 2014 Jesse Squires
// http://opensource.org/licenses/MIT
//
#import <XCTest/XCTest.h>
#import "JSQPhotoMediaItem.h"
@interface JSQPhotoMediaItemTests : XCTestCase
@end
@implementation JSQPhotoMediaItemTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testPhotoItemInit
{
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage new]];
XCTAssertNotNil(item);
}
- (void)testPhotoItemIsEqual
{
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"demo_avatar_jobs"]];
JSQPhotoMediaItem *copy = [item copy];
XCTAssertEqualObjects(item, copy, @"Copied items should be equal");
XCTAssertEqual([item hash], [copy hash], @"Copied item hashes should be equal");
XCTAssertEqualObjects(item, item, @"Item should be equal to itself");
}
- (void)testPhotoItemArchiving
{
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage new]];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:item];
JSQPhotoMediaItem *unarchivedItem = [NSKeyedUnarchiver unarchiveObjectWithData:data];
XCTAssertEqualObjects(item, unarchivedItem);
}
- (void)testMediaDataProtocol
{
JSQPhotoMediaItem *item = [[JSQPhotoMediaItem alloc] initWithImage:nil];
XCTAssertTrue(!CGSizeEqualToSize([item mediaViewDisplaySize], CGSizeZero));
XCTAssertNotNil([item mediaPlaceholderView]);
XCTAssertNil([item mediaView], @"Media view should be nil if image is nil");
item.image = [UIImage imageNamed:@"demo_avatar_jobs"];
XCTAssertNotNil([item mediaView], @"Media view should NOT be nil once item has media data");
}
@end

View File

@ -1,91 +0,0 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// MIT License
// Copyright (c) 2014 Jesse Squires
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import "JSQTextMessage.h"
@interface JSQTextMessageTests : XCTestCase
@property (strong, nonatomic) NSString *senderId;
@property (strong, nonatomic) NSString *senderDisplayName;
@property (strong, nonatomic) NSDate *date;
@property (strong, nonatomic) NSString *text;
@end
@implementation JSQTextMessageTests
- (void)setUp
{
[super setUp];
self.senderId = @"324543-43556-212343";
self.senderDisplayName = @"Jesse Squires";
self.date = [NSDate date];
self.text = @"Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque"
@"laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi"
@"architecto beatae vitae dicta sunt explicabo.";
}
- (void)tearDown
{
self.senderId = nil;
self.senderDisplayName = nil;
self.date = nil;
self.text = nil;
[super tearDown];
}
- (void)testTextMessageInit
{
JSQTextMessage *msg = [[JSQTextMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
XCTAssertNotNil(msg, @"Message should not be nil");
}
- (void)testMessageInvalidInit
{
XCTAssertThrows([[JSQTextMessage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQTextMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil text:nil], @"Invalid init should throw");
}
- (void)testMessageIsEqual
{
JSQTextMessage *msg = [[JSQTextMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
JSQTextMessage *copy = [msg copy];
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
XCTAssertEqual([msg hash], [copy hash], @"Copied messages hashes should be equal");
XCTAssertEqualObjects(msg, copy, @"Copied messages should be equal");
XCTAssertEqualObjects(msg, msg, @"Messages should be equal to itself");
}
- (void)testMessageArchiving
{
JSQTextMessage *msg = [[JSQTextMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
NSData *msgData = [NSKeyedArchiver archivedDataWithRootObject:msg];
JSQTextMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];
XCTAssertEqualObjects(msg, unarchivedMsg, @"Message should be equal");
}
@end

View File

@ -0,0 +1,77 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// MIT License
// Copyright (c) 2014 Jesse Squires
// http://opensource.org/licenses/MIT
//
#import <XCTest/XCTest.h>
#import "JSQVideoMediaItem.h"
@interface JSQVideoMediaItemTests : XCTestCase
@end
@implementation JSQVideoMediaItemTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testVideoMediaItemInit
{
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:@"file://"] isReadyToPlay:NO];
XCTAssertNotNil(item);
}
- (void)testVideoItemIsEqual
{
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:@"file://"] isReadyToPlay:YES];
JSQVideoMediaItem *copy = [item copy];
XCTAssertEqualObjects(item, copy, @"Copied items should be equal");
XCTAssertEqual([item hash], [copy hash], @"Copied item hashes should be equal");
XCTAssertEqualObjects(item, item, @"Item should be equal to itself");
}
- (void)testVideoItemArchiving
{
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] initWithFileURL:[NSURL URLWithString:@"file://"] isReadyToPlay:YES];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:item];
JSQVideoMediaItem *unarchivedItem = [NSKeyedUnarchiver unarchiveObjectWithData:data];
XCTAssertEqualObjects(item, unarchivedItem);
}
- (void)testMediaDataProtocol
{
JSQVideoMediaItem *item = [[JSQVideoMediaItem alloc] init];
XCTAssertTrue(!CGSizeEqualToSize([item mediaViewDisplaySize], CGSizeZero));
XCTAssertNotNil([item mediaPlaceholderView]);
XCTAssertNil([item mediaView], @"Media view should be nil if fileURL is nil, and readyToPlay is NO");
item.fileURL = [NSURL URLWithString:@"file://"];
item.isReadyToPlay = YES;
XCTAssertNotNil([item mediaView], @"Media view should NOT be nil once item has media data");
}
@end

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesCollectionViewCellIncoming.h"
#import "JSQMessagesCollectionViewCellOutgoing.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesCollectionView.h"
#import "JSQMessagesCollectionViewFlowLayout.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesComposerTextView.h"
@ -54,7 +54,7 @@
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.scrollIndicatorInsets, UIEdgeInsetsMake(6.0f, 0.0f, 6.0f, 0.0f)), @"Property should be equal to default value");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.textContainerInset, UIEdgeInsetsMake(4.0f, 2.0f, 4.0f, 2.0f)), @"Property should be equal to default value");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.contentInset, UIEdgeInsetsMake(2.0f, 0.0f, 2.0f, 0.0f)), @"Property should be equal to default value");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(self.textView.contentInset, UIEdgeInsetsMake(1.0f, 0.0f, 1.0f, 0.0f)), @"Property should be equal to default value");
XCTAssertEqual(self.textView.scrollEnabled, YES, @"Property should be equal to default value");
XCTAssertEqual(self.textView.scrollsToTop, NO, @"Property should be equal to default value");

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesViewController.h"
#import "JSQMessagesInputToolbar.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesLabel.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesLoadEarlierHeaderView.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesToolbarContentView.h"
#import "JSQMessagesComposerTextView.h"

View File

@ -8,7 +8,7 @@
// http://opensource.org/licenses/MIT
//
@import XCTest;
#import <XCTest/XCTest.h>
#import "JSQMessagesTypingIndicatorFooterView.h"

View File

@ -1,17 +1,19 @@
Pod::Spec.new do |s|
s.name = 'JSQMessagesViewController'
s.version = '6.0-beta5'
s.version = '6.1.1'
s.summary = 'An elegant messages UI library for iOS.'
s.homepage = 'http://jessesquires.github.io/JSQMessagesViewController'
s.license = 'MIT'
s.screenshots = ['https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/Screenshots/screenshot0.png',
'https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/Screenshots/screenshot1.png']
'https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/Screenshots/screenshot1.png',
'https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/Screenshots/screenshot2.png',
'https://raw.githubusercontent.com/jessesquires/JSQMessagesViewController/develop/Screenshots/screenshot3.png']
s.author = { 'Jesse Squires' => 'jesse.squires.developer@gmail.com' }
s.social_media_url = 'https://twitter.com/jesse_squires'
s.source = { :git => 'https://github.com/jessesquires/JSQMessagesViewController.git', :tag => s.version.to_s }
s.platform = :ios, '7.0'
s.source_files = 'JSQMessagesViewController/**/*.{h,m}'
s.resources = 'JSQMessagesViewController/Assets/**/*.{png,aiff}', 'JSQMessagesViewController/**/*.{xib}'
s.resources = 'JSQMessagesViewController/Assets/JSQMessagesAssets.bundle', 'JSQMessagesViewController/Assets/Strings/*.lproj', 'JSQMessagesViewController/**/*.{xib}',
s.frameworks = 'QuartzCore', 'CoreGraphics', 'CoreLocation', 'MapKit', 'UIKit', 'Foundation'
s.requires_arc = true

View File

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 372 B

After

Width:  |  Height:  |  Size: 372 B

View File

Before

Width:  |  Height:  |  Size: 741 B

After

Width:  |  Height:  |  Size: 741 B

View File

Before

Width:  |  Height:  |  Size: 801 B

After

Width:  |  Height:  |  Size: 801 B

View File

Before

Width:  |  Height:  |  Size: 412 B

After

Width:  |  Height:  |  Size: 412 B

View File

Before

Width:  |  Height:  |  Size: 918 B

After

Width:  |  Height:  |  Size: 918 B

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 318 B

After

Width:  |  Height:  |  Size: 318 B

View File

Before

Width:  |  Height:  |  Size: 652 B

After

Width:  |  Height:  |  Size: 652 B

View File

Before

Width:  |  Height:  |  Size: 995 B

After

Width:  |  Height:  |  Size: 995 B

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Load Earlier Messages";
"Send" = "Send";
"New Message" = "New Message";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Ältere Nachrichten laden";
"Send" = "Senden";
"New Message" = "Neue Nachricht";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Load Earlier Messages";
"Send" = "Send";
"New Message" = "New Message";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Cargar mensajes anteriores";
"Send" = "Enviar";
"New Message" = "Nuevo mensaje";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Messages précedents";
"Send" = "Envoi";
"New Message" = "Nouveau message";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "טען הודעות קודמות";
"Send" = "שלח";
"New Message" = "הודעה חדשה";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Carica messaggi precedenti";
"Send" = "Invia";
"New Message" = "Nuovo Messaggio";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Laad eerdere berichten";
"Send" = "Stuur";
"New Message" = "Nieuw bericht";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Otwórz wcześniejsze wiadomości";
"Send" = "Wyślij";
"New Message" = "Nowa wiadomość";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Carregar mensagens anteriore";
"Send" = "Enviar";
"New Message" = "Nova Mensagem";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Încărcați mesajele anterioare";
"Send" = "Trimiteți";
"New Message" = "Mesaj nou";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Предыдущие сообщения";
"Send" = "Отпр";
"New Message" = "Сообщение";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "Eski mesajları yükle";
"Send" = "Gönder";
"New Message" = "Yeni Mesaj";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "载入较早的信息";
"Send" = "发送";
"New Message" = "新信息";

View File

@ -0,0 +1,29 @@
//
// Created by Jesse Squires
// http://www.jessesquires.com
//
//
// Documentation
// http://cocoadocs.org/docsets/JSQMessagesViewController
//
//
// GitHub
// https://github.com/jessesquires/JSQMessagesViewController
//
//
// License
// Copyright (c) 2014 Jesse Squires
// Released under an MIT license: http://opensource.org/licenses/MIT
//
// ********************************
// Special thanks to the localization contributors!
//
// https://github.com/jessesquires/JSQMessagesViewController/issues/237
// ********************************
"Load Earlier Messages" = "載入之前的訊息";
"Send" = "傳送";
"New Message" = "新信息";

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -18,8 +18,8 @@
#import "JSQSystemSoundPlayer+JSQMessages.h"
static NSString * const kJSQMessageReceivedSoundName = @"message_received";
static NSString * const kJSQMessageSentSoundName = @"message_sent";
static NSString * const kJSQMessageReceivedSoundName = @"JSQMessagesAssets.bundle/Sounds/message_received";
static NSString * const kJSQMessageSentSoundName = @"JSQMessagesAssets.bundle/Sounds/message_sent";
@implementation JSQSystemSoundPlayer (JSQMessages)

View File

@ -16,7 +16,7 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import Foundation;
#import <Foundation/Foundation.h>
@interface NSString (JSQMessages)

View File

@ -16,7 +16,7 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import UIKit;
#import <UIKit/UIKit.h>
@interface UIColor (JSQMessages)
@ -32,11 +32,32 @@
*/
+ (UIColor *)jsq_messageBubbleBlueColor;
/**
* @return A color object containing HSB values similar to the iOS 7 red color.
*/
+ (UIColor *)jsq_messageBubbleRedColor;
/**
* @return A color object containing HSB values similar to the iOS 7 messages app light gray bubble color.
*/
+ (UIColor *)jsq_messageBubbleLightGrayColor;
/**
* @return A color object containing HSB values similar to Signal gray bubble color.
*/
+ (UIColor *)jsq_messageBubbleGrayColor;
/**
* @return A color object containing HSB values similar to Signal light blue bubble color.
*/
+ (UIColor *)jsq_messageBubbleLightBlueColor;
/**
* @return A color object containing HSB values similar to Signal background gray color.
*/
+ (UIColor *)jsq_messageBackgroundGrayColor;
#pragma mark - Utilities
/**

View File

@ -26,7 +26,7 @@
{
return [UIColor colorWithHue:130.0f / 360.0f
saturation:0.68f
brightness:0.80f
brightness:0.84f
alpha:1.0f];
}
@ -38,6 +38,14 @@
alpha:1.0f];
}
+ (UIColor *)jsq_messageBubbleRedColor
{
return [UIColor colorWithHue:0.0f / 360.0f
saturation:0.79f
brightness:1.0f
alpha:1.0f];
}
+ (UIColor *)jsq_messageBubbleLightGrayColor
{
return [UIColor colorWithHue:240.0f / 360.0f
@ -46,6 +54,23 @@
alpha:1.0f];
}
+ (UIColor *)jsq_messageBubbleLightBlueColor
{
return [UIColor colorWithRed:137/255.f green:214/255.f blue:250/255.f alpha:1];
}
+ (UIColor *)jsq_messageBubbleGrayColor
{
return [UIColor colorWithRed:230/255.f green:230/255.f blue:230/255.f alpha:1];
}
+ (UIColor *)jsq_messageBackgroundGrayColor
{
return [UIColor colorWithRed:242.f/255 green:242.f/255 blue:242.f/255 alpha:1];
}
#pragma mark - Utilities
- (UIColor *)jsq_colorByDarkeningColorWithValue:(CGFloat)value

View File

@ -16,7 +16,7 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import UIKit;
#import <UIKit/UIKit.h>
@interface UIDevice (JSQMessages)

View File

@ -16,7 +16,7 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import UIKit;
#import <UIKit/UIKit.h>
@interface UIImage (JSQMessages)
@ -61,4 +61,19 @@
*/
+ (UIImage *)jsq_bubbleCompactTaillessImage;
/**
* @return The default input toolbar accessory image.
*/
+ (UIImage *)jsq_defaultAccessoryImage;
/**
* @return The default typing indicator image.
*/
+ (UIImage *)jsq_defaultTypingIndicatorImage;
/**
* @return The default play icon image.
*/
+ (UIImage *)jsq_defaultPlayImage;
@end

View File

@ -45,34 +45,55 @@
return newImage;
}
+ (UIImage *)jsq_bubbleImageFromBundleWithName:(NSString *)name
{
return [UIImage imageNamed:[NSString stringWithFormat:@"JSQMessagesAssets.bundle/Images/%@", name]];
}
+ (UIImage *)jsq_bubbleRegularImage
{
return [UIImage imageNamed:@"bubble"];
return [UIImage jsq_bubbleImageFromBundleWithName:@"bubble_regular"];
}
+ (UIImage *)jsq_bubbleRegularTaillessImage
{
return [UIImage imageNamed:@"bubble_tailless"];
return [UIImage jsq_bubbleImageFromBundleWithName:@"bubble_tailless"];
}
+ (UIImage *)jsq_bubbleRegularStrokedImage
{
return [UIImage imageNamed:@"bubble_stroked"];
return [UIImage jsq_bubbleImageFromBundleWithName:@"bubble_stroked"];
}
+ (UIImage *)jsq_bubbleRegularStrokedTaillessImage
{
return [UIImage imageNamed:@"bubble_stroked_tailless"];
return [UIImage jsq_bubbleImageFromBundleWithName:@"bubble_stroked_tailless"];
}
+ (UIImage *)jsq_bubbleCompactImage
{
return [UIImage imageNamed:@"bubble_min"];
return [UIImage jsq_bubbleImageFromBundleWithName:@"bubble_min"];
}
+ (UIImage *)jsq_bubbleCompactTaillessImage
{
return [UIImage imageNamed:@"bubble_min_tailless"];
return [UIImage jsq_bubbleImageFromBundleWithName:@"bubble_min_tailless"];
}
+ (UIImage *)jsq_defaultAccessoryImage
{
return [UIImage jsq_bubbleImageFromBundleWithName:@"clip"];
}
+ (UIImage *)jsq_defaultTypingIndicatorImage
{
return [UIImage jsq_bubbleImageFromBundleWithName:@"typing"];
}
+ (UIImage *)jsq_defaultPlayImage
{
return [UIImage jsq_bubbleImageFromBundleWithName:@"play"];
}
@end

View File

@ -16,7 +16,7 @@
// Released under an MIT license: http://opensource.org/licenses/MIT
//
@import UIKit;
#import <UIKit/UIKit.h>
@interface UIView (JSQMessages)

View File

@ -21,8 +21,8 @@
// https://github.com/danielamitay/DAKeyboardControl
//
@import Foundation;
@import UIKit;
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class JSQMessagesKeyboardController;
@ -59,6 +59,13 @@ FOUNDATION_EXPORT NSString * const JSQMessagesKeyboardControllerUserInfoKeyKeybo
*/
- (void)keyboardController:(JSQMessagesKeyboardController *)keyboardController keyboardDidChangeFrame:(CGRect)keyboardFrame;
/**
* Tells the delegate that the keyboard has been hidden.
*
* @param keyboardController The keyboard controller that is notifying the delegate.
*/
- (void)keyboardControllerKeyboardDidHide:(JSQMessagesKeyboardController *)keyboardController;
@end

Some files were not shown because too many files have changed in this diff Show More