Compare commits

..

427 Commits

Author SHA1 Message Date
Matthew Chen
b1cad8234c Strip unused code and assets. 2018-07-20 11:49:22 -04:00
Michael Kirk
33dd72b7ba Hack to make share extension work.
We're not using these methods anyway. Ideally we can remove this
dependency altogether. At least from SignalMessaging if not the entire
app.
2017-12-05 17:27:58 -05:00
Michael Kirk
7d9e7562c6 Merge branch 'mkirk/ios11-compat' into signal-master 2017-09-06 11:45:26 -04:00
Michael Kirk
44b820ef5d Avoid iOS11 name collision
iOS11 introduced it's own `pasteDelegate` method on textView.

// FREEBIE
2017-09-06 09:28:47 -04:00
Matthew Chen
f9063f634f Merge branch 'charlesmchen/layoutGlitches' into signal-master 2017-08-31 16:35:01 -04:00
Matthew Chen
adbffe3e87 Preserve scroll state across conversation view layout changes, if possible.
// FREEBIE
2017-08-31 12:53:39 -04:00
Matthew Chen
f03e14f754 Observe layout changes in conversation view.
// FREEBIE
2017-08-31 12:39:07 -04:00
Matthew Chen
3f74b56ca7 Don't instantiate nib twice.
// FREEBIE
2017-08-31 12:37:44 -04:00
Matthew Chen
868cf70fae Merge branch 'charlesmchen/messageViewScrollStateRevisited' into signal-master 2017-08-29 11:23:53 -04:00
Matthew Chen
8ffe2518ef Revisit the [UIScrollView _adjustContentOffsetIfNecessary] issue.
// FREEBIE
2017-08-29 11:09:55 -04:00
Matthew Chen
9e452ee59c Merge branch 'charlesmchen/jsqTweaks' into signal-master 2017-08-25 16:56:53 -04:00
Matthew Chen
bb8ec4afcc Fix "scroll state flickers when presenting messages view" issue.
// FREEBIE
2017-08-25 16:56:42 -04:00
Matthew Chen
eb6205d0c9 Merge branch 'charlesmchen/ignoreSpuriousTraitCollectionChanges' into signal-master 2017-08-25 16:55:36 -04:00
Matthew Chen
221ad25fd7 Ignore spurious trait collection changes on view presentation.
// FREEBIE
2017-08-25 14:45:43 -04:00
Matthew Chen
d26758cd2b Merge branch 'charlesmchen/jsqRedundantLayout' into signal-master 2017-08-25 14:44:57 -04:00
Matthew Chen
06d5c6e646 Remove redundant view layout in JSQ view.
// FREEBIE
2017-08-25 13:11:52 -04:00
Michael Kirk
8c10f920bb Merge branch 'mkirk/fix-scrolling-crashes' into signal-master 2017-08-10 11:06:04 -04:00
Michael Kirk
146b84febc Fix scrolling crash
Don't touch the header zIndex at all, since we're not doing it
consistently, and we don't need it modified anyway.
2017-08-10 10:59:27 -04:00
Michael Kirk
7a7deff318 Adjusting insets should invalidate layout
Intended to fix crashes like these:

    Last Exception Backtrace:
    0   CoreFoundation   0x185818d5c __exceptionPreprocess + 124 (NSException.m:166)
    1   libobjc.A.dylib  0x184d2c528 objc_exception_throw + 56 (objc-exception.mm:521)
    2   CoreFoundation   0x185818c30 +[NSException raise:format:arguments:] + 104 (NSException.m:132)
    3   Foundation       0x1861a282c -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 112 (NSException.m:157)
    4   UIKit            0x18f3a2814 __45-[UICollectionViewData validateLayoutInRect:]_block_invoke + 1500 (UICollectionViewData.m:447)
    5   UIKit            0x18f3a1c90 -[UICollectionViewData validateLayoutInRect:] + 1500 (UICollectionViewData.m:0)
    6   UIKit            0x18f3a10d0 -[UICollectionView layoutSubviews] + 260 (UICollectionView.m:3505)
    7   UIKit            0x18f343f50 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1256 (UIView.m:14894)
    8   QuartzCore       0x18994b670 -[CALayer layoutSublayers] + 184 (CALayer.mm:9200)
    9   QuartzCore       0x18994f748 CA::Layer::layout_if_needed(CA::Transaction*) + 332 (CALayer.mm:9080)
    10  UIKit            0x18f358dfc -[UIView(Hierarchy) layoutBelowIfNeeded] + 548 (UIView.m:10205)
    11  UIKit            0x18fd990b4 -[UICollectionView setContentInset:] + 92 (UICollectionView.m:4794)
    12  Signal           0x1032f1214 -[JSQMessagesViewController jsq_setCollectionViewInsetsTopValue:bottomValue:] + 88 (JSQMessagesViewController.m:1065)
    13  Signal           0x1032f1190 -[JSQMessagesViewController jsq_updateCollectionViewInsets] + 204 (JSQMessagesViewController.m:1058)
    14  Signal           0x1032e80ac -[JSQMessagesKeyboardController jsq_notifyKeyboardFrameNotificationForFrame:] + 120 (JSQMessagesKeyboardController.m:256)
    15  UIKit            0x18f37b6c4 +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] + 620 (UIView.m:12174)
    16  UIKit            0x18f391e6c +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:] + 108 (UIView.m:12233)
    17  Signal           0x1032e7f0c -[JSQMessagesKeyboardController jsq_handleKeyboardNotification:completion:] + 576 (JSQMessagesKeyboardController.m:233)
2017-08-10 10:59:22 -04:00
Michael Kirk
560e59f8e4 Merge branch 'mkirk/use-signal-localizations' into signal-master 2017-07-21 14:15:39 -04:00
Michael Kirk
ef3bf46e9f Use Signal localizations.
The JSQMessagesViewController translations are incomplete, and it's much
simpler for our translators to translate in one place.
2017-07-20 18:02:15 -04:00
Admir Ireiz
5d7a5f99f9 Croatian localization 2017-07-18 18:11:40 -04:00
Michael Kirk
521686c112 remove unnecessary keyboard unassignment
Backstory is that in Signal we want to toggle the default keyboard.

To do this we dismiss and then pop the keyboard.

However, the event listeners cause an unsightly bounce animation when
this happens, so we'd temporarily disable the event listeners.

But then there is this side effect of unassigned the keyboard view when
toggling off the event listeners. There seems to be no reason for it.
(famous last words).

The consequence of unassigning the keyboard view was that future
calculations about keyboard dismissal were wrong, preventing you from
being able to dismiss the keyboard after sending a message.
2017-06-20 13:35:48 -04:00
Michael Kirk
7054e4b13e Position edit menu over media items properly. 2017-04-11 11:25:52 -04:00
J4awesome
fe656ae0c1 Update apps_using_this_library.md (#1896) 2016-11-11 15:38:31 -08:00
Jesse Squires
929f1d80cd update changelog and spec for 7.3.4 2016-07-20 21:47:01 -07:00
Michael Kirk
23bf3f0b1e Fix issue #1583: Don't highlight cell outside message bubble (when long press) (#1744)
In summary, overriden "touchesBegan" gaining all touch control of the JSQMessagesCollectionViewCell touches
2016-07-20 21:41:33 -07:00
Jesse Squires
e4927be6a8 update changelog and version for 7.3.3 2016-06-09 21:21:19 -07:00
GianniCarlo
0622f6f4d7 Updated canPerformAction:withSender: in JSQMessagesComposerTextView to call super (#1664). Fixes #1663. 2016-06-09 21:13:18 -07:00
Jesse Squires
ef5c87f0b4 Update CHANGELOG and version nums for 7.3.2 2016-06-05 16:29:18 -07:00
Jesse Squires
ed54d6c50d Merge branch 'master' of https://github.com/jessesquires/JSQMessagesViewController into release_7.3 2016-06-05 16:28:04 -07:00
Jesse Squires
e630340c48 fix KVO crash. close #1631 2016-06-05 16:21:57 -07:00
Jesse Squires
fa6917e4a8 formatting 2016-06-05 16:19:57 -07:00
IceFloe
25769603b7 small fix regarding scrollToIndexPath (#1642) close #1640 2016-06-05 16:18:38 -07:00
Jesse Squires
026b1e31f3 Update CHANGELOG.md 2016-05-30 15:36:38 -07:00
Jesse Squires
a430cbed21 update CHANGLOG. bump version numbers 2016-05-30 12:06:44 -07:00
sebastianludwig
d099c56c96 Reverted #1588 to fix #1602 and fix #1604. (#1623) 2016-05-30 11:57:37 -07:00
Jesse Squires
8c6e4081ff bump version numbers 2016-05-23 14:58:22 -07:00
Jesse Squires
7fdc6393c0 Update CHANGELOG.md 2016-05-23 14:54:28 -07:00
Jesse Squires
ade4e7a95d provide default init values for JSQMessagesCollectionViewLayoutAttributes to prevent assertion. fix #1338 2016-05-23 14:44:02 -07:00
Jesse Squires
9c435347af follow up for #1247 and #1591. obfuscate private APIs. swizzle via +initialize 2016-05-23 14:36:56 -07:00
Jesse Squires
5cb6acf71e copy attributes 2016-05-22 23:11:25 -07:00
Jesse Squires
66a54186da clean up 2016-05-22 22:17:42 -07:00
Xinyu Zhao
b7f487cc92 fix keyboard hiding bug on iOS 9 (#1307). fix #1063 2016-05-22 22:14:18 -07:00
Jesse Squires
8c29756211 - cleanup from PR #1281
- fix menu actions, close #1321
- make notification methods public
- partially apply changes from PR #1563
2016-05-22 22:02:29 -07:00
keyeMyria
2a46bd19b1 fix custom action show in JSQMessagesComposerTextView (#1281)
* fix custom action show in JSQMessagesComposerTextView. fixes #1234
2016-05-22 21:50:09 -07:00
Jesse Squires
6f4d6cc90c check data, not error 2016-05-22 21:33:53 -07:00
Jesse Squires
547e216e82 cleanup 2016-05-22 21:32:11 -07:00
Jesse Squires
c4143c59a5 fix iOS 9 crash when long pressing links in UITextView. close #1247 (#1591) 2016-05-22 21:30:22 -07:00
Jesse Squires
359d576668 Update CHANGELOG.md
close #1386
2016-05-22 19:29:00 -07:00
Roman Stetsenko
3b4dc8f238 Fixed bottom offset with transparent Tab Bar (#1588) 2016-05-22 19:17:05 -07:00
eliburke
40ae3b28c3 Flip the left and right insets on the audio message bubble based on message direction (#1590) 2016-05-22 19:10:06 -07:00
Jesse Squires
b53eef5dd8 Update CONDUCT.md 2016-05-21 12:00:20 -07:00
GianniCarlo
d0fea3d377 Update apps using this library file with Criptext (#1584) 2016-05-18 10:03:17 -07:00
Dan Leonard
c0928db9e1 Updating documentation to point to new swift example. (#1578) 2016-05-15 15:51:53 -07:00
Michael Tom
942ec7a016 Update apps_using_this_library.md (#1576) 2016-05-14 09:36:33 -07:00
Dan Leonard
aecb14f9b7 Swift example working (#1572)
* Initial Commit of Swift Implantation of JSQMessagesViewController. Project only as per @jessesquires request of doing small pull requests.

* adding test

* Add Icon

* Adding viewControllers to let you actually see JSQ in action in swift.
2016-05-11 22:48:14 -07:00
Dan Leonard
943d8d90ec Initial Commit of Swift Implantation of JSQMessagesViewController. Project only as per @jessesquires request of doing small pull requests. (#1568) 2016-05-10 09:36:30 -07:00
Jesse Squires
f867ce223f Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2016-05-02 07:56:47 -07:00
Jesse Squires
a6209a38f2 organization 2016-05-02 07:56:37 -07:00
Håkon Bertheussen
64dbe7f08b Added Norwegian translation of JSQMessages.strings (#1564) 2016-05-02 07:50:37 -07:00
Jesse Squires
532eb513a0 formatting cleanup 2016-04-29 08:51:24 -07:00
Jesse Squires
e32c63283d Update README.md 2016-04-28 19:28:27 -07:00
Jesse Squires
b959f61f82 Rename codecov.yml to .codecov.yml 2016-04-28 19:27:50 -07:00
Jesse Squires
99ff104590 Update codecov.yml 2016-04-26 09:10:22 -07:00
Jesse Squires
aa12e5d19b Update codecov.yml 2016-04-25 19:37:43 -07:00
BillCarsonFr
38e80c2696 [Accessibility] Make message view more voiceover friendly (#886)
- Cell is now accessible and will speak sender name and message
- Accessory button has now an accessibility label
- Post announcement when message is received
- Added accessibility label to toolbar’s text view
2016-04-20 11:15:16 -04:00
eliburke
d35bd59bce Audio settings (#1552) 2016-04-15 13:47:32 -07:00
GianniCarlo
0fef325f6a Fix crash in demo app on simulating incoming audio message (#1542)
closes #1541
2016-04-12 21:59:23 -07:00
eliburke
a1779e4a33 Demo audio item (#1540)
* fixed typo in author's name

* updated demo's actionsheet to send an audio item
2016-04-12 13:55:06 -04:00
Jesse Squires
959e07cceb Update README.md 2016-04-10 10:57:53 -07:00
Jesse Squires
8c6b123457 docs. 2016-04-06 21:38:20 -07:00
sebastianludwig
8cba6e5d7f Added method to scroll to a specific row, optionally animated. 2016-04-06 15:18:22 -07:00
Jesse Squires
f06c939b47 update spec 2016-04-06 09:24:47 -07:00
Jesse Squires
6873264627 clean up JSQAudioMediaItem. formatting, docs, nullablity. 2016-04-06 09:24:03 -07:00
Jesse Squires
d2e4a06115 clean up JSQAudioMediaViewAttributes. docs, designated initializer, immutable. 2016-04-06 08:41:34 -07:00
Błażej Biesiada
747bf802f2 Add Indonesian localization. 2016-04-05 09:35:19 -07:00
Błażej Biesiada
caeb91576f Add Malaysian localization. 2016-04-05 09:34:18 -07:00
eliburke
f656a7b129 Merge pull request #1495 from eliburke/audioMedia
Added JSQAudioMediaItem class
2016-04-05 11:39:01 -04:00
Jesse Squires
5b27c16472 Update faq.md 2016-04-04 21:28:55 -07:00
Jesse Squires
34d37e3e59 attempt to fix travis. 2016-04-04 18:08:10 -07:00
Jesse Squires
5a5614c3b9 attempt to fix travis. 2016-04-04 17:46:57 -07:00
eliburke
3dabbbf1f2 fixed typo in author's name 2016-04-04 17:18:25 -07:00
Jesse Squires
c938362d7c Update README.md 2016-04-04 09:42:27 -07:00
Jesse Squires
932e61d0f1 Update contributor_onboarding.md 2016-04-04 09:40:30 -07:00
Jesse Squires
028860b5cd xcode 7.3 and pod update 2016-04-04 09:26:20 -07:00
Jesse Squires
17b848c152 Update ISSUE_TEMPLATE.md 2016-04-02 13:52:45 -07:00
Jesse Squires
39dc4e46de Update PULL_REQUEST_TEMPLATE.md 2016-04-02 13:51:06 -07:00
Jesse Squires
8b95f41c55 Update ISSUE_TEMPLATE.md 2016-03-23 09:07:41 -07:00
Jesse Squires
f72235a2bf Update ISSUE_TEMPLATE.md 2016-03-07 07:21:19 -08:00
Jesse Squires
bc7bef4c99 Update PULL_REQUEST_TEMPLATE.md 2016-03-07 07:19:35 -08:00
Jesse Squires
299dd01b54 Update ISSUE_TEMPLATE.md 2016-03-07 07:06:07 -08:00
Jesse Squires
b537f708d6 Update ISSUE_TEMPLATE.md 2016-03-06 20:16:10 -08:00
Jesse Squires
c1641d68bf Update ISSUE_TEMPLATE.md 2016-03-06 20:12:48 -08:00
Jesse Squires
444283922d Merge pull request #1485 from KennyWZhang/develop
fix a typo of JSQMessagesTimestampFormatterTests.m
2016-03-06 19:48:31 -08:00
Kenny.W.Zhang
637d4e1c40 1. fix a typo of JSQMessagesTimestampFormatterTests.m
2. remove one line unused code of JSQMessagesViewController.m
2016-03-07 10:03:19 +08:00
Jesse Squires
cd0c9f61ed Merge pull request #1477 from GuyKahlon/BugFix#1449
fix for preferredDefaultHeight. close #1449
2016-03-03 23:14:22 +09:00
Guy Kahlon
4b9a5ff5ad Bug #1449 - It doesn't seem like you can change the height of the inputToolbar using the documented property preferredDefaultHeight since it is used to configure the height constraint in viewDidLoad.
In order to fix the bug I added the line of code:

self.toolbarHeightConstraint.constant = self.inputToolbar.preferredDefaultHeight;

In the method:

viewWillAppear, and now the view load with the correct constraints.
2016-03-03 15:39:07 +02:00
Jesse Squires
d616d11809 clean up 2016-02-23 07:06:53 -08:00
Jesse Squires
e5979c1ca4 Merge pull request #1460 from mauruskuehne/issue_1142_designated_initializers
marked designated initializers (close issue #1142)
2016-02-23 07:05:45 -08:00
Jesse Squires
59d04621c3 Update contributor_onboarding.md 2016-02-23 06:59:10 -08:00
Maurus Kühne
6b54c75bc9 marked designated initializers where applicable (issue #1142) 2016-02-22 18:23:46 +01:00
Jesse Squires
72e91ffbd2 Merge pull request #1459 from mauruskuehne/onboarding_guide_typos
fixed typos in the onboarding guide
2016-02-22 09:04:34 -08:00
Maurus Kühne
93c4de3ec4 fixed typos in the onboarding guide 2016-02-22 17:52:55 +01:00
Jesse Squires
fe251ef91c Update README.md 2016-02-21 17:57:26 -08:00
Jesse Squires
d922149efe Update contributor_onboarding.md 2016-02-21 17:48:26 -08:00
Jesse Squires
7c248fdb4f Update contributor_onboarding.md 2016-02-21 17:46:45 -08:00
Jesse Squires
13824b2264 Update contributor_onboarding.md 2016-02-21 17:18:39 -08:00
Jesse Squires
d16852af96 Update contributor_onboarding.md 2016-02-21 17:05:33 -08:00
Jesse Squires
aaa6fefc41 Update contributor_onboarding.md 2016-02-21 17:03:44 -08:00
Jesse Squires
51beebb07f Update contributor_onboarding.md 2016-02-21 16:52:35 -08:00
Jesse Squires
a9d34e8da1 Update contributor_onboarding.md 2016-02-21 09:06:35 -08:00
Jesse Squires
3dd0bab1dc Update contributor_onboarding.md 2016-02-21 08:56:28 -08:00
Jesse Squires
31ba236883 Update contributor_onboarding.md 2016-02-21 08:38:44 -08:00
Jesse Squires
f3ad9887bf Update CONTRIBUTING.md 2016-02-20 14:28:03 -08:00
Jesse Squires
403745cbd3 Create CONDUCT.md 2016-02-20 14:25:38 -08:00
Jesse Squires
ad7c3b8f99 Update PULL_REQUEST_TEMPLATE.md 2016-02-20 10:15:44 -08:00
Jesse Squires
3464c63f69 Update CONTRIBUTING.md 2016-02-20 10:14:35 -08:00
Jesse Squires
0a4a628c76 Create PULL_REQUEST_TEMPLATE.md 2016-02-20 10:07:14 -08:00
Jesse Squires
2a60b406a6 Update ISSUE_TEMPLATE.md 2016-02-20 09:51:56 -08:00
Jesse Squires
b9999066a9 Update ISSUE_TEMPLATE.md 2016-02-20 09:51:00 -08:00
Jesse Squires
9c1efe10a9 Update ISSUE_TEMPLATE.md 2016-02-20 09:44:38 -08:00
Jesse Squires
7c4b4f4639 Create ISSUE_TEMPLATE.md 2016-02-20 09:34:04 -08:00
Jesse Squires
3d9bb6d6a4 Update README.md 2016-02-20 09:14:45 -08:00
Jesse Squires
685ef7019e Update README.md 2016-02-20 09:10:51 -08:00
Jesse Squires
0f6095fc5b Update README.md 2016-02-20 09:09:27 -08:00
Jesse Squires
a9721495d4 Update CONTRIBUTING.md 2016-02-20 09:08:02 -08:00
Jesse Squires
01edde38e7 Update contributor_onboarding.md 2016-02-19 08:28:43 -08:00
Jesse Squires
b461d5a3b3 Update contributor_onboarding.md 2016-02-19 08:27:11 -08:00
Jesse Squires
0c8b939406 Create contributor_onboarding.md 2016-02-19 08:16:44 -08:00
Jesse Squires
0c33d88198 Update getting_started.md 2016-02-19 07:58:06 -08:00
Jesse Squires
6621f6b584 break out getting started guide 2016-02-19 07:57:40 -08:00
Jesse Squires
a29cbb7c79 capitalize docs directory for consistency 2016-02-19 07:53:47 -08:00
Jesse Squires
f5f2e67e5b capitalize docs directory for consistency 2016-02-19 07:53:28 -08:00
Jesse Squires
03473dfe0a capitalize docs directory for consistency 2016-02-19 07:52:33 -08:00
Jesse Squires
2f33e3c9cd Update CONTRIBUTING.md 2016-02-19 07:50:10 -08:00
Jesse Squires
b49a69a487 Update CONTRIBUTING.md 2016-02-19 07:48:06 -08:00
Jesse Squires
ec601a6c62 Update README.md 2016-02-19 07:47:13 -08:00
Jesse Squires
be5dc2764c Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2016-02-19 07:44:29 -08:00
Jesse Squires
1f97141421 move contributing.md to new .github/ dir #1453 2016-02-19 07:44:02 -08:00
Jesse Squires
6dda0b041a Update README.md 2016-02-18 21:56:40 -08:00
Jesse Squires
239f5e6fe8 Update README.md 2016-02-14 20:50:19 -08:00
Jesse Squires
c296dac954 Merge branch 'develop' into release_8.0 2016-02-11 18:39:31 -08:00
Jesse Squires
69b5779f6b Merge pull request #1203 from sebastianludwig/flexible_is_outgoing
Customizable isOutgoing
2016-02-10 17:53:53 -08:00
Sebastian Ludwig
5d5551b913 Extracted logic to determine if a message is outgoing into method to be able to specialize it in subclasses. 2016-02-10 11:37:21 -06:00
Jesse Squires
90471f36a5 Merge pull request #1436 from mauruskuehne/issue_1433_cleanup_documentation
Clean up repo documentation (closes #1433)
2016-02-08 17:27:25 -08:00
Maurus Kühne
2c1210c892 closes #1433
- moved the documentation to a separate directory
- updated links in README.md
2016-02-08 17:41:04 +01:00
Jesse Squires
932b7da2d9 Merge branch 'develop' into release_8.0 2016-02-07 22:06:21 -08:00
Jesse Squires
776c94c264 Update README.md 2016-02-05 23:29:27 -08:00
Jesse Squires
7f7b850890 fix proj settings 2016-02-05 23:20:42 -08:00
Jesse Squires
e65c34ac78 Update README.md 2016-02-05 23:11:25 -08:00
Jesse Squires
b846d4b4a3 Create CHANGELOG.md
#1386
2016-02-05 23:08:12 -08:00
Jesse Squires
2891d192f4 Update README.md 2016-02-05 23:05:48 -08:00
Jesse Squires
04e0a43eb4 require super. close #1406 2016-02-05 22:57:43 -08:00
Jesse Squires
69e38bcbad pod update 2016-02-05 22:22:38 -08:00
Jesse Squires
11af29dcbb Merge pull request #1415 from 2-4601/finnish-him
Add Finnish localisation
2016-01-26 17:45:53 -08:00
2-4601
54fff888f2 Add Finnish localisation 2016-01-26 18:31:48 +02:00
Jesse Squires
70c3498c46 Merge pull request #1395 from wzs/develop
Fix typo in appledoc tag name
2016-01-15 08:53:54 -08:00
Paweł Wrzosek
911b115768 Fix typo in appledoc tag name
Prevents from "Unknown command tag name 'disscussion'; did you mean 'discussion'?" warning
2016-01-15 14:54:07 +01:00
Jesse Squires
d7e2748f3e Update README.md 2016-01-14 17:49:46 -08:00
Jesse Squires
7b6a6863bf Merge pull request #1391 from rashoodkhan/patch-1
Added Yellow Partner to the apps using list
2016-01-13 14:51:04 -08:00
Rashid Khan
ca70936656 Update apps_using_this_library.md 2016-01-13 16:58:30 -03:00
Jesse Squires
5b529462fb Update FAQ.md 2016-01-12 08:19:58 -08:00
Jesse Squires
9a9e28b35c Update FAQ.md 2016-01-12 08:07:06 -08:00
Jesse Squires
f693689ca6 Merge branch 'develop' into release_8.0 2016-01-11 22:15:32 -08:00
Jesse Squires
5bcd72ffce merge. fuck you xcode 2016-01-11 22:14:53 -08:00
Jesse Squires
a04482c1e8 wtf fuck you xcode 2016-01-11 22:14:28 -08:00
Jesse Squires
42aaff754b merge 2016-01-11 22:14:05 -08:00
Jesse Squires
2393ea6c16 wtf 2016-01-11 22:12:38 -08:00
Jesse Squires
6f90c0e93a remove OCMock and make everything not break. 2016-01-11 22:09:32 -08:00
Jesse Squires
807b5fe9ea clean up / modernize 2016-01-11 21:46:23 -08:00
Jesse Squires
4c52e50b51 Update FAQ.md 2016-01-09 18:47:29 -08:00
Jesse Squires
18703786e5 Update FAQ.md 2016-01-09 18:46:56 -08:00
Jesse Squires
c980b20292 Update FAQ.md 2016-01-09 18:44:05 -08:00
Jesse Squires
e935338e17 Update README.md 2016-01-09 18:37:40 -08:00
Jesse Squires
5d1ddb909a Create apps_using_this_library.md 2016-01-09 18:33:35 -08:00
Jesse Squires
0d19bb201d Update README.md 2016-01-09 18:26:16 -08:00
Jesse Squires
8e5f36593e Create MIGRATION.md 2016-01-09 18:21:16 -08:00
Jesse Squires
88f2a908c7 Create FAQ.md
close #1387
2016-01-09 18:12:04 -08:00
Jesse Squires
419a14210c Update README.md 2016-01-09 18:02:56 -08:00
Jesse Squires
75692259db Update README.md 2015-12-31 16:53:40 +01:00
Jesse Squires
59cd37a969 update travis. everything is horrible. 2015-12-06 18:36:15 -08:00
Jesse Squires
b99b2a3b38 update travis 2015-12-06 15:29:51 -08:00
Jesse Squires
506e82f9be update travis 2015-12-06 14:35:02 -08:00
Jesse Squires
2baed6f61d Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-12-06 14:13:18 -08:00
Jesse Squires
238ec1d13d Update README.md 2015-12-06 14:13:11 -08:00
Jesse Squires
a58d3e34d2 update travis 2015-12-06 14:11:03 -08:00
Jesse Squires
ea14a506e8 Update README.md 2015-12-06 14:03:33 -08:00
Jesse Squires
53f66cd8a4 Merge pull request #1300 from ReadmeCritic/develop
Update redirects in README
2015-12-06 14:00:50 -08:00
Jesse Squires
4a009760da update travis 2015-12-06 13:38:46 -08:00
Jesse Squires
820ad7c9b4 update travis 2015-12-06 13:21:39 -08:00
Jesse Squires
f50127ca4e Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-12-06 12:51:20 -08:00
Jesse Squires
7485f3d1d3 update travis 2015-12-06 12:51:15 -08:00
Jesse Squires
cc678456dc Update README.md 2015-12-06 12:46:52 -08:00
Jesse Squires
1803ffbd6c update travis 2015-12-06 12:41:04 -08:00
Jesse Squires
f29f2e284d update travis 2015-12-06 12:33:34 -08:00
Jesse Squires
8716568a4d update travis 2015-12-06 11:52:18 -08:00
Jesse Squires
f419972a89 fix action sheet in demo. close #1221 2015-12-06 11:21:27 -08:00
Jesse Squires
faf95defde Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-12-06 11:09:10 -08:00
Jesse Squires
ebc8e2f02c update travis 2015-12-06 11:08:16 -08:00
Jesse Squires
f82cb30939 Update .travis.yml 2015-11-26 09:41:51 -08:00
Jesse Squires
5a01def7fb update xibs 2015-11-12 21:09:18 -08:00
Jesse Squires
e0c53ac15b style cleanup 2015-11-12 20:32:43 -08:00
Jesse Squires
ef4f67d7d7 add vietnamese localization. close #1224 2015-11-12 20:30:28 -08:00
Jesse Squires
a00fa9dc52 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-11-12 20:25:04 -08:00
Jesse Squires
6ab06a44a8 Merge pull request #1238 from harlanhaskins/develop
Implemented adaptive UIViewController responses to invalidate message bubble cache on size change. Fix #1212.
2015-11-12 20:24:19 -08:00
Jesse Squires
027ed01416 update pods 2015-11-12 20:22:28 -08:00
Jesse Squires
88b0301449 update travis. close #1255. 2015-11-12 20:21:43 -08:00
Jesse Squires
155990c63b Update LICENSE 2015-11-06 22:27:40 -08:00
frankenbot
487e15a163 Update redirects 2015-11-04 19:24:14 -08:00
Jesse Squires
af61aa9335 Merge pull request #1292 from ThirakornP/patch-1
Add Thai Localization
2015-10-28 22:28:16 -07:00
Thriakorn
695f09f968 Add Thai Localization 2015-10-29 09:46:02 +07:00
Jesse Squires
0c5c2b6bfb Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-10-27 22:09:23 -07:00
Jesse Squires
123199aa6a pod update 2015-10-27 22:09:16 -07:00
Jesse Squires
3a49d81fdc Merge pull request #1258 from juliensaad/develop
[Localization] Update French version of Send button to match iOS version
2015-10-13 22:05:14 -07:00
juliensaad
36e5d25146 Update french version of Send button to match iOS version (envoi becomes envoyer) 2015-10-13 14:35:25 -04:00
Harlan Haskins
7917c423cc Implemented viewWillTransitionToSize:withTransitionCoordinator: and traitCollectionDidChange: for messages view controller to remove cached message bubble sizes on size class transition. This is necessary to support split-screen multitasking. 2015-10-02 15:32:10 -04:00
Jesse Squires
49135c660a Update README.md
update badges
2015-09-27 20:32:25 -07:00
Jesse Squires
553f5ecbb8 Update README.md 2015-09-19 13:38:10 -07:00
Jesse Squires
25a58853b2 Merge pull request #1208 from funkyV/develop
Update README.md
2015-09-18 21:43:25 -07:00
funkyV
9f64e6a25a Update README.md
added PimpMyCall to the apps that use JSQMessagesViewController.
2015-09-18 13:36:41 +03:00
Jesse Squires
8ba29137e8 png crush 2015-09-14 22:26:00 -07:00
Jesse Squires
ac25bd4f2f Merge pull request #1189 from walsh2000/fix_1174_again
Address #1174 & prevent inputToolbar-positioning regression
2015-09-14 22:20:11 -07:00
Jesse Squires
611ef2dab2 Merge pull request #1201 from harlanhaskins/develop
Updated screenshot with new location behavior
2015-09-14 21:57:34 -07:00
Harlan Haskins
1968ffcfa7 Updated screenshot with new location behavior. 2015-09-15 00:38:50 -04:00
Jesse Squires
f65b452b93 Update README.md 2015-09-13 21:24:34 -07:00
Jesse Squires
e72bfeed1f Update README.md 2015-09-13 21:10:03 -07:00
Jesse Squires
1e7ded798b update travis 2015-09-13 21:09:00 -07:00
Jesse Squires
12e3dc6442 Merge pull request #1199 from dmyers/patch-1
Removed old references to text and media messages
2015-09-13 10:48:57 -07:00
Derek Myers
a735dd3da5 Removed old references to text and media messages 2015-09-12 23:16:16 -05:00
Raymond Walsh
b95e606447 align code to repo code style
1. dot notation
2. rename ivar
2015-09-08 10:00:53 -07:00
Raymond Walsh
42d85c66d5 Address #1174 & prevent keyboard-positioning regression
Track the state of first-responder when the interactive pop gesture begins
Restore the first-responder state when pop gesture ends/cancels
2015-09-04 10:42:35 -07:00
Jesse Squires
e63f45308a oops. default to NO for fixed-width bubbles. 2015-09-03 21:34:56 -07:00
Jesse Squires
684aac33e7 version numbers 2015-09-03 21:15:23 -07:00
Jesse Squires
6648fe06f9 clean up and fixes from #1035 2015-09-03 21:12:11 -07:00
Jesse Squires
1d4be68944 Merge pull request #1035 from kohtenko/develop_toolbar_customization
Custom spacing for input toolbar items
2015-09-03 21:08:09 -07:00
Jesse Squires
0730fe5ebe comments and clean up from #1164 2015-09-03 21:02:44 -07:00
Jesse Squires
9ebbcb5d97 Merge pull request #1164 from walsh2000/textBubbleWidth_1112_dos
create a property to control Rotation-Independent bubble width. close #1112
2015-09-03 20:43:45 -07:00
Raymond Walsh
678d3348ed make the magix value configurable
resolves @jessesquires most recent comment/request
2015-09-03 09:28:13 -07:00
Jesse Squires
27ed04dae6 pod update 2015-09-02 23:40:18 -07:00
Jesse Squires
dad900b185 clean up / tweak demo changes from #1176 2015-09-02 23:27:01 -07:00
Jesse Squires
1d8ced57f4 Merge pull request #1176 from walsh2000/two_level_push
add a way to push our VC onto the 2nd level
2015-09-02 23:13:15 -07:00
Jesse Squires
e217043e06 fix Xcode's derpy warning because it's confused about the -initWithImage: selector. 2015-09-02 23:09:32 -07:00
Jesse Squires
875eab6a54 fix regression from #1175. must remove pop gesture in willDisappear. + clean up and formatting. 2015-09-02 23:08:19 -07:00
Jesse Squires
0317f7ff8c Merge pull request #1175 from walsh2000/fix_1174
Fix #1174
2015-09-02 23:00:49 -07:00
Jesse Squires
42d4d369e7 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-09-02 22:58:37 -07:00
Jesse Squires
07cccf00ee Update .travis.yml 2015-08-27 20:50:13 -07:00
Jesse Squires
031de6dd0a Update .travis.yml 2015-08-27 20:26:36 -07:00
Raymond Walsh
cd46b83b69 Merge remote-tracking branch 'upstream/develop' into fix_1174 2015-08-25 08:48:21 -07:00
Jesse Squires
9042e961b0 switch from xctool to xcodebuild. THANKS TRAVIS 2015-08-24 21:10:36 -07:00
Raymond Walsh
375439060b user accessor instead of direct ivar access 2015-08-24 20:15:30 -07:00
Raymond Walsh
f38934e03d add a way to push our VC onto the 2nd level
I found this was necessary for testing the fix for #1174 & #257, so I thought it might be a handy feature to have in the demo app
2015-08-24 14:33:41 -07:00
Raymond Walsh
052dfdcdd9 Fix for issue 1174
This avoids the problems mentioned in #1174 by removing our target on the Interactive Pop Gesture at viewDidDisappear-time
It avoid regressing to the problems documented in #257 by capturing the UIGestureRecognizer (as weak) at the time we addTarget. This allow us to remember on whom we should removeTarget.

I will have a separate commit to add a 2-level navigation-controller push to the Demo project, but that is not directly related to #1174 nor #257
2015-08-24 14:31:10 -07:00
Jesse Squires
165adaef06 attempt to improve #747 2015-08-17 20:18:19 -07:00
okohtenko
f5cdd957e9 small changes in comments and properties names 2015-08-17 11:48:39 +03:00
Jesse Squires
f8cbc84e0f fix #1161. use correct coordinates for pan gesture 2015-08-15 10:42:06 -07:00
Raymond Walsh
5291d8c5d1 variable naming preferences 2015-08-14 20:27:38 -07:00
Raymond Walsh
9fa0e40397 updated documentation for new selector signature 2015-08-14 19:58:13 -07:00
Raymond Walsh
3e14180439 refactored a selector name & missed a usage 2015-08-14 19:56:31 -07:00
Raymond Walsh
ba77b23076 stylistics & naming changes 2015-08-14 19:50:20 -07:00
Jesse Squires
5124c1247e Merge pull request #1162 from harlanhaskins/develop
Fixed pin image drawing in JSQLocationMediaItem.
2015-08-14 17:55:04 -07:00
Raymond Walsh
48dfb0ea03 create a property to control Rotation-Independent bubble width
The default behavior will be to use the old method (rotation-dependent bubble widths)
Relates to issue #1112
2015-08-14 14:10:51 -07:00
Harlan Haskins
f72c03cde3 Simplified offset logic. 2015-08-14 14:55:19 -04:00
Harlan Haskins
e0141a3d7c Fixed pin image drawing in JSQLocationMediaItem. 2015-08-14 10:24:01 -04:00
Jesse Squires
ddc20c96ee finish implementing delete: action for cells. close #970 2015-08-13 21:27:39 -07:00
Jesse Squires
a3652df8b6 Merge branch 'develop' into issue_970_deleteAction 2015-08-13 21:12:02 -07:00
Jesse Squires
d701cbff14 docs clean up 2015-08-13 21:10:22 -07:00
Jesse Squires
6405d7dad6 Merge pull request #1136 from bryx-inc/develop
Added ability to intercept -[UITextView paste:]
2015-08-13 21:05:14 -07:00
Harlan Haskins
12dd5b2744 Added 'of' 2015-08-13 09:27:04 -04:00
Harlan Haskins
5b0badf923 Made comments more consistent with the rest of the library. 2015-08-13 09:26:19 -04:00
Jesse Squires
cd17e0de51 fix #1081 2015-08-12 22:33:35 -07:00
Jesse Squires
6d7ceda2bd fix travis script 2015-08-12 22:16:57 -07:00
Jesse Squires
983fb5823d Implement new bubbleSizeCalculator. close #438 and #347. Changes will affect #1112 and #1113. 2015-08-12 21:36:17 -07:00
Jesse Squires
679ac60698 Merge pull request #1111 from snaggled/develop
Always set data from bubbleImageDataSource to avoid inconsistency.
2015-08-11 22:16:09 -07:00
Jesse Squires
49f5d7ec9d Arabic localization. close #1130 2015-08-11 22:09:43 -07:00
Jesse Squires
9752be93cf Merge pull request #1149 from harlanhaskins/develop
Added Korean localization from #237.
2015-08-09 20:02:21 -07:00
Harlan Haskins
9a89ba2d12 Added Korean localization from #237. 2015-08-09 19:09:08 -04:00
Jesse Squires
e6480b57ea formatting 2015-08-05 20:40:04 -07:00
Jesse Squires
b344f2dfa3 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-08-05 20:38:34 -07:00
Jesse Squires
933f0dfe6c Merge pull request #1141 from atlassian/develop
fix JSQMessage convenience inits to return self, not JSQMessage for subclassing
2015-08-05 20:38:26 -07:00
Jesse Squires
d5272c4283 unshare breakpoint 2015-08-05 20:37:24 -07:00
Marcus Kida
c07c12e26a fix JSQMessage convenience inits return JSQMessage instead of instancetype 2015-08-06 11:36:01 +10:00
Jesse Squires
ec2e0a9a39 Update README.md 2015-08-04 21:50:08 -07:00
Harlan Haskins
62385e451a Made changes as per @jessesquires's comments.
Updated the demo for the new naming.
2015-08-04 09:31:31 -04:00
Harlan Haskins
08ff2cb0cb Fixed infinite recursion with calling the -[JSQComposerTextView paste:] 2015-08-03 19:31:03 -04:00
Harlan Haskins
8dea72a056 Added comments to demo implementation. 2015-08-03 16:39:29 -04:00
Harlan Haskins
c5c7050d60 Added JSQComposerTextViewDelegate with an optional delegate method for intercepting pastes.
Added demo to demo app of pasting an image from the UIPasteboard.
2015-08-03 16:36:57 -04:00
Jesse Squires
3fad9a9548 Update CONTRIBUTING.md 2015-08-03 07:11:57 -07:00
Jesse Squires
da6136da26 Update README.md 2015-07-26 12:06:41 -07:00
Philip McMahon
3c964a4d83 A more succinct solution 2015-07-24 10:21:12 -06:00
Jesse Squires
586c9597c0 fix travis. grrr 2015-07-23 22:07:57 -07:00
Jesse Squires
c28d4bfd26 use travis-ci xcode6.4 2015-07-23 21:58:42 -07:00
Jesse Squires
a7335bc2c1 increase timeout for async test. because travis-ci is derpy. everything is broke and terrible. programming sucks. goddamit. 2015-07-23 21:55:03 -07:00
Jesse Squires
cbeb533a54 fix failing tests 2015-07-23 21:04:29 -07:00
Philip McMahon
c4749a7991 Having some messages with bubbles and some without results in all messages having bubbles 2015-07-23 14:55:29 -06:00
Jesse Squires
7b2b238153 pod update. fix xcode7 warnings. update tests. 2015-07-22 22:55:23 -07:00
Jesse Squires
676dc75c14 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-07-22 22:33:02 -07:00
Jesse Squires
1140cac96f Update CONTRIBUTING.md 2015-07-22 21:54:43 -07:00
Jesse Squires
91e74b0f7b Merge pull request #1053 from dvor/patch-1
Fixing typo in documentation
2015-06-25 07:18:34 -07:00
Dmytro Vorobiov
3898476714 Fixing typo in documentation 2015-06-25 16:05:36 +02:00
Jesse Squires
16ed8c1f88 Update README.md 2015-06-23 18:55:32 -07:00
Jesse Squires
efa3c2b365 pod update 2015-06-16 21:27:19 -07:00
okohtenko
8cd4b0be87 custom spacing for input toolbar 2015-06-16 14:34:12 +03:00
Jesse Squires
122983ddbb Merge pull request #1027 from sebastianludwig/custom_action_fix
Fix #1026
2015-06-10 23:41:58 -07:00
Sebastian Ludwig
2870560006 Fixed #1026 by avoiding overreleasing the sender (the tapped message view cell) of a custom context menu action. 2015-06-10 20:43:56 +02:00
Jesse Squires
a2f8b39891 Merge pull request #1025 from rafaelatr3/develop
Adding missing 's' on the portuguese version of JSQMessages.strings
2015-06-09 18:07:54 -07:00
Rafael Rocha
b656f8adf9 Adding missing 's' on the portuguese version of JSQMessages.strings 2015-06-09 18:07:05 -03:00
Jesse Squires
867115b03c update spec 2015-05-31 11:24:29 -07:00
Jesse Squires
c2651dd0a4 pod update 2015-05-31 11:20:33 -07:00
Jesse Squires
ec8dcf66d5 Update LICENSE 2015-05-31 11:18:33 -07:00
Jesse Squires
acbb692b3d Update README.md 2015-05-31 11:18:17 -07:00
Jesse Squires
7606339770 pod update 2015-05-26 19:45:13 -07:00
Jesse Squires
9551159a20 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-05-26 19:39:24 -07:00
Jesse Squires
c8831f0b30 update ignore. include Pods/ 2015-05-26 19:39:11 -07:00
Jesse Squires
566ddb3301 Merge pull request #996 from sumihiro/localization_ja
Add Japanese Localization
2015-05-21 22:13:33 -07:00
sumihiro
ea373b0130 Add Japanese Localization 2015-05-22 09:52:58 +09:00
Jesse Squires
9859d3ab52 issue #970 WIP 2015-05-12 19:07:35 -07:00
Jesse Squires
8e8f0998be clean up and refinements for PR #950 and #756. issue #323. move maximumInputToolbarHeight to toolbar class. 2015-05-12 18:32:05 -07:00
Jesse Squires
27ec773edc Merge pull request #950 from werediver/develop-lbanders-extra
bug fix follow-up on issue #323
2015-05-12 18:05:24 -07:00
Jesse Squires
34f046c452 Merge pull request #756 from lbanders/develop
Add a maxToolbarHeight property to. fix #323
2015-05-12 18:00:58 -07:00
Jesse Squires
7e7edbf675 pod update 2015-05-11 18:06:19 -07:00
Jesse Squires
98368fc105 Merge pull request #973 from RQEBMM/issue_971_makeKeyboardControllerPublic
made keyboardController a public property. close #971
2015-05-07 11:43:56 -07:00
Benjamin McCloskey
08567a4be6 made keyboardController a public property 2015-05-07 12:52:07 -05:00
Jesse Squires
78c46c0ac4 Merge pull request #972 from vani2/bazar_app_link
Add link to Bazar app
2015-05-07 09:47:38 -07:00
Ivan Vavilov
2f94744368 Add link to Bazar app 2015-05-07 10:26:00 +03:00
Jesse Squires
ad761def43 more refinements from PR #811 2015-05-06 10:19:37 -07:00
Jesse Squires
c5c9c20246 clean up and refinements from PR #811 2015-05-06 10:05:09 -07:00
Jesse Squires
c4d38a8407 Merge pull request #811 from sebastianludwig/develop
Implemented #810: An easier way to handle custom menu actions. close #810
2015-05-06 09:27:10 -07:00
Jesse Squires
9db018bfce clear cached media views. close #754 2015-05-06 09:18:26 -07:00
Jesse Squires
0db2ab9e74 pod update 2015-05-05 16:48:32 -07:00
Jesse Squires
6a5aeb5ffb Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-05-05 14:46:03 -07:00
Jesse Squires
74acd93417 bump version nums 2015-05-05 14:45:54 -07:00
Jesse Squires
3247b45b13 Update README.md 2015-05-04 21:38:04 -07:00
Jesse Squires
bccad24efc Merge pull request #951 from tobiasoleary/remove_context_state_save_restore
Remove unneeded CGContext Save and Restore calls.
2015-05-04 16:17:48 -07:00
Tobias O'Leary
5e9e368f4d Remove unneeded CGContext Save and Restore calls.
In the private class methods of JSQMessagesAvatarImageFactory
(jsq_imageWitInitials, jsq_circularImage) there were calls to save and restore
the state of the graphic context.

The calls are not needed because UIGraphicsBeginImageContext creates a new
context in a default state.
2015-04-25 13:19:30 -04:00
Roman Fedoseyev
bff4ae7b86 #323 / #726 Possible crash caused by AutoLayout engine fault on iOS 7.x fixed.
The problem itself can be observed when the pull request #726 is applyed on top of v7.0.1+.
2015-04-25 16:13:17 +03:00
Jesse Squires
4c05c28f70 Update README.md 2015-04-24 08:59:35 -07:00
Jesse Squires
6b58a211c5 Merge pull request #938 from bearclough/issue_937_fix
Fix Issue #937: Updated implementation of UICollectionViewDelegate
2015-04-20 21:59:52 -07:00
bearclough
cb901cb026 Updated JSQMessagesViewController's implementation of UICollectionViewDelegate perform action for item to use the collectionView's dataSource instead of JSQMessagesViewController's 2015-04-20 21:10:18 -07:00
Jesse Squires
cd974aa015 suppress warning for now. fix in next release, see #920 2015-04-19 11:38:37 -07:00
Jesse Squires
a6a2884b07 bump version nums 2015-04-19 11:20:00 -07:00
Jesse Squires
a859a6862a fix toolbar button constraint issues. close #460 2015-04-19 11:03:47 -07:00
Jesse Squires
72e7343908 Merge pull request #888 from danhbear/issue_887_fix_springy_insert_sizezero
Don't return spring behavior for attributes with empty size. close #887
2015-04-19 10:46:39 -07:00
Jesse Squires
45590c3405 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-04-19 10:39:15 -07:00
Jesse Squires
cd085c683f Merge pull request #880 from erysaj/fix-toolbar-dragging
Fix toolbar dragging. close #666
2015-04-19 10:39:10 -07:00
Jesse Squires
853a3fe1c5 pod update 2015-04-19 10:30:22 -07:00
Daniel Bear
7610526965 PR style feedback
https://github.com/jessesquires/JSQMessagesViewController/pull/888/files#r28034689
2015-04-10 08:17:06 -07:00
Jesse Squires
ab831aaf67 fix demo contraints 2015-04-08 21:21:09 -07:00
Jesse Squires
5c57cee47f Merge pull request #889 from erysaj/fix-segfault-crashes
Fix segfault crashes
2015-04-08 21:14:56 -07:00
Jesse Squires
dcebef9d1e Merge pull request #915 from luosheng/develop
Revert @import for #import.
2015-04-08 21:08:22 -07:00
Luo Sheng
547cec7287 Revert @import for #import. 2015-04-09 11:51:31 +08:00
Eugene Rysaj
72540e2553 Nullify delegates to prevent crashes 2015-03-30 14:04:02 +03:00
Daniel Bear
1c5811107c Don't return spring behavior for attributes with empty size.
The demo project currently displays a new outgoing message using JSQMessagesViewController -finishSendingMessageAnimated:, which calls UICollectionView -reloadData. This works fine. However when new items are instead added using UICollectionView -insertItemsAtIndexPaths:, a failure occurs in the flow layout when trying to add the spring behavior to the UIDynamicAnimator in -prepareForCollectionViewUpdates:. This change protects against that failure, which is caused by an invalid zero size in the layout attributes. Adding a nil behavior instead behaves correctly.
2015-03-27 15:15:12 -07:00
Jesse Squires
ea42262a9a Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-03-26 21:41:51 -07:00
Jesse Squires
483f36402a pod update 2015-03-26 21:41:45 -07:00
Eugene Rysaj
7edc1312d1 fix detecting pre-iOS8 devices (did not work on iOS 8.0) 2015-03-24 15:15:08 +02:00
Eugene Rysaj
6086d26bc8 fix toolbar going out of sight when slowly dragging down and back in landscape orientation (iOS 7.x) 2015-03-24 15:00:19 +02:00
Leif Bredgaard Honore
e75c2fb166 Merge errors fixed 2015-03-22 10:55:13 +04:00
Leif Bredgaard Honore
0ed53ae8c5 Merge remote-tracking branch 'jessesquires/develop' into develop
Conflicts:
	JSQMessagesViewController/Controllers/JSQMessagesViewController.m
2015-03-22 08:12:56 +04:00
Jesse Squires
fb7119d3b2 Update README.md 2015-03-21 11:36:06 -07:00
Jesse Squires
71a7f519fc Update README.md 2015-03-21 11:34:13 -07:00
Jesse Squires
62c6844ce6 Update README.md 2015-03-20 21:53:38 -07:00
Leif Bredgaard Honore
dd0e214d13 #323 updated according to comments by @jessesquires - Also tests is now included 2015-03-19 10:39:31 +04:00
Jesse Squires
25a887a31e Merge pull request #867 from jeffreyjackson/patch-1
Update README.md
2015-03-17 14:40:47 -07:00
Jeffrey Jackson
bd82c11af6 Update README.md 2015-03-17 16:21:42 -04:00
Jesse Squires
3e69f1fc1d clean up from PR #841 2015-03-16 20:06:53 -07:00
Jesse Squires
acb047f25d Merge pull request #841 from jardamach/develop
Keyboard scrolling problem & fix of toolbar position while panning. fix #666. fix #405.
2015-03-16 20:06:01 -07:00
Jesse Squires
fc581c8b0b update and refine spec and resource loading. 2015-03-16 19:29:53 -07:00
Jesse Squires
007a945959 improve scrolling performance on iOS 8. #492 2015-03-16 18:37:23 -07:00
Jesse Squires
56f8a9c648 update spec. bump version numbers. 2015-03-16 18:27:48 -07:00
Jesse Squires
0f5cd6c2fd move strings to bundle. add bundle helper methods. #784 2015-03-16 18:19:29 -07:00
Jesse Squires
86746bd9d6 refine strings and keys 2015-03-16 17:13:31 -07:00
Jesse Squires
94b19ccb08 fix broken tests. derp. 2015-03-16 16:11:38 -07:00
Jesse Squires
88d2fe4ef4 update travis script 2015-03-16 15:34:17 -07:00
Jesse Squires
97bfef24c9 remove UIScrollViewKeyboardDismissModeInteractive. ref #666 2015-03-16 15:16:16 -07:00
Jesse Squires
f09dc0230e another fix for #684 2015-03-16 15:10:17 -07:00
Jesse Squires
a30f9bdee9 rename hash protocol method names in JSQMessageData and JSQMessageMediaData. fixes swift compatibility and core data issues. close #684 2015-03-16 15:07:56 -07:00
Jesse Squires
e23a248797 Fix #818 2015-03-16 14:56:58 -07:00
Jesse Squires
05c97700a2 don't upperCase string for avatarImageWithUserInitials. leave this up to the caller. close #755 2015-03-16 14:43:58 -07:00
Jesse Squires
1f64013617 Rename 'emptyCache' property on invalidationContext. close #661 2015-03-16 14:34:20 -07:00
Jesse Squires
a6437be1ab fix warnings from Xcode 6.3 beta 2015-03-16 14:26:50 -07:00
Jesse Squires
e0ae6cdb1f Update README.md 2015-03-06 18:05:46 -08:00
jardamach
d9aea32ed0 Keyboard scrolling problem & fix of toolbar position while panning #666 2015-03-06 13:59:04 +01:00
Jesse Squires
09db017b87 Update README.md 2015-03-02 12:02:59 -08:00
Jesse Squires
a180dcbee6 Update README.md 2015-02-26 21:45:47 -08:00
Jesse Squires
2698a699d8 Update README.md 2015-02-26 21:41:29 -08:00
Jesse Squires
0aa0ae2237 fix #791 2015-02-26 19:27:54 -08:00
Jesse Squires
1fb791f964 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-02-26 19:14:08 -08:00
Jesse Squires
0b8fb267d1 Fix #613 2015-02-26 19:13:53 -08:00
Sebastian Ludwig
b728ff3b4a Implemented #810: An easier way to handle custom menu actions. 2015-02-21 15:17:41 +07:00
Jesse Squires
fa7e42bfa5 Update README.md 2015-02-20 10:44:12 -08:00
Jesse Squires
82534ea75d update tests 2015-02-08 02:42:35 -08:00
Jesse Squires
08cc2d14d4 remove default values from senderDisplayName and senderId. add parameterAsserts instead. #774 2015-02-08 02:41:21 -08:00
Jesse Squires
720999efe9 oops. fix JSQMessagesCollectionViewCell. #773 2015-02-07 11:40:55 -08:00
Jesse Squires
0157f1a47e more fixes for cocoapods framework support. close #773 2015-02-07 11:36:49 -08:00
Jesse Squires
fc340cd166 fix spelling error. close #748 2015-02-05 22:42:27 -08:00
Jesse Squires
399544ff5d use CG geometry functions because goddammit. 2015-02-05 22:26:10 -08:00
Jesse Squires
245551f8ce revert changes from #702. causes other side effects. re-open #450. fuck keyboards. fuck this shitty keyboard API. and fuck iOS 8.1.3 goddammit. more beer please. 2015-02-05 22:25:37 -08:00
Jesse Squires
27d7a2e09c revert changes from PR #646, fix #706. PR #646 was possibly solved by #739. ref: #763 2015-02-05 21:57:48 -08:00
Jesse Squires
9e6e0f2524 refactor changes from #739 2015-02-05 21:48:32 -08:00
Jesse Squires
9893d4208f Merge pull request #739 from doggy/issue_#738_Fix
reset keyboard view status for pan gesture. close #738
2015-02-05 21:44:08 -08:00
Jesse Squires
3e80be42db refactor and clean up from PR #751 2015-02-05 21:19:15 -08:00
Jesse Squires
e354981b49 Merge pull request #751 from walsh2000/develop
Making JSQMessagesInputToolbar easier to subclass. Close #750
2015-02-05 21:04:52 -08:00
Jesse Squires
08377bc153 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-02-05 20:53:14 -08:00
Jesse Squires
1acb68119e close #702, fix #701, fix #450 2015-02-05 20:53:02 -08:00
Jesse Squires
f31b214c1b set header load button font 2015-02-05 20:41:58 -08:00
Jesse Squires
ddf11e62e4 Update README.md
add link to cocoapods. close #770
2015-02-05 09:23:40 -08:00
Leif Bredgaard Honore
fa668ef7da #323 fixed by adding a maxToolbarHeight property to JSQMessageViewController 2015-01-22 11:35:29 +04:00
Raymond Walsh
e3a2babfb2 move added code lower in the file
instead of adding it above awakeFromNib, place new functions near the bottom
2015-01-20 15:23:36 -08:00
Raymond Walsh
ed81bb2977 Modify JSQMessagesInputToolbar to make it easier to subclass
1. Toolbar instantiates the contentView through a method (which subclasses can override)
    2. JSQMessagesViewController gets default height from an accessor in JSQMessagesInputToolbar, instead of using a constant directly
2015-01-20 15:17:48 -08:00
doggy
6e7647d14a reset keyboard view status while the finger slide down to the outside of screen 2015-01-16 13:51:39 +08:00
Jesse Squires
99977d4938 bump version numbers 2015-01-10 16:02:10 -08:00
Jesse Squires
df26f3cc16 oops. fix use of iOS 8-only API. 2015-01-10 16:01:25 -08:00
Jesse Squires
1b9814ee5c bump version numbers 2015-01-10 15:33:22 -08:00
Jesse Squires
eec8ff4236 remove references to main bundle for cocoapods 0.36. close #698. 2015-01-10 15:22:22 -08:00
Jesse Squires
3779613da8 fix layout issues. close #722 2015-01-10 14:49:47 -08:00
Jesse Squires
f55bdad953 fix image copy, photo rotation issue. close #723 2015-01-10 14:41:49 -08:00
Jesse Squires
741f53f793 set cell default background color to clearColor. close #727 2015-01-10 14:39:28 -08:00
Jesse Squires
9bbdffa568 Merge branch 'develop' of https://github.com/jessesquires/JSQMessagesViewController into develop 2015-01-10 14:37:16 -08:00
Jesse Squires
db40c8b588 fix typing indicator rotation bug. close #712 2015-01-10 14:37:11 -08:00
Jesse Squires
dbad9a9325 update pods 2015-01-10 14:27:58 -08:00
Jesse Squires
5d21d699f6 Merge pull request #721 from ranunez/develop
Updated iOS version adoption statistics in README
2015-01-07 11:00:03 -08:00
Ricardo Nunez
b5ca3df47e Updated iOS version adoption statistics in README 2015-01-07 08:02:34 -08:00
Jesse Squires
191d2c3700 clean up 2014-12-24 14:35:10 -05:00
Jesse Squires
bbbb242521 Merge pull request #692 from asxasxasx/master
Limit input toolbar according to top inset
2014-12-24 14:29:40 -05:00
asxasxasx
174cae9b6c Limit input toolbar according to top inset
Limit input toolbar according to topContentAdditionalInset value. Fixed issue when textView expands under top view above collection view
2014-12-24 21:32:12 +06:00
Jesse Squires
7d6534eeae fix tests for travis-ci 2014-12-19 18:44:31 -05:00
246 changed files with 1089 additions and 15177 deletions

34
.codecov.yml Normal file
View File

@ -0,0 +1,34 @@
codecov:
branch: develop
coverage:
precision: 2
round: nearest
range: "60...100"
ignore:
- JSQMessagesDemo/*
- Pods/*
- JSQMessagesTests/*
status:
project:
default:
target: auto
threshold: 2.0
branches:
- master
- develop
patch:
default:
target: auto
branches:
- master
- develop
comment:
layout: "header, diff, changes, sunburst, uncovered"
branches:
- master
- develop
behavior: default

74
.github/CONDUCT.md vendored Normal file
View File

@ -0,0 +1,74 @@
# JSQMessagesViewController Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, gender identity and expression, level of experience,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at **jesse.squires.developer [at] gmail [dot] com**. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

51
.github/CONTRIBUTING.md vendored Normal file
View File

@ -0,0 +1,51 @@
# Contributing to JSQMessagesViewController
## Code of Conduct
Please read our [Code of Conduct](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONDUCT.md). Intolerance, disrespect, and any of form of negativity will not be tolerated.
## Opening a new issue
1. Read *all* of the [`README`](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md) :speak_no_evil:
* Search [open issues](https://github.com/jessesquires/JSQMessagesViewController/issues) *and* [closed issues](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+is%3Aclosed) to **avoid opening a duplicate issue!** :see_no_evil:
* If your issue exists, please comment on its thread with your new information :hear_no_evil:
* Otherwise, open a new issue with a good title and description :memo:
* Provide **all** of the following information:
- Library version(s) :octocat:
- iOS version(s) :iphone:
- Devices/Simulators affected :iphone:
- Expected behavior vs actual behavior
- Complete steps to reproduce the issue :warning:
- Link to a project that exhibits the issue, if possible fork the repo and modify the provided demo project :construction:
- Screenshots/GIFs/Videos showing the issue, if applicable :camera:
- Full crash log, if applicable :boom:
- Search for and list any issues that might be related :mag_right:
## Submitting a pull request
1. Link to the issue that the pull request resolves. If there isn't one, create one.
2. Write unit tests that test your changes, if applicable.
3. Update header docs, if needed.
4. Follow existing coding style, and these [style guidelines](https://github.com/jessesquires/HowToContribute#style-guidelines).
5. Resolve any merge conflicts.
6. Squash your commits into a single commit.
## Questions and help
See the [Questions & Help](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md#questions--help), and [Documentation](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md#documentation) sections in the `README`.
## General guidelines
Please also read through these more general [contribution guidelines](https://github.com/jessesquires/HowToContribute).
## Did you read all of this?
You even followed the links? Congratulations! You deserve a high-five. :tada:
![img](http://media.giphy.com/media/LdnaND03GRE9q/giphy.gif)
### New issue checklist
Now show me how awesome you are! :smile: When opening your new issue and filling out the checklist, you'll be asked for confirmation. Confirm that you've read this with these emoji: :muscle::sunglasses::facepunch:
> - [x] I have reviewed the contributing guidelines. Confirmation: :muscle::sunglasses::facepunch:

36
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,36 @@
## New issue checklist
<!-- Before submitting this issue, make sure you have done the following -->
- [ ] I have read all of the [`README`](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/README.md), [documentation](http://cocoadocs.org/docsets/JSQMessagesViewController/), and [FAQ](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/Documentation/faq.md).
- [ ] I have reviewed the [contributing guidelines](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONTRIBUTING.md). Confirmation: ____
- [ ] I have searched [existing issues](https://github.com/jessesquires/JSQMessagesViewController/issues?q=is%3Aissue+sort%3Acreated-desc) and **this is not a duplicate**.
### General information
- Library version(s):
- iOS version(s):
- Devices/Simulators affected:
- Reproducible in the demo project? (Yes/No):
- Related issues:
## Bug report
#### Expected behavior
> ...
#### Actual behavior
> ...
#### Steps to reproduce
> ...
#### Crash log? Screenshots? Videos? Sample project?
>...
## Question or Feature Request
> ...

11
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@ -0,0 +1,11 @@
## Pull request checklist
- [ ] All tests pass. Demo project builds and runs.
- [ ] I have resolved any merge conflicts.
- [ ] I have followed the [coding style](https://github.com/jessesquires/HowToContribute#style-guidelines), and reviewed the [contributing guidelines](https://github.com/jessesquires/JSQMessagesViewController/blob/develop/.github/CONTRIBUTING.md). Confirmation: ____
#### This fixes issue #___.
## What's in this pull request?
>...

9
.gitignore vendored
View File

@ -1,6 +1,6 @@
# Xcode
.DS_Store
# Xcode
/build/*
*/build/*
*.pbxuser
@ -18,8 +18,3 @@ DerivedData
.idea/
*.hmap
*.xccheckout
#CocoaPods
Pods

View File

@ -1,10 +1,44 @@
language: objective-c
osx_image: xcode7.3
before_install:
- export LANG=en_US.UTF-8
- gem install cocoapods
- brew update
- if brew outdated | grep -qx xctool; then brew upgrade xctool; fi
env:
global:
- LANG=en_US.UTF-8
- WORKSPACE="JSQMessages.xcworkspace"
- IOS_SCHEME="JSQMessages"
- IOS_SDK=iphonesimulator9.3
script:
- xctool clean build test -workspace JSQMessages.xcworkspace -scheme JSQMessages -sdk iphonesimulator7.1 ONLY_ACTIVE_ARCH=NO
matrix:
- DESTINATION="OS=8.1,name=iPhone 5" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="YES" BUILD_EXAMPLE="NO" POD_LINT="NO" COVERAGE="NO"
- DESTINATION="OS=9.0,name=iPhone 6 Plus" SDK="$IOS_SDK" SCHEME="$IOS_SCHEME" RUN_TESTS="NO" BUILD_EXAMPLE="NO" POD_LINT="YES" COVERAGE="YES"
before_install:
- gem install xcpretty --no-rdoc --no-ri --no-document --quiet
# skip pod install on travis-ci
# since we check-in the pods folder, etc. this isn't needed
install: true
script:
- if [ $POD_LINT == "YES" ]; then
pod spec lint;
pod lib lint;
fi
- if [ $RUN_TESTS == "YES" ]; then
xcodebuild clean build test -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO | xcpretty -c;
else
xcodebuild clean build -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO | xcpretty -c;
fi
# Build for reporting test coverage
- if [ $COVERAGE == "YES" ]; then
xcodebuild clean build test -workspace "$WORKSPACE" -scheme "$SCHEME" -sdk "$SDK" -destination "$DESTINATION" -configuration Debug ONLY_ACTIVE_ARCH=NO GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES GCC_GENERATE_TEST_COVERAGE_FILES=YES;
fi
after_success:
- if [ $COVERAGE == "YES" ]; then
bash <(curl -s https://codecov.io/bash);
fi

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

125
CHANGELOG.md Normal file
View File

@ -0,0 +1,125 @@
# CHANGELOG
The changelog for `JSQMessagesViewController`. Also see the [releases](https://github.com/jessesquires/JSQMessagesViewController/releases) on GitHub.
--------------------------------------
7.3.4
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.4+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.4)
7.3.3
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.3+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.3)
7.3.2
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.2+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.2)
7.3.1
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.1+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.1)
7.3.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.3.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.3.0)
7.2.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.2.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.2.0)
7.1.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.1.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.1.0)
7.0.2
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.0.2+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.2)
7.0.1
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.0.1+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.1)
7.0.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A7.0.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/7.0.0)
6.1.3
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.1.3)
6.1.2
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A6.1.2+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.1.2)
6.1.1
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A6.1.1+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.1.1)
6.0.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A6.0.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/6.0.0)
5.3.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.3.0)
5.2.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.2.0)
5.1.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.1.0)
5.0.3
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.0.3)
5.0.0
-----
- [Milestone](https://github.com/jessesquires/JSQMessagesViewController/issues?q=milestone%3A5.0.0+is%3Aclosed)
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/5.0.0)
4.0.0
-----
- [GitHub release notes](https://github.com/jessesquires/JSQMessagesViewController/releases/tag/4.0.0)
All previous versions
---------------------
Unfortunately, release notes are not available for earlier versions of the library.

View File

@ -1,3 +0,0 @@
## How To Contribute
Please follow these sweet [contribution guidelines](https://github.com/jessesquires/HowToContribute).

View File

@ -7,11 +7,9 @@
objects = {
/* Begin PBXBuildFile section */
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 */; };
54271E3B1C90469100294290 /* jsq_messages_sample.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 54271E3A1C90469100294290 /* jsq_messages_sample.m4a */; };
54271E401C905D1600294290 /* JSQAudioMediaItemTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */; };
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 */; };
@ -21,53 +19,22 @@
88445B3B19E0C0B10014F889 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3A19E0C0B10014F889 /* XCTest.framework */; };
88445B3C19E0C0B80014F889 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3419E0AE4A0014F889 /* CoreGraphics.framework */; };
88445B3D19E0C0BE0014F889 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B3619E0AE5C0014F889 /* QuartzCore.framework */; };
88445B4019E1B4470014F889 /* JSQLocationMediaItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */; };
88445B4219E1B50B0014F889 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 88445B4119E1B50B0014F889 /* CoreLocation.framework */; };
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 */; };
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 */; };
8873B60E1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.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 */; };
88A25F3719D8DF2500924534 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F2D19D8DF2500924534 /* AppDelegate.m */; };
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 */; };
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 */; };
88A25FB819D8E01A00924534 /* UIImage+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5C19D8E01A00924534 /* UIImage+JSQMessages.m */; };
88A25FB919D8E01A00924534 /* UIView+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F5E19D8E01A00924534 /* UIView+JSQMessages.m */; };
88A25FBA19D8E01A00924534 /* JSQMessagesKeyboardController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6119D8E01A00924534 /* JSQMessagesKeyboardController.m */; };
88A25FBB19D8E01A00924534 /* JSQMessagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6319D8E01A00924534 /* JSQMessagesViewController.m */; };
88A25FBC19D8E01A00924534 /* JSQMessagesViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F6419D8E01A00924534 /* JSQMessagesViewController.xib */; };
88A25FBD19D8E01A00924534 /* JSQMessagesAvatarImageFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */; };
88A25FBE19D8E01A00924534 /* JSQMessagesBubbleImageFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */; };
88A25FBF19D8E01A00924534 /* JSQMessagesTimestampFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */; };
88A25FC019D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F6D19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m */; };
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 */; };
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 */; };
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 */; };
88A25FCE19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */; };
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 */; };
88A25FD319D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9B19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m */; };
88A25FD419D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9C19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib */; };
88A25FD519D8E01A00924534 /* JSQMessagesToolbarContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25F9E19D8E01A00924534 /* JSQMessagesToolbarContentView.m */; };
88A25FD619D8E01A00924534 /* JSQMessagesToolbarContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25F9F19D8E01A00924534 /* JSQMessagesToolbarContentView.xib */; };
88A25FD719D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FA119D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m */; };
88A25FD819D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88A25FA219D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib */; };
88A25FDF19D8E0C400924534 /* DemoMessagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FDA19D8E0C400924534 /* DemoMessagesViewController.m */; };
88A25FE019D8E0C400924534 /* DemoModelData.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FDC19D8E0C400924534 /* DemoModelData.m */; };
88A25FE119D8E0C400924534 /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88A25FDE19D8E0C400924534 /* TableViewController.m */; };
@ -96,30 +63,12 @@
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 */; };
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 */; };
BF6DA766BD3B8893A67FB2BD /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3F882AA48978C11F64DC2DF /* libPods.a */; };
C8994EF7DDBE74B9E3F1A16C /* libPods-JSQMessagesTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E23238C8D8DF79244DEE1787 /* libPods-JSQMessagesTests.a */; };
E8877F1947CE8050ECCD9539 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3F882AA48978C11F64DC2DF /* libPods.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -133,45 +82,22 @@
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
0844AD596023C7658D39E241 /* Pods-JSQMessagesTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.release.xcconfig"; sourceTree = "<group>"; };
223FBACE0F24ADEF8B7F3F24 /* Pods-JSQMessagesTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.debug.xcconfig"; sourceTree = "<group>"; };
27B7FD1B722B36B26CB3460B /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
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>"; };
0B4D05069814EB50FB0F4229 /* Pods-JSQMessagesTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.release.xcconfig"; sourceTree = "<group>"; };
1D4D3B82D90888BCEAF890D3 /* Pods-JSQMessagesTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JSQMessagesTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests.debug.xcconfig"; sourceTree = "<group>"; };
3BA6237809BE0D008CFE3697 /* 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>"; };
54271E3A1C90469100294290 /* jsq_messages_sample.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = jsq_messages_sample.m4a; sourceTree = "<group>"; };
54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQAudioMediaItemTests.m; 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; };
88445B3619E0AE5C0014F889 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
88445B3A19E0C0B10014F889 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = System/Library/Frameworks/XCTest.framework; sourceTree = SDKROOT; };
88445B3E19E1B4470014F889 /* JSQLocationMediaItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQLocationMediaItem.h; sourceTree = "<group>"; };
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; };
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>"; };
8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesNSBundleTests.m; sourceTree = "<group>"; };
8885734819DE540400E89D20 /* DemoSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoSettingsViewController.h; sourceTree = "<group>"; };
8885734919DE540400E89D20 /* DemoSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoSettingsViewController.m; sourceTree = "<group>"; };
8885734B19DE55D000E89D20 /* NSUserDefaults+DemoSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSUserDefaults+DemoSettings.h"; sourceTree = "<group>"; };
@ -184,73 +110,13 @@
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>"; };
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>"; };
88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5919D8E01A00924534 /* UIColor+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIColor+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5B19D8E01A00924534 /* UIImage+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5C19D8E01A00924534 /* UIImage+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+JSQMessages.m"; sourceTree = "<group>"; };
88A25F5D19D8E01A00924534 /* UIView+JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+JSQMessages.h"; sourceTree = "<group>"; };
88A25F5E19D8E01A00924534 /* UIView+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+JSQMessages.m"; sourceTree = "<group>"; };
88A25F6019D8E01A00924534 /* JSQMessagesKeyboardController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesKeyboardController.h; sourceTree = "<group>"; };
88A25F6119D8E01A00924534 /* JSQMessagesKeyboardController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesKeyboardController.m; sourceTree = "<group>"; };
88A25F6219D8E01A00924534 /* JSQMessagesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesViewController.h; sourceTree = "<group>"; };
88A25F6319D8E01A00924534 /* JSQMessagesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesViewController.m; sourceTree = "<group>"; };
88A25F6419D8E01A00924534 /* JSQMessagesViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesViewController.xib; sourceTree = "<group>"; };
88A25F6619D8E01A00924534 /* JSQMessagesAvatarImageFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesAvatarImageFactory.h; sourceTree = "<group>"; };
88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImageFactory.m; sourceTree = "<group>"; };
88A25F6819D8E01A00924534 /* JSQMessagesBubbleImageFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesBubbleImageFactory.h; sourceTree = "<group>"; };
88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImageFactory.m; sourceTree = "<group>"; };
88A25F6A19D8E01A00924534 /* JSQMessagesTimestampFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesTimestampFormatter.h; sourceTree = "<group>"; };
88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTimestampFormatter.m; sourceTree = "<group>"; };
88A25F6C19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesToolbarButtonFactory.h; sourceTree = "<group>"; };
88A25F6D19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarButtonFactory.m; sourceTree = "<group>"; };
88A25F6E19D8E01A00924534 /* JSQMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessages.h; sourceTree = "<group>"; };
88A25F7019D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewFlowLayout.h; sourceTree = "<group>"; };
88A25F7119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesCollectionViewFlowLayout.m; sourceTree = "<group>"; };
88A25F7219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewFlowLayoutInvalidationContext.h; sourceTree = "<group>"; };
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>"; };
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>"; };
88A25F7C19D8E01A00924534 /* JSQMessageBubbleImageDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageBubbleImageDataSource.h; sourceTree = "<group>"; };
88A25F7D19D8E01A00924534 /* JSQMessageData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageData.h; sourceTree = "<group>"; };
88A25F7E19D8E01A00924534 /* JSQMessageMediaData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessageMediaData.h; sourceTree = "<group>"; };
88A25F7F19D8E01A00924534 /* JSQMessagesAvatarImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesAvatarImage.h; sourceTree = "<group>"; };
88A25F8019D8E01A00924534 /* JSQMessagesAvatarImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImage.m; sourceTree = "<group>"; };
88A25F8119D8E01A00924534 /* JSQMessagesBubbleImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesBubbleImage.h; sourceTree = "<group>"; };
88A25F8219D8E01A00924534 /* JSQMessagesBubbleImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesBubbleImage.m; sourceTree = "<group>"; };
88A25F8319D8E01A00924534 /* JSQMessagesCollectionViewDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesCollectionViewDataSource.h; sourceTree = "<group>"; };
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>"; };
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>"; };
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>"; };
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>"; };
88A25F9719D8E01A00924534 /* JSQMessagesInputToolbar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesInputToolbar.m; sourceTree = "<group>"; };
88A25F9819D8E01A00924534 /* JSQMessagesLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesLabel.h; sourceTree = "<group>"; };
88A25F9919D8E01A00924534 /* JSQMessagesLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesLabel.m; sourceTree = "<group>"; };
88A25F9A19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesLoadEarlierHeaderView.h; sourceTree = "<group>"; };
88A25F9B19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesLoadEarlierHeaderView.m; sourceTree = "<group>"; };
88A25F9C19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesLoadEarlierHeaderView.xib; sourceTree = "<group>"; };
88A25F9D19D8E01A00924534 /* JSQMessagesToolbarContentView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesToolbarContentView.h; sourceTree = "<group>"; };
88A25F9E19D8E01A00924534 /* JSQMessagesToolbarContentView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesToolbarContentView.m; sourceTree = "<group>"; };
88A25F9F19D8E01A00924534 /* JSQMessagesToolbarContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesToolbarContentView.xib; sourceTree = "<group>"; };
88A25FA019D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesTypingIndicatorFooterView.h; sourceTree = "<group>"; };
88A25FA119D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesTypingIndicatorFooterView.m; sourceTree = "<group>"; };
88A25FA219D8E01A00924534 /* JSQMessagesTypingIndicatorFooterView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = JSQMessagesTypingIndicatorFooterView.xib; sourceTree = "<group>"; };
88A25FD919D8E0C400924534 /* DemoMessagesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoMessagesViewController.h; sourceTree = "<group>"; };
88A25FDA19D8E0C400924534 /* DemoMessagesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoMessagesViewController.m; sourceTree = "<group>"; };
88A25FDB19D8E0C400924534 /* DemoModelData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoModelData.h; sourceTree = "<group>"; };
@ -282,38 +148,12 @@
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>"; };
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>"; };
AD6E75315517DE46FE495B65 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
C3F882AA48978C11F64DC2DF /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; };
E23238C8D8DF79244DEE1787 /* libPods-JSQMessagesTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JSQMessagesTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -327,7 +167,7 @@
88445B3519E0AE4A0014F889 /* CoreGraphics.framework in Frameworks */,
88445B3319E0AE450014F889 /* Foundation.framework in Frameworks */,
88445B3119E0AE3F0014F889 /* UIKit.framework in Frameworks */,
77CC17A895E6E12BC9CB549A /* libPods.a in Frameworks */,
E8877F1947CE8050ECCD9539 /* libPods.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -342,48 +182,39 @@
88445B3B19E0C0B10014F889 /* XCTest.framework in Frameworks */,
88445B3919E0C0AC0014F889 /* Foundation.framework in Frameworks */,
88445B3819E0C0A70014F889 /* UIKit.framework in Frameworks */,
94A4FA20C2FBD0D62614D5A8 /* libPods.a in Frameworks */,
36CF33BD29CF36EB06D0CCFD /* libPods-JSQMessagesTests.a in Frameworks */,
C8994EF7DDBE74B9E3F1A16C /* libPods-JSQMessagesTests.a in Frameworks */,
BF6DA766BD3B8893A67FB2BD /* libPods.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
2BBEF3CD91C31A49E5FF9E3C /* Pods */ = {
isa = PBXGroup;
children = (
FC5C727E4CCDA2B95A7BA30C /* Pods.debug.xcconfig */,
27B7FD1B722B36B26CB3460B /* Pods.release.xcconfig */,
223FBACE0F24ADEF8B7F3F24 /* Pods-JSQMessagesTests.debug.xcconfig */,
0844AD596023C7658D39E241 /* Pods-JSQMessagesTests.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
636A8663AEEE5C37B65C515D /* Frameworks */ = {
isa = PBXGroup;
children = (
88445B4319E1B5110014F889 /* MapKit.framework */,
88445B4119E1B50B0014F889 /* CoreLocation.framework */,
88445B3419E0AE4A0014F889 /* CoreGraphics.framework */,
88445B4119E1B50B0014F889 /* CoreLocation.framework */,
88445B3219E0AE450014F889 /* Foundation.framework */,
782026E9E518622532ED474D /* libPods-JSQMessagesTests.a */,
97E6750B77E8A7042BA0754B /* libPods.a */,
88445B4319E1B5110014F889 /* MapKit.framework */,
88445B3619E0AE5C0014F889 /* QuartzCore.framework */,
88445B3019E0AE3F0014F889 /* UIKit.framework */,
88445B3A19E0C0B10014F889 /* XCTest.framework */,
C3F882AA48978C11F64DC2DF /* libPods.a */,
E23238C8D8DF79244DEE1787 /* libPods-JSQMessagesTests.a */,
);
name = Frameworks;
path = ../..;
sourceTree = "<group>";
};
8841B88219F4983C00EA16B6 /* Strings */ = {
842892590A65F355D8619D29 /* Pods */ = {
isa = PBXGroup;
children = (
8841B88719F4988800EA16B6 /* JSQMessages.strings */,
3BA6237809BE0D008CFE3697 /* Pods.debug.xcconfig */,
AD6E75315517DE46FE495B65 /* Pods.release.xcconfig */,
1D4D3B82D90888BCEAF890D3 /* Pods-JSQMessagesTests.debug.xcconfig */,
0B4D05069814EB50FB0F4229 /* Pods-JSQMessagesTests.release.xcconfig */,
);
path = Strings;
name = Pods;
sourceTree = "<group>";
};
88A25EF919D8DEC400924534 = {
@ -391,10 +222,11 @@
children = (
886C33FE19F45E30006B4997 /* JSQMessagesViewController.podspec */,
88A25F3E19D8E01A00924534 /* JSQMessagesViewController */,
636A8663AEEE5C37B65C515D /* Frameworks */,
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */,
88A25F1E19D8DEC500924534 /* JSQMessagesTests */,
2BBEF3CD91C31A49E5FF9E3C /* Pods */,
88A25F0319D8DEC400924534 /* Products */,
842892590A65F355D8619D29 /* Pods */,
);
sourceTree = "<group>";
};
@ -432,6 +264,7 @@
88A25F2B19D8DF2500924534 /* JSQMessagesDemo */ = {
isa = PBXGroup;
children = (
54271E3A1C90469100294290 /* jsq_messages_sample.m4a */,
88A25F2C19D8DF2500924534 /* AppDelegate.h */,
88A25F2D19D8DF2500924534 /* AppDelegate.m */,
88A25FD919D8E0C400924534 /* DemoMessagesViewController.h */,
@ -457,12 +290,8 @@
children = (
88A25F3F19D8E01A00924534 /* Assets */,
88A25F5419D8E01A00924534 /* Categories */,
88A25F5F19D8E01A00924534 /* Controllers */,
88A25F6519D8E01A00924534 /* Factories */,
88A25F6E19D8E01A00924534 /* JSQMessages.h */,
88A25F6F19D8E01A00924534 /* Layout */,
88A25F7619D8E01A00924534 /* Model */,
88A25F8919D8E01A00924534 /* Views */,
);
path = JSQMessagesViewController;
sourceTree = "<group>";
@ -470,9 +299,6 @@
88A25F3F19D8E01A00924534 /* Assets */ = {
isa = PBXGroup;
children = (
FCA52AFB1A2B9BAD00CCADFA /* InfoError */,
FCA52AF01A2B6F8A00CCADFA /* Calls */,
8841B88219F4983C00EA16B6 /* Strings */,
8861666C19F492B70025B958 /* JSQMessagesAssets.bundle */,
);
path = Assets;
@ -481,145 +307,35 @@
88A25F5419D8E01A00924534 /* Categories */ = {
isa = PBXGroup;
children = (
88A25F5519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.h */,
88A25F5619D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m */,
88A25F5719D8E01A00924534 /* NSString+JSQMessages.h */,
88A25F5819D8E01A00924534 /* NSString+JSQMessages.m */,
88A25F5919D8E01A00924534 /* UIColor+JSQMessages.h */,
88A25F5A19D8E01A00924534 /* UIColor+JSQMessages.m */,
886FFD2C19E9A65D00EB8485 /* UIDevice+JSQMessages.h */,
886FFD2D19E9A65D00EB8485 /* UIDevice+JSQMessages.m */,
88A25F5B19D8E01A00924534 /* UIImage+JSQMessages.h */,
88A25F5C19D8E01A00924534 /* UIImage+JSQMessages.m */,
88A25F5D19D8E01A00924534 /* UIView+JSQMessages.h */,
88A25F5E19D8E01A00924534 /* UIView+JSQMessages.m */,
);
path = Categories;
sourceTree = "<group>";
};
88A25F5F19D8E01A00924534 /* Controllers */ = {
isa = PBXGroup;
children = (
88A25F6019D8E01A00924534 /* JSQMessagesKeyboardController.h */,
88A25F6119D8E01A00924534 /* JSQMessagesKeyboardController.m */,
88A25F6219D8E01A00924534 /* JSQMessagesViewController.h */,
88A25F6319D8E01A00924534 /* JSQMessagesViewController.m */,
88A25F6419D8E01A00924534 /* JSQMessagesViewController.xib */,
);
path = Controllers;
sourceTree = "<group>";
};
88A25F6519D8E01A00924534 /* Factories */ = {
isa = PBXGroup;
children = (
88A25F6619D8E01A00924534 /* JSQMessagesAvatarImageFactory.h */,
88A25F6719D8E01A00924534 /* JSQMessagesAvatarImageFactory.m */,
88A25F6819D8E01A00924534 /* JSQMessagesBubbleImageFactory.h */,
88A25F6919D8E01A00924534 /* JSQMessagesBubbleImageFactory.m */,
88C4582E19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.h */,
88C4582F19F5F7A0008FD427 /* JSQMessagesMediaViewBubbleImageMasker.m */,
88A25F6A19D8E01A00924534 /* JSQMessagesTimestampFormatter.h */,
88A25F6B19D8E01A00924534 /* JSQMessagesTimestampFormatter.m */,
88A25F6C19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.h */,
88A25F6D19D8E01A00924534 /* JSQMessagesToolbarButtonFactory.m */,
);
path = Factories;
sourceTree = "<group>";
};
88A25F6F19D8E01A00924534 /* Layout */ = {
isa = PBXGroup;
children = (
88A25F7019D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.h */,
88A25F7119D8E01A00924534 /* JSQMessagesCollectionViewFlowLayout.m */,
88A25F7219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.h */,
88A25F7319D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m */,
88A25F7419D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.h */,
88A25F7519D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m */,
);
path = Layout;
sourceTree = "<group>";
};
88A25F7619D8E01A00924534 /* Model */ = {
isa = PBXGroup;
children = (
88445B3E19E1B4470014F889 /* JSQLocationMediaItem.h */,
88445B3F19E1B4470014F889 /* JSQLocationMediaItem.m */,
88A901B419F618B100F99777 /* JSQMediaItem.h */,
88A901B519F618B100F99777 /* JSQMediaItem.m */,
88A25F7919D8E01A00924534 /* JSQMessage.h */,
88A25F7A19D8E01A00924534 /* JSQMessage.m */,
88A25F7B19D8E01A00924534 /* JSQMessageAvatarImageDataSource.h */,
88A25F7C19D8E01A00924534 /* JSQMessageBubbleImageDataSource.h */,
88A25F7D19D8E01A00924534 /* JSQMessageData.h */,
88A25F7E19D8E01A00924534 /* JSQMessageMediaData.h */,
88A25F7F19D8E01A00924534 /* JSQMessagesAvatarImage.h */,
88A25F8019D8E01A00924534 /* JSQMessagesAvatarImage.m */,
88A25F8119D8E01A00924534 /* JSQMessagesBubbleImage.h */,
88A25F8219D8E01A00924534 /* JSQMessagesBubbleImage.m */,
88A25F8319D8E01A00924534 /* JSQMessagesCollectionViewDataSource.h */,
88A25F8419D8E01A00924534 /* JSQMessagesCollectionViewDelegateFlowLayout.h */,
88A25F8519D8E01A00924534 /* JSQPhotoMediaItem.h */,
88A25F8619D8E01A00924534 /* JSQPhotoMediaItem.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>";
};
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 */,
FC15B7AE1A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib */,
88A25F9119D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.h */,
88A25F9219D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m */,
FC15B7AF1A1F6AC800F59801 /* JSQMessagesCollectionViewCellOutgoing.xib */,
88A25F9419D8E01A00924534 /* JSQMessagesComposerTextView.h */,
88A25F9519D8E01A00924534 /* JSQMessagesComposerTextView.m */,
88A25F9619D8E01A00924534 /* JSQMessagesInputToolbar.h */,
88A25F9719D8E01A00924534 /* JSQMessagesInputToolbar.m */,
88A25F9819D8E01A00924534 /* JSQMessagesLabel.h */,
88A25F9919D8E01A00924534 /* JSQMessagesLabel.m */,
88A25F9A19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.h */,
88A25F9B19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.m */,
88A25F9C19D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib */,
88078A9B19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.h */,
88078A9C19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m */,
88A25F9D19D8E01A00924534 /* JSQMessagesToolbarContentView.h */,
88A25F9E19D8E01A00924534 /* JSQMessagesToolbarContentView.m */,
88A25F9F19D8E01A00924534 /* JSQMessagesToolbarContentView.xib */,
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>";
};
88A25FE219D8E18400924534 /* CategoryTests */ = {
isa = PBXGroup;
children = (
8873B60D1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m */,
88A25FE319D8E18400924534 /* JSQMessagesNSStringTests.m */,
88A25FE419D8E18400924534 /* JSQMessagesUIColorTests.m */,
88A25FE519D8E18400924534 /* JSQMessagesUIImageTests.m */,
@ -661,6 +377,7 @@
88A25FF219D8E18400924534 /* ModelTests */ = {
isa = PBXGroup;
children = (
54271E3F1C905D1600294290 /* JSQAudioMediaItemTests.m */,
88C00A4D1A44D4C600B004B3 /* JSQLocationMediaItemTests.m */,
88A25FF319D8E18400924534 /* JSQMessageMediaTests.m */,
88A25FF419D8E18400924534 /* JSQMessagesAvatarImageTests.m */,
@ -687,27 +404,6 @@
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 */
@ -715,11 +411,12 @@
isa = PBXNativeTarget;
buildConfigurationList = 88A25F2519D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessages" */;
buildPhases = (
3AF3068570D5C74873D84E30 /* Check Pods Manifest.lock */,
90945CFDCD14BCFE538D66C9 /* Check Pods Manifest.lock */,
88A25EFE19D8DEC400924534 /* Sources */,
88A25EFF19D8DEC400924534 /* Frameworks */,
88A25F0019D8DEC400924534 /* Resources */,
4CCCD7A86E86CB86C48E303C /* Copy Pods Resources */,
C8D68BB894C4DD38C5615198 /* Embed Pods Frameworks */,
908FA537E0B2FD4A94A60411 /* Copy Pods Resources */,
);
buildRules = (
);
@ -734,11 +431,12 @@
isa = PBXNativeTarget;
buildConfigurationList = 88A25F2819D8DEC500924534 /* Build configuration list for PBXNativeTarget "JSQMessagesTests" */;
buildPhases = (
F4044DAC71D69462CA8CAE98 /* Check Pods Manifest.lock */,
95BD949B70ECF8FE9CDDB707 /* Check Pods Manifest.lock */,
88A25F1719D8DEC400924534 /* Sources */,
88A25F1819D8DEC400924534 /* Frameworks */,
88A25F1919D8DEC400924534 /* Resources */,
F6B484334A138916FC111868 /* Copy Pods Resources */,
78F522A7ECBD8D8774672696 /* Embed Pods Frameworks */,
B85CD3AA4EFCF4765BE7FAD9 /* Copy Pods Resources */,
);
buildRules = (
);
@ -756,7 +454,7 @@
88A25EFA19D8DEC400924534 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 0600;
LastUpgradeCheck = 0700;
ORGANIZATIONNAME = "Hexed Bits";
TargetAttributes = {
88A25F0119D8DEC400924534 = {
@ -805,26 +503,11 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
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 */,
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 */,
FCFA5E1E1A2A08E500C8E32E /* JSQDisplayedMessageCollectionViewCell.xib in Resources */,
54271E3B1C90469100294290 /* jsq_messages_sample.m4a in Resources */,
88A25F3919D8DF2500924534 /* Main.storyboard in Resources */,
FC15B7B01A1F6AC800F59801 /* JSQMessagesCollectionViewCellIncoming.xib in Resources */,
88A25FD419D8E01A00924534 /* JSQMessagesLoadEarlierHeaderView.xib in Resources */,
FC15B7A91A1E880900F59801 /* JSQCallCollectionViewCell.xib in Resources */,
FCA52AF61A2B6FAE00CCADFA /* call_failed@2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -839,22 +522,22 @@
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3AF3068570D5C74873D84E30 /* Check Pods Manifest.lock */ = {
78F522A7ECBD8D8774672696 /* Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Check Pods Manifest.lock";
name = "Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
4CCCD7A86E86CB86C48E303C /* Copy Pods Resources */ = {
908FA537E0B2FD4A94A60411 /* Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -869,7 +552,7 @@
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
showEnvVarsInLog = 0;
};
F4044DAC71D69462CA8CAE98 /* Check Pods Manifest.lock */ = {
90945CFDCD14BCFE538D66C9 /* Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -884,7 +567,22 @@
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
showEnvVarsInLog = 0;
};
F6B484334A138916FC111868 /* Copy Pods Resources */ = {
95BD949B70ECF8FE9CDDB707 /* Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Check Pods Manifest.lock";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
showEnvVarsInLog = 0;
};
B85CD3AA4EFCF4765BE7FAD9 /* Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
@ -899,6 +597,21 @@
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-JSQMessagesTests/Pods-JSQMessagesTests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
C8D68BB894C4DD38C5615198 /* Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Embed Pods Frameworks";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@ -906,54 +619,16 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
88078A9D19D8FEB5005B4595 /* JSQMessagesMediaPlaceholderView.m in Sources */,
88A25FCE19D8E01A00924534 /* JSQMessagesCollectionViewCellOutgoing.m in Sources */,
88A25FD119D8E01A00924534 /* JSQMessagesInputToolbar.m in Sources */,
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 */,
88A25FC619D8E01A00924534 /* JSQMessagesAvatarImage.m in Sources */,
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 */,
88A25FC219D8E01A00924534 /* JSQMessagesCollectionViewFlowLayoutInvalidationContext.m in Sources */,
88A25FE119D8E0C400924534 /* TableViewController.m in Sources */,
88A25FBD19D8E01A00924534 /* JSQMessagesAvatarImageFactory.m in Sources */,
88A25FB519D8E01A00924534 /* JSQSystemSoundPlayer+JSQMessages.m in Sources */,
88A25FD019D8E01A00924534 /* JSQMessagesComposerTextView.m in Sources */,
88A25FC319D8E01A00924534 /* JSQMessagesCollectionViewLayoutAttributes.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -966,6 +641,7 @@
88C00A521A44D4E500B004B3 /* JSQVideoMediaItemTests.m in Sources */,
88A2601519D8E18400924534 /* JSQMessagesInputToolbarTests.m in Sources */,
88A2601719D8E18400924534 /* JSQMessagesLoadEarlierHeaderViewTests.m in Sources */,
54271E401C905D1600294290 /* JSQAudioMediaItemTests.m in Sources */,
88A2601219D8E18400924534 /* JSQMessagesCollectionViewCellTests.m in Sources */,
88A2601619D8E18400924534 /* JSQMessagesLabelTests.m in Sources */,
88A2600B19D8E18400924534 /* JSQMessagesCollectionViewFlowLayoutTests.m in Sources */,
@ -985,6 +661,7 @@
88A2601919D8E18400924534 /* JSQMessagesTypingIndicatorFooterViewTests.m in Sources */,
88A2600319D8E18400924534 /* JSQMessagesUIImageTests.m in Sources */,
88C00A4E1A44D4C600B004B3 /* JSQLocationMediaItemTests.m in Sources */,
8873B60E1AB7B63E006DF9AC /* JSQMessagesNSBundleTests.m in Sources */,
88A2600C19D8E18400924534 /* JSQMessagesCollectionViewLayoutAttributesTests.m in Sources */,
88A2600619D8E18400924534 /* JSQMessagesViewControllerTests.m in Sources */,
88A2600519D8E18400924534 /* JSQMessagesKeyboardControllerTests.m in Sources */,
@ -1003,28 +680,6 @@
/* 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 = (
@ -1056,6 +711,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_OPTIMIZATION_LEVEL = 0;
@ -1116,7 +772,7 @@
};
88A25F2619D8DEC500924534 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = FC5C727E4CCDA2B95A7BA30C /* Pods.debug.xcconfig */;
baseConfigurationReference = 3BA6237809BE0D008CFE3697 /* Pods.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@ -1127,6 +783,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
};
@ -1134,7 +791,7 @@
};
88A25F2719D8DEC500924534 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 27B7FD1B722B36B26CB3460B /* Pods.release.xcconfig */;
baseConfigurationReference = AD6E75315517DE46FE495B65 /* Pods.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
@ -1145,6 +802,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_LDFLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
};
@ -1152,20 +810,18 @@
};
88A25F2919D8DEC500924534 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 223FBACE0F24ADEF8B7F3F24 /* Pods-JSQMessagesTests.debug.xcconfig */;
baseConfigurationReference = 1D4D3B82D90888BCEAF890D3 /* Pods-JSQMessagesTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
);
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
INFOPLIST_FILE = JSQMessagesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JSQMessages.app/JSQMessages";
};
@ -1173,16 +829,14 @@
};
88A25F2A19D8DEC500924534 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 0844AD596023C7658D39E241 /* Pods-JSQMessagesTests.release.xcconfig */;
baseConfigurationReference = 0B4D05069814EB50FB0F4229 /* Pods-JSQMessagesTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(SDKROOT)/Developer/Library/Frameworks",
"$(inherited)",
);
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
INFOPLIST_FILE = JSQMessagesTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = "com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)";
PRODUCT_NAME = "$(TARGET_NAME)";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/JSQMessages.app/JSQMessages";
};

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0600"
LastUpgradeVersion = "0730"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -14,7 +14,7 @@
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4F6B28C25B7B1259BD8C5B8B"
BlueprintIdentifier = "D14DE867BBE115B80620BD22C0E35F79"
BuildableName = "libPods.a"
BlueprintName = "Pods"
ReferencedContainer = "container:Pods/Pods.xcodeproj">
@ -51,10 +51,10 @@
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
@ -76,17 +76,21 @@
ReferencedContainer = "container:JSQMessages.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
buildConfiguration = "Debug"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable>
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F0119D8DEC400924534"
@ -99,12 +103,13 @@
</AdditionalOptions>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
buildConfiguration = "Release"
debugDocumentVersioning = "YES">
<BuildableProductRunnable>
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "88A25F0119D8DEC400924534"

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@ -1,26 +0,0 @@
//
// 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
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

View File

@ -1,35 +0,0 @@
//
// 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
//
#import "AppDelegate.h"
#import "NSUserDefaults+DemoSettings.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Load our default settings
[NSUserDefaults saveIncomingAvatarSetting:YES];
[NSUserDefaults saveOutgoingAvatarSetting:YES];
return YES;
}
@end

View File

@ -1,360 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6245" systemVersion="13F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="JRd-Be-psV">
<dependencies>
<deployment defaultVersion="1792" identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6238"/>
</dependencies>
<scenes>
<!--Root View Controller-->
<scene sceneID="IjL-71-Ll6">
<objects>
<tableViewController id="rXs-qR-ns2" customClass="TableViewController" sceneMemberID="viewController">
<tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="d0b-Sx-5kJ">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" selectionStyle="blue" accessoryType="disclosureIndicator" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="CellIdentifier" textLabel="2qz-Z2-GmT" style="IBUITableViewCellStyleDefault" id="k8B-cw-dMU">
<rect key="frame" x="0.0" y="119" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="k8B-cw-dMU" id="kX4-QF-oKx">
<rect key="frame" x="0.0" y="0.0" width="287" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="2qz-Z2-GmT">
<rect key="frame" x="15" y="0.0" width="270" height="43"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
</tableView>
<navigationItem key="navigationItem" title="Root View Controller" id="irr-Pn-9x5"/>
<connections>
<segue destination="JdJ-0X-ZL8" kind="push" identifier="seguePushDemoVC" id="Hvf-k8-GSP"/>
<segue destination="s4z-xn-r6C" kind="modal" identifier="segueModalDemoVC" id="4UP-0e-ylo"/>
<segue destination="y7K-ZU-Xs9" kind="push" identifier="SegueToSettings" id="u7b-st-FND"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="IcC-ug-dCB" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2982" y="274"/>
</scene>
<!--Settings-->
<scene sceneID="6rZ-ao-qyI">
<objects>
<tableViewController id="y7K-ZU-Xs9" customClass="DemoSettingsViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" allowsSelection="NO" rowHeight="44" sectionHeaderHeight="10" sectionFooterHeight="10" id="GY5-ob-knb">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<sections>
<tableViewSection headerTitle="Messages" id="ygb-Dp-o4r">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="Eii-ro-1yZ">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Eii-ro-1yZ" id="qU9-o3-MWC">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="K7N-os-fuc">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="49" id="A6s-Sr-u8U"/>
<constraint firstAttribute="height" constant="31" id="z9i-uJ-MBq"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="Ebi-bs-7Bc"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Load extra messages" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bSS-CD-nfD">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="bSS-CD-nfD" firstAttribute="top" secondItem="qU9-o3-MWC" secondAttribute="top" constant="10" id="4Iw-W0-qZs"/>
<constraint firstAttribute="trailing" secondItem="K7N-os-fuc" secondAttribute="trailing" constant="8" id="Fex-nr-C1R"/>
<constraint firstAttribute="bottom" secondItem="K7N-os-fuc" secondAttribute="bottom" constant="6" id="IBG-gn-Fpk"/>
<constraint firstItem="bSS-CD-nfD" firstAttribute="leading" secondItem="qU9-o3-MWC" secondAttribute="leading" constant="8" id="N5B-E5-Pzk"/>
<constraint firstItem="K7N-os-fuc" firstAttribute="leading" secondItem="bSS-CD-nfD" secondAttribute="trailing" constant="8" id="O2Y-G9-d6n"/>
<constraint firstItem="K7N-os-fuc" firstAttribute="top" secondItem="qU9-o3-MWC" secondAttribute="top" constant="6" id="UbM-aE-caS"/>
<constraint firstAttribute="bottom" secondItem="bSS-CD-nfD" secondAttribute="bottom" constant="9" id="poL-wE-Eir"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="bZI-G1-eYA">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="bZI-G1-eYA" id="1Ho-Zz-KN0">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hMq-Ee-EJK">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="gM4-dK-cl7"/>
<constraint firstAttribute="width" constant="49" id="hvu-Yy-NTG"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="JCb-EJ-M9U"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Load really long message" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YV3-GH-Yul">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="hMq-Ee-EJK" firstAttribute="leading" secondItem="YV3-GH-Yul" secondAttribute="trailing" constant="8" id="KFO-nO-4r4"/>
<constraint firstItem="YV3-GH-Yul" firstAttribute="top" secondItem="1Ho-Zz-KN0" secondAttribute="top" constant="10" id="Lgl-fY-a8c"/>
<constraint firstAttribute="bottom" secondItem="YV3-GH-Yul" secondAttribute="bottom" constant="9" id="NvL-b8-QDl"/>
<constraint firstAttribute="bottom" secondItem="hMq-Ee-EJK" secondAttribute="bottom" constant="6" id="aef-Rh-49d"/>
<constraint firstItem="hMq-Ee-EJK" firstAttribute="top" secondItem="1Ho-Zz-KN0" secondAttribute="top" constant="6" id="csX-us-yCd"/>
<constraint firstAttribute="trailing" secondItem="hMq-Ee-EJK" secondAttribute="trailing" constant="8" id="xDE-tf-5mB"/>
<constraint firstItem="YV3-GH-Yul" firstAttribute="leading" secondItem="1Ho-Zz-KN0" secondAttribute="leading" constant="8" id="xyR-oc-iUp"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="2Th-gL-oAN">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="2Th-gL-oAN" id="OFq-Mz-mbl">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="baL-Tb-bTJ">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="49" id="SaV-RG-DVL"/>
<constraint firstAttribute="height" constant="31" id="dXb-pb-etA"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="w1H-5W-oip"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Empty view, no messages" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DoU-SU-Nek">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="DoU-SU-Nek" firstAttribute="leading" secondItem="OFq-Mz-mbl" secondAttribute="leading" constant="8" id="A9k-hI-0BH"/>
<constraint firstAttribute="bottom" secondItem="baL-Tb-bTJ" secondAttribute="bottom" constant="6" id="Ff7-1T-EbZ"/>
<constraint firstItem="DoU-SU-Nek" firstAttribute="top" secondItem="OFq-Mz-mbl" secondAttribute="top" constant="10" id="Uji-LE-8IA"/>
<constraint firstAttribute="trailing" secondItem="baL-Tb-bTJ" secondAttribute="trailing" constant="8" id="dUp-7b-g3p"/>
<constraint firstItem="baL-Tb-bTJ" firstAttribute="leading" secondItem="DoU-SU-Nek" secondAttribute="trailing" constant="8" id="fxZ-zy-ksL"/>
<constraint firstAttribute="bottom" secondItem="DoU-SU-Nek" secondAttribute="bottom" constant="9" id="h0B-EX-3MW"/>
<constraint firstItem="baL-Tb-bTJ" firstAttribute="top" secondItem="OFq-Mz-mbl" secondAttribute="top" constant="6" id="v5e-xk-srk"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="Avatars" id="ns0-OO-PGu">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="hYS-4f-iL6">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hYS-4f-iL6" id="dk1-tc-gux">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fLZ-NC-aPO">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="width" constant="49" id="1lf-6y-hgz"/>
<constraint firstAttribute="height" constant="31" id="rdQ-ol-d20"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="WnT-b7-og6"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Incoming avatars" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="RUq-Pa-3nx">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="RUq-Pa-3nx" secondAttribute="bottom" constant="9" id="7Yt-uN-sOS"/>
<constraint firstItem="RUq-Pa-3nx" firstAttribute="top" secondItem="dk1-tc-gux" secondAttribute="top" constant="10" id="Aih-Lc-tq7"/>
<constraint firstItem="fLZ-NC-aPO" firstAttribute="leading" secondItem="RUq-Pa-3nx" secondAttribute="trailing" constant="8" id="Cfo-7m-Vyd"/>
<constraint firstAttribute="trailing" secondItem="fLZ-NC-aPO" secondAttribute="trailing" constant="8" id="Mgz-VG-tDn"/>
<constraint firstItem="fLZ-NC-aPO" firstAttribute="top" secondItem="dk1-tc-gux" secondAttribute="top" constant="6" id="S6i-he-vB9"/>
<constraint firstItem="RUq-Pa-3nx" firstAttribute="leading" secondItem="dk1-tc-gux" secondAttribute="leading" constant="8" id="mhd-oX-p53"/>
<constraint firstAttribute="bottom" secondItem="fLZ-NC-aPO" secondAttribute="bottom" constant="6" id="yyq-Sg-nJi"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="VF7-uo-6Pc">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VF7-uo-6Pc" id="zad-JQ-TRI">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LuM-mk-Zj6">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="QXv-ty-g0B"/>
<constraint firstAttribute="width" constant="49" id="rZ3-cO-f8t"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="rNB-Bx-Uh3"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Outgoing avatars" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Rr-S8-Uae">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="LuM-mk-Zj6" secondAttribute="bottom" constant="6" id="1G7-8S-rYC"/>
<constraint firstAttribute="bottom" secondItem="9Rr-S8-Uae" secondAttribute="bottom" constant="9" id="5xp-ez-tac"/>
<constraint firstItem="LuM-mk-Zj6" firstAttribute="leading" secondItem="9Rr-S8-Uae" secondAttribute="trailing" constant="8" id="C5c-2A-mli"/>
<constraint firstAttribute="trailing" secondItem="LuM-mk-Zj6" secondAttribute="trailing" constant="8" id="Lep-LY-D1h"/>
<constraint firstItem="LuM-mk-Zj6" firstAttribute="top" secondItem="zad-JQ-TRI" secondAttribute="top" constant="6" id="Y6a-JS-aLj"/>
<constraint firstItem="9Rr-S8-Uae" firstAttribute="leading" secondItem="zad-JQ-TRI" secondAttribute="leading" constant="8" id="Yao-VR-Is6"/>
<constraint firstItem="9Rr-S8-Uae" firstAttribute="top" secondItem="zad-JQ-TRI" secondAttribute="top" constant="10" id="Yiv-t6-Xj5"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
<tableViewSection headerTitle="Dynamic Behaviors" footerTitle="NOTE: This feature is experimental" id="o5m-OT-1Iw">
<cells>
<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" id="q07-lZ-YdI">
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="q07-lZ-YdI" id="btE-Mk-fSE">
<autoresizingMask key="autoresizingMask"/>
<subviews>
<switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uXC-2j-cgi">
<rect key="frame" x="263" y="6" width="51" height="31"/>
<constraints>
<constraint firstAttribute="height" constant="31" id="5bI-xQ-njj"/>
<constraint firstAttribute="width" constant="49" id="PG2-X2-FdD"/>
</constraints>
<connections>
<action selector="didTapSwitch:" destination="y7K-ZU-Xs9" eventType="valueChanged" id="oHB-iq-JSz"/>
</connections>
</switch>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Springy bubbles" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3d2-fZ-dx9">
<rect key="frame" x="8" y="10" width="247" height="24"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="3d2-fZ-dx9" firstAttribute="leading" secondItem="btE-Mk-fSE" secondAttribute="leading" constant="8" id="6Cs-6l-Xzp"/>
<constraint firstItem="uXC-2j-cgi" firstAttribute="leading" secondItem="3d2-fZ-dx9" secondAttribute="trailing" constant="8" id="7Mq-HR-4nY"/>
<constraint firstItem="uXC-2j-cgi" firstAttribute="top" secondItem="btE-Mk-fSE" secondAttribute="top" constant="6" id="Ajq-5g-XKo"/>
<constraint firstAttribute="bottom" secondItem="3d2-fZ-dx9" secondAttribute="bottom" constant="9" id="EzH-aB-ePQ"/>
<constraint firstAttribute="bottom" secondItem="uXC-2j-cgi" secondAttribute="bottom" constant="6" id="RCb-Mi-FHX"/>
<constraint firstItem="3d2-fZ-dx9" firstAttribute="top" secondItem="btE-Mk-fSE" secondAttribute="top" constant="10" id="btF-q4-HJg"/>
<constraint firstAttribute="trailing" secondItem="uXC-2j-cgi" secondAttribute="trailing" constant="8" id="zzu-aP-ZiL"/>
</constraints>
</tableViewCellContentView>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="y7K-ZU-Xs9" id="4gP-Ip-VMs"/>
<outlet property="delegate" destination="y7K-ZU-Xs9" id="RdT-hW-mFp"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Settings" id="hrw-Dp-Tor"/>
<connections>
<outlet property="emptySwitch" destination="baL-Tb-bTJ" id="qk7-dH-53U"/>
<outlet property="extraMessagesSwitch" destination="K7N-os-fuc" id="qlF-0W-3JO"/>
<outlet property="incomingAvatarsSwitch" destination="fLZ-NC-aPO" id="0ck-t9-Hwt"/>
<outlet property="longMessageSwitch" destination="hMq-Ee-EJK" id="Vs2-fX-Hys"/>
<outlet property="outgoingAvatarsSwitch" destination="LuM-mk-Zj6" id="EAh-35-xjI"/>
<outlet property="springySwitch" destination="uXC-2j-cgi" id="Jzx-1y-VZP"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="5u5-k6-W2j" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2982" y="1039"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="eGf-GM-ORQ">
<objects>
<navigationController definesPresentationContext="YES" id="s4z-xn-r6C" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="G3q-Gy-0Lf">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="2Qx-iu-03V" kind="relationship" relationship="rootViewController" id="cuu-7c-yOr"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="8DO-Rt-kgb" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2409" y="619"/>
</scene>
<!--Demo Messages View Controller-->
<scene sceneID="gOX-cv-CuN">
<objects>
<viewController storyboardIdentifier="DemoVC" id="JdJ-0X-ZL8" customClass="DemoMessagesViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="TE8-r2-pE8"/>
<viewControllerLayoutGuide type="bottom" id="H2n-HB-Ssl"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Vop-TB-ImV">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="URv-4c-d6h"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="B2s-hQ-gD4" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-2409" y="-71"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="A8N-cL-8VP">
<objects>
<navigationController definesPresentationContext="YES" id="JRd-Be-psV" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="YZb-OI-WKd">
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="rXs-qR-ns2" kind="relationship" relationship="rootViewController" id="8xe-QC-QaY"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="OC7-Ng-9xQ" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-3413" y="274"/>
</scene>
<!--Demo Messages View Controller-->
<scene sceneID="Rr5-W8-Xyh">
<objects>
<viewController id="2Qx-iu-03V" customClass="DemoMessagesViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="hTc-sT-can"/>
<viewControllerLayoutGuide type="bottom" id="BPF-eU-3uQ"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="SsE-pA-zOd">
<rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
<navigationItem key="navigationItem" id="gBw-Dh-o4F"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="jTG-EA-PIP" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-1989" y="619"/>
</scene>
</scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>

View File

@ -1,48 +0,0 @@
//
// 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
//
// Import all the things
#import "JSQMessages.h"
#import "DemoModelData.h"
#import "NSUserDefaults+DemoSettings.h"
@class DemoMessagesViewController;
@protocol JSQDemoViewControllerDelegate <NSObject>
- (void)didDismissJSQDemoViewController:(DemoMessagesViewController *)vc;
@end
@interface DemoMessagesViewController : JSQMessagesViewController <UIActionSheetDelegate>
@property (weak, nonatomic) id<JSQDemoViewControllerDelegate> delegateModal;
@property (strong, nonatomic) DemoModelData *demoData;
- (void)receiveMessagePressed:(UIBarButtonItem *)sender;
- (void)closePressed:(UIBarButtonItem *)sender;
@end

View File

@ -1,584 +0,0 @@
//
// 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
//
#import "DemoMessagesViewController.h"
#import "JSQCallCollectionViewCell.h"
#import "JSQCall.h"
#import "JSQDisplayedMessageCollectionViewCell.h"
#import "JSQErrorMessage.h"
#import "JSQInfoMessage.h"
@implementation DemoMessagesViewController
#pragma mark - View lifecycle
/**
* Override point for customization.
*
* Customize your view.
* Look at the properties on `JSQMessagesViewController` and `JSQMessagesCollectionView` to see what is possible.
*
* Customize your layout.
* Look at the properties on `JSQMessagesCollectionViewFlowLayout` to see what is possible.
*/
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"JSQMessages";
/**
* You MUST set your senderId and display name
*/
self.senderId = kJSQDemoAvatarIdSquires;
self.senderDisplayName = kJSQDemoAvatarDisplayNameSquires;
/**
* Load up our fake data for the demo
*/
self.demoData = [[DemoModelData alloc] init];
/**
* You can set custom avatar sizes
*/
if (![NSUserDefaults incomingAvatarSetting]) {
self.collectionView.collectionViewLayout.incomingAvatarViewSize = CGSizeZero;
}
if (![NSUserDefaults outgoingAvatarSetting]) {
self.collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero;
}
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
{
[super viewWillAppear:animated];
if (self.delegateModal) {
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemStop
target:self
action:@selector(closePressed:)];
}
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
/**
* Enable/disable springy bubbles, default is NO.
* You must set this from `viewDidAppear:`
* Note: this feature is mostly stable, but still experimental
*/
self.collectionView.collectionViewLayout.springinessEnabled = [NSUserDefaults springinessSetting];
}
#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
{
/**
* DEMO ONLY
*
* The following is simply to simulate received messages for the demo.
* Do not actually do this.
*/
/**
* Show the typing indicator to be shown
*/
self.showTypingIndicator = !self.showTypingIndicator;
/**
* Scroll to actually view the indicator
*/
[self scrollToBottomAnimated:YES];
/**
* Copy last sent message, this will be the new "received" message
*/
JSQMessage *copyMessage = [[self.demoData.messages lastObject] copy];
if (!copyMessage) {
copyMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdJobs
displayName:kJSQDemoAvatarDisplayNameJobs
text:@"First received!"];
}
/**
* Allow typing indicator to show
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSMutableArray *userIds = [[self.demoData.users allKeys] mutableCopy];
[userIds removeObject:self.senderId];
NSString *randomUserId = userIds[arc4random_uniform((int)[userIds count])];
JSQMessage *newMessage = nil;
id<JSQMessageMediaData> newMediaData = nil;
id newMediaAttachmentCopy = nil;
if ([copyMessage isKindOfClass:[JSQMessage class]]) {
/**
* Last message was a media message
*/
id<JSQMessageMediaData> copyMediaData = copyMessage.media;
if ([copyMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {
JSQPhotoMediaItem *photoItemCopy = [((JSQPhotoMediaItem *)copyMediaData) copy];
photoItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [UIImage imageWithCGImage:photoItemCopy.image.CGImage];
/**
* Set image to nil to simulate "downloading" the image
* and show the placeholder view
*/
photoItemCopy.image = nil;
newMediaData = photoItemCopy;
}
else if ([copyMediaData isKindOfClass:[JSQLocationMediaItem class]]) {
JSQLocationMediaItem *locationItemCopy = [((JSQLocationMediaItem *)copyMediaData) copy];
locationItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [locationItemCopy.location copy];
/**
* Set location to nil to simulate "downloading" the location data
*/
locationItemCopy.location = nil;
newMediaData = locationItemCopy;
}
else if ([copyMediaData isKindOfClass:[JSQVideoMediaItem class]]) {
JSQVideoMediaItem *videoItemCopy = [((JSQVideoMediaItem *)copyMediaData) copy];
videoItemCopy.appliesMediaViewMaskAsOutgoing = NO;
newMediaAttachmentCopy = [videoItemCopy.fileURL copy];
/**
* Reset video item to simulate "downloading" the video
*/
videoItemCopy.fileURL = nil;
videoItemCopy.isReadyToPlay = NO;
newMediaData = videoItemCopy;
}
else {
NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);
}
newMessage = [JSQMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
media:newMediaData];
}
else {
/**
* Last message was a text message
*/
newMessage = [JSQMessage messageWithSenderId:randomUserId
displayName:self.demoData.users[randomUserId]
text:copyMessage.text];
}
/**
* Upon receiving a message, you should:
*
* 1. Play sound (optional)
* 2. Add new id<JSQMessageData> object to your data source
* 3. Call `finishReceivingMessage`
*/
[JSQSystemSoundPlayer jsq_playMessageReceivedSound];
[self.demoData.messages addObject:newMessage];
[self finishReceivingMessageAnimated:YES];
if (newMessage.isMediaMessage) {
/**
* Simulate "downloading" media
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
/**
* Media is "finished downloading", re-display visible cells
*
* If media cell is not visible, the next time it is dequeued the view controller will display its new attachment data
*
* Reload the specific item, or simply call `reloadData`
*/
if ([newMediaData isKindOfClass:[JSQPhotoMediaItem class]]) {
((JSQPhotoMediaItem *)newMediaData).image = newMediaAttachmentCopy;
[self.collectionView reloadData];
}
else if ([newMediaData isKindOfClass:[JSQLocationMediaItem class]]) {
[((JSQLocationMediaItem *)newMediaData)setLocation:newMediaAttachmentCopy withCompletionHandler:^{
[self.collectionView reloadData];
}];
}
else if ([newMediaData isKindOfClass:[JSQVideoMediaItem class]]) {
((JSQVideoMediaItem *)newMediaData).fileURL = newMediaAttachmentCopy;
((JSQVideoMediaItem *)newMediaData).isReadyToPlay = YES;
[self.collectionView reloadData];
}
else {
NSLog(@"%s error: unrecognized media item", __PRETTY_FUNCTION__);
}
});
}
});
}
- (void)closePressed:(UIBarButtonItem *)sender
{
[self.delegateModal didDismissJSQDemoViewController:self];
}
#pragma mark - JSQMessagesViewController method overrides
- (void)didPressSendButton:(UIButton *)button
withMessageText:(NSString *)text
senderId:(NSString *)senderId
senderDisplayName:(NSString *)senderDisplayName
date:(NSDate *)date
{
/**
* Sending a message. Your implementation of this method should do *at least* the following:
*
* 1. Play sound (optional)
* 2. Add new id<JSQMessageData> object to your data source
* 3. Call `finishSendingMessage`
*/
[JSQSystemSoundPlayer jsq_playMessageSentSound];
JSQMessage *message = [[JSQMessage alloc] initWithSenderId:senderId
senderDisplayName:senderDisplayName
date:date
text:text];
[self.demoData.messages addObject:message];
[self finishSendingMessageAnimated:YES];
}
- (void)didPressAccessoryButton:(UIButton *)sender
{
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"Media messages"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Send photo", @"Send location", @"Send video", nil];
[sheet showFromToolbar:self.inputToolbar];
}
- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex
{
if (buttonIndex == actionSheet.cancelButtonIndex) {
return;
}
switch (buttonIndex) {
case 0:
[self.demoData addPhotoMediaMessage];
break;
case 1:
{
__weak UICollectionView *weakView = self.collectionView;
[self.demoData addLocationMediaMessageCompletion:^{
[weakView reloadData];
}];
}
break;
case 2:
[self.demoData addVideoMediaMessage];
break;
}
[JSQSystemSoundPlayer jsq_playMessageSentSound];
[self finishSendingMessageAnimated:YES];
}
#pragma mark - JSQMessages CollectionView DataSource
- (id<JSQMessageData>)collectionView:(JSQMessagesCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
return [self.demoData.messages objectAtIndex:indexPath.item];
}
- (id<JSQMessageBubbleImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView messageBubbleImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
/**
* You may return nil here if you do not want bubbles.
* In this case, you should set the background color of your collection view cell's textView.
*
* Otherwise, return your previously created bubble image data objects.
*/
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
if ([message.senderId isEqualToString:self.senderId]) {
return self.demoData.outgoingBubbleImageData;
}
return self.demoData.incomingBubbleImageData;
}
- (id<JSQMessageAvatarImageDataSource>)collectionView:(JSQMessagesCollectionView *)collectionView avatarImageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
/**
* Return `nil` here if you do not want avatars.
* If you do return `nil`, be sure to do the following in `viewDidLoad`:
*
* self.collectionView.collectionViewLayout.incomingAvatarViewSize = CGSizeZero;
* self.collectionView.collectionViewLayout.outgoingAvatarViewSize = CGSizeZero;
*
* It is possible to have only outgoing avatars or only incoming avatars, too.
*/
/**
* Return your previously created avatar image data objects.
*
* Note: these the avatars will be sized according to these values:
*
* self.collectionView.collectionViewLayout.incomingAvatarViewSize
* self.collectionView.collectionViewLayout.outgoingAvatarViewSize
*
* Override the defaults in `viewDidLoad`
*/
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;
}
}
else {
if (![NSUserDefaults incomingAvatarSetting]) {
return nil;
}
}
return [self.demoData.avatars objectForKey:message.senderId];
}
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
/**
* This logic should be consistent with what you return from `heightForCellTopLabelAtIndexPath:`
* The other label text delegate methods should follow a similar pattern.
*
* Show a timestamp for every 3rd message
*/
if (indexPath.item % 3 == 0) {
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
return [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:message.date];
}
return nil;
}
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForMessageBubbleTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
JSQMessage *message = [self.demoData.messages objectAtIndex:indexPath.item];
/**
* iOS7-style sender name labels
*/
if ([message.senderId isEqualToString:self.senderId]) {
return nil;
}
if (indexPath.item - 1 > 0) {
JSQMessage *previousMessage = [self.demoData.messages objectAtIndex:indexPath.item - 1];
if ([[previousMessage senderId] isEqualToString:message.senderId]) {
return nil;
}
}
/**
* Don't specify attributes to use the defaults.
*/
return [[NSAttributedString alloc] initWithString:message.senderDisplayName];
}
- (NSAttributedString *)collectionView:(JSQMessagesCollectionView *)collectionView attributedTextForCellBottomLabelAtIndexPath:(NSIndexPath *)indexPath
{
return nil;
}
#pragma mark - UICollectionView DataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [self.demoData.messages count];
}
- (UICollectionViewCell *)collectionView:(JSQMessagesCollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
/**
* Override point for customizing cells
*/
JSQMessage *msg = [self.demoData.messages objectAtIndex:indexPath.item];
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) };
}
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;
}
}
#pragma mark - JSQMessages collection view flow layout delegate
#pragma mark - Adjusting cell label heights
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForCellTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
/**
* Each label in a cell has a `height` delegate method that corresponds to its text dataSource method
*/
/**
* This logic should be consistent with what you return from `attributedTextForCellTopLabelAtIndexPath:`
* The other label height delegate methods should follow similarly
*
* Show a timestamp for every 3rd message
*/
// if (indexPath.item % 3 == 0) {
// return kJSQMessagesCollectionViewCellLabelHeightDefault;
// }
return 0.0f;
}
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForMessageBubbleTopLabelAtIndexPath:(NSIndexPath *)indexPath
{
/**
* iOS7-style sender name labels
*/
JSQMessage *currentMessage = [self.demoData.messages objectAtIndex:indexPath.item];
if ([[currentMessage senderId] isEqualToString:self.senderId]) {
return 0.0f;
}
if (indexPath.item - 1 > 0) {
JSQMessage *previousMessage = [self.demoData.messages objectAtIndex:indexPath.item - 1];
if ([[previousMessage senderId] isEqualToString:[currentMessage senderId]]) {
return 0.0f;
}
}
return kJSQMessagesCollectionViewCellLabelHeightDefault;
}
- (CGFloat)collectionView:(JSQMessagesCollectionView *)collectionView
layout:(JSQMessagesCollectionViewFlowLayout *)collectionViewLayout heightForCellBottomLabelAtIndexPath:(NSIndexPath *)indexPath
{
return 0.0f;
}
#pragma mark - Responding to collection view tap events
- (void)collectionView:(JSQMessagesCollectionView *)collectionView
header:(JSQMessagesLoadEarlierHeaderView *)headerView didTapLoadEarlierMessagesButton:(UIButton *)sender
{
NSLog(@"Load earlier messages!");
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didTapAvatarImageView:(UIImageView *)avatarImageView atIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped avatar!");
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didTapMessageBubbleAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped message bubble!");
}
- (void)collectionView:(JSQMessagesCollectionView *)collectionView didTapCellAtIndexPath:(NSIndexPath *)indexPath touchLocation:(CGPoint)touchLocation
{
NSLog(@"Tapped cell at %@!", NSStringFromCGPoint(touchLocation));
}
@end

View File

@ -1,61 +0,0 @@
//
// 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
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import "JSQMessages.h"
/**
* This is for demo/testing purposes only.
* This object sets up some fake model data.
* Do not actually do anything like this.
*/
static NSString * const kJSQDemoAvatarDisplayNameSquires = @"Jesse Squires";
static NSString * const kJSQDemoAvatarDisplayNameCook = @"Tim Cook";
static NSString * const kJSQDemoAvatarDisplayNameJobs = @"Jobs";
static NSString * const kJSQDemoAvatarDisplayNameWoz = @"Steve Wozniak";
static NSString * const kJSQDemoAvatarIdSquires = @"053496-4509-289";
static NSString * const kJSQDemoAvatarIdCook = @"468-768355-23123";
static NSString * const kJSQDemoAvatarIdJobs = @"707-8956784-57";
static NSString * const kJSQDemoAvatarIdWoz = @"309-41802-93823";
@interface DemoModelData : NSObject
@property (strong, nonatomic) NSMutableArray *messages;
@property (strong, nonatomic) NSDictionary *avatars;
@property (strong, nonatomic) JSQMessagesBubbleImage *outgoingBubbleImageData;
@property (strong, nonatomic) JSQMessagesBubbleImage *incomingBubbleImageData;
@property (strong, nonatomic) NSDictionary *users;
- (void)addPhotoMediaMessage;
- (void)addLocationMediaMessageCompletion:(JSQLocationMediaItemCompletionBlock)completion;
- (void)addVideoMediaMessage;
@end

View File

@ -1,236 +0,0 @@
//
// 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
//
#import "DemoModelData.h"
#import "NSUserDefaults+DemoSettings.h"
#import "JSQCall.h"
#import "JSQInfoMessage.h"
#import "JSQErrorMessage.h"
/**
* This is for demo/testing purposes only.
* This object sets up some fake model data.
* Do not actually do anything like this.
*/
@implementation DemoModelData
- (instancetype)init
{
self = [super init];
if (self) {
if ([NSUserDefaults emptyMessagesSetting]) {
self.messages = [NSMutableArray new];
}
else {
[self loadFakeMessages];
}
/**
* Create avatar images once.
*
* Be sure to create your avatars one time and reuse them for good performance.
*
* If you are not using avatars, ignore this.
*/
JSQMessagesAvatarImage *jsqImage = [JSQMessagesAvatarImageFactory avatarImageWithUserInitials:@"JSQ"
backgroundColor:[UIColor colorWithWhite:0.85f alpha:1.0f]
textColor:[UIColor colorWithWhite:0.60f alpha:1.0f]
font:[UIFont systemFontOfSize:14.0f]
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
JSQMessagesAvatarImage *cookImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_cook"]
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
JSQMessagesAvatarImage *jobsImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_jobs"]
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
JSQMessagesAvatarImage *wozImage = [JSQMessagesAvatarImageFactory avatarImageWithImage:[UIImage imageNamed:@"demo_avatar_woz"]
diameter:kJSQMessagesCollectionViewAvatarSizeDefault];
self.avatars = @{ kJSQDemoAvatarIdSquires : jsqImage,
kJSQDemoAvatarIdCook : cookImage,
kJSQDemoAvatarIdJobs : jobsImage,
kJSQDemoAvatarIdWoz : wozImage };
self.users = @{ kJSQDemoAvatarIdJobs : kJSQDemoAvatarDisplayNameJobs,
kJSQDemoAvatarIdCook : kJSQDemoAvatarDisplayNameCook,
kJSQDemoAvatarIdWoz : kJSQDemoAvatarDisplayNameWoz,
kJSQDemoAvatarIdSquires : kJSQDemoAvatarDisplayNameSquires };
/**
* Create message bubble images objects.
*
* Be sure to create your bubble images one time and reuse them for good performance.
*
*/
JSQMessagesBubbleImageFactory *bubbleFactory = [[JSQMessagesBubbleImageFactory alloc] init];
self.outgoingBubbleImageData = [bubbleFactory outgoingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleLightGrayColor]];
self.incomingBubbleImageData = [bubbleFactory incomingMessagesBubbleImageWithColor:[UIColor jsq_messageBubbleGreenColor]];
}
return self;
}
- (void)loadFakeMessages
{
/**
* Load some fake messages for demo.
*
* You should have a mutable array or orderedSet, or something.
*/
self.messages = [[NSMutableArray alloc] initWithObjects:
[[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."],
[[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."],
[[JSQMessage 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."],
[[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];
/**
* Setting to load extra messages for testing/demo
*/
if ([NSUserDefaults extraMessagesSetting]) {
NSArray *copyOfMessages = [self.messages copy];
for (NSUInteger i = 0; i < 4; i++) {
[self.messages addObjectsFromArray:copyOfMessages];
}
}
/**
* Setting to load REALLY long message for testing/demo
* You should see "END" twice
*/
if ([NSUserDefaults longMessageSetting]) {
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];
}
}
- (void)addPhotoMediaMessage
{
JSQPhotoMediaItem *photoItem = [[JSQPhotoMediaItem alloc] initWithImage:[UIImage imageNamed:@"goldengate"]];
JSQMessage *photoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:photoItem];
[self.messages addObject:photoMessage];
}
- (void)addLocationMediaMessageCompletion:(JSQLocationMediaItemCompletionBlock)completion
{
CLLocation *ferryBuildingInSF = [[CLLocation alloc] initWithLatitude:37.795313 longitude:-122.393757];
JSQLocationMediaItem *locationItem = [[JSQLocationMediaItem alloc] init];
[locationItem setLocation:ferryBuildingInSF withCompletionHandler:completion];
JSQMessage *locationMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:locationItem];
[self.messages addObject:locationMessage];
}
- (void)addVideoMediaMessage
{
// don't have a real video, just pretending
NSURL *videoURL = [NSURL URLWithString:@"file://"];
JSQVideoMediaItem *videoItem = [[JSQVideoMediaItem alloc] initWithFileURL:videoURL isReadyToPlay:YES];
JSQMessage *videoMessage = [JSQMessage messageWithSenderId:kJSQDemoAvatarIdSquires
displayName:kJSQDemoAvatarDisplayNameSquires
media:videoItem];
[self.messages addObject:videoMessage];
}
@end

View File

@ -1,42 +0,0 @@
//
// 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
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
/**
* This is for demo/testing purposes only.
*
* This is a terrible idea for a real app.
*/
@interface DemoSettingsViewController : UITableViewController
@property (weak, nonatomic) IBOutlet UISwitch *extraMessagesSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *longMessageSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *emptySwitch;
@property (weak, nonatomic) IBOutlet UISwitch *incomingAvatarsSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *outgoingAvatarsSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *springySwitch;
@end

View File

@ -1,72 +0,0 @@
//
// 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
//
#import "DemoSettingsViewController.h"
#import "NSUserDefaults+DemoSettings.h"
/**
* This is for demo/testing purposes only.
*
* This is a terrible idea for a real app.
*/
@implementation DemoSettingsViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.extraMessagesSwitch.on = [NSUserDefaults extraMessagesSetting];
self.longMessageSwitch.on = [NSUserDefaults longMessageSetting];
self.emptySwitch.on = [NSUserDefaults emptyMessagesSetting];
self.incomingAvatarsSwitch.on = [NSUserDefaults incomingAvatarSetting];
self.outgoingAvatarsSwitch.on = [NSUserDefaults outgoingAvatarSetting];
self.springySwitch.on = [NSUserDefaults springinessSetting];
}
- (IBAction)didTapSwitch:(UISwitch *)sender
{
if (sender == self.extraMessagesSwitch) {
[NSUserDefaults saveExtraMessagesSetting:sender.on];
}
else if (sender == self.longMessageSwitch) {
[NSUserDefaults saveLongMessageSetting:sender.on];
}
else if (sender == self.emptySwitch) {
[NSUserDefaults saveEmptyMessagesSetting:sender.on];
}
else if (sender == self.incomingAvatarsSwitch) {
[NSUserDefaults saveIncomingAvatarSetting:sender.on];
}
else if (sender == self.outgoingAvatarsSwitch) {
[NSUserDefaults saveOutgoingAvatarSetting:sender.on];
}
else if (sender == self.springySwitch) {
[NSUserDefaults saveSpringinessSetting:sender.on];
}
[[NSUserDefaults standardUserDefaults] synchronize];
}
@end

View File

@ -1,80 +0,0 @@
{
"images" : [
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-87.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-Spotlight-iOS7@2x-1.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-120-1.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-120.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-180.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-Small.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-Small@2x-1.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-Spotlight-iOS7.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-Spotlight-iOS7@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-76@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 760 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 947 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -1,23 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "demo_avatar_cook.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "demo_avatar_cook@2x.png"
},
{
"idiom" : "universal",
"scale" : "3x",
"filename" : "demo_avatar_cook@3x.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

View File

@ -1,23 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "demo_avatar_jobs.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "demo_avatar_jobs@2x.png"
},
{
"idiom" : "universal",
"scale" : "3x",
"filename" : "demo_avatar_jobs@3x.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,23 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "demo_avatar_woz.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "demo_avatar_woz@2x.png"
},
{
"idiom" : "universal",
"scale" : "3x",
"filename" : "demo_avatar_woz@3x.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

View File

@ -1,84 +0,0 @@
{
"images" : [
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "736h",
"filename" : "jsq_messages_splash_55inch.png",
"minimum-system-version" : "8.0",
"orientation" : "portrait",
"scale" : "3x"
},
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "736h",
"filename" : "jsq_messages_splash_55inch_landscape.png",
"minimum-system-version" : "8.0",
"orientation" : "landscape",
"scale" : "3x"
},
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "667h",
"filename" : "jsq_messages_splash_47inch.png",
"minimum-system-version" : "8.0",
"orientation" : "portrait",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "iphone",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "splash_iphone35inch.png",
"scale" : "2x"
},
{
"extent" : "full-screen",
"idiom" : "iphone",
"subtype" : "retina4",
"filename" : "slpash_iphone4inch.png",
"minimum-system-version" : "7.0",
"orientation" : "portrait",
"scale" : "2x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "jsq_messages_splash_ipad.png",
"scale" : "1x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "jsq_messages_splash_ipad~landscape.png",
"scale" : "1x"
},
{
"orientation" : "portrait",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "jsq_messages_splash_ipad@2x.png",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "ipad",
"extent" : "full-screen",
"minimum-system-version" : "7.0",
"filename" : "jsq_messages_splash_ipad@2x~landscape.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,23 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x",
"filename" : "goldengate.png"
},
{
"idiom" : "universal",
"scale" : "2x",
"filename" : "goldengate@2x.png"
},
{
"idiom" : "universal",
"scale" : "3x",
"filename" : "goldengate@3x.png"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 196 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 651 KiB

View File

@ -1,47 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>6.1.1</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>6.1.1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

View File

@ -1,41 +0,0 @@
//
// 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
//
#import <Foundation/Foundation.h>
@interface NSUserDefaults (DemoSettings)
+ (void)saveExtraMessagesSetting:(BOOL)value;
+ (BOOL)extraMessagesSetting;
+ (void)saveLongMessageSetting:(BOOL)value;
+ (BOOL)longMessageSetting;
+ (void)saveEmptyMessagesSetting:(BOOL)value;
+ (BOOL)emptyMessagesSetting;
+ (void)saveSpringinessSetting:(BOOL)value;
+ (BOOL)springinessSetting;
+ (void)saveOutgoingAvatarSetting:(BOOL)value;
+ (BOOL)outgoingAvatarSetting;
+ (void)saveIncomingAvatarSetting:(BOOL)value;
+ (BOOL)incomingAvatarSetting;
@end

View File

@ -1,91 +0,0 @@
//
// 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
//
#import "NSUserDefaults+DemoSettings.h"
static NSString * const kSettingExtraMessages = @"kSettingExtraMessages";
static NSString * const kSettingLongMessage = @"kSettingLongMessage";
static NSString * const kSettingEmptyMessages = @"kSettingEmptyMessages";
static NSString * const kSettingSpringiness = @"kSettingSpringiness";
static NSString * const kSettingIncomingAvatar = @"kSettingIncomingAvatar";
static NSString * const kSettingOutgoingAvatar = @"kSettingOutgoingAvatar";
@implementation NSUserDefaults (DemoSettings)
+ (void)saveExtraMessagesSetting:(BOOL)value
{
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingExtraMessages];
}
+ (BOOL)extraMessagesSetting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingExtraMessages];
}
+ (void)saveLongMessageSetting:(BOOL)value
{
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingLongMessage];
}
+ (BOOL)longMessageSetting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingLongMessage];
}
+ (void)saveEmptyMessagesSetting:(BOOL)value
{
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingEmptyMessages];
}
+ (BOOL)emptyMessagesSetting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingEmptyMessages];
}
+ (void)saveSpringinessSetting:(BOOL)value
{
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingSpringiness];
}
+ (BOOL)springinessSetting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingSpringiness];
}
+ (void)saveOutgoingAvatarSetting:(BOOL)value
{
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingOutgoingAvatar];
}
+ (BOOL)outgoingAvatarSetting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingOutgoingAvatar];
}
+ (void)saveIncomingAvatarSetting:(BOOL)value
{
[[NSUserDefaults standardUserDefaults] setBool:value forKey:kSettingIncomingAvatar];
}
+ (BOOL)incomingAvatarSetting
{
return [[NSUserDefaults standardUserDefaults] boolForKey:kSettingIncomingAvatar];
}
@end

View File

@ -1,28 +0,0 @@
//
// 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
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "DemoMessagesViewController.h"
@interface TableViewController : UITableViewController <JSQDemoViewControllerDelegate>
- (IBAction)unwindSegue:(UIStoryboardSegue *)sender;
@end

View File

@ -1,171 +0,0 @@
//
// 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
//
#import "TableViewController.h"
@implementation TableViewController
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"JSQMessagesViewController";
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 2) {
return 1;
}
return 2;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
if (indexPath.section == 0) {
switch (indexPath.row) {
case 0:
cell.textLabel.text = @"Push via storyboard";
break;
case 1:
cell.textLabel.text = @"Push programmatically";
break;
}
}
else if (indexPath.section == 1) {
switch (indexPath.row) {
case 0:
cell.textLabel.text = @"Modal via storyboard";
break;
case 1:
cell.textLabel.text = @"Modal programmatically";
break;
}
}
else if (indexPath.section == 2) {
switch (indexPath.row) {
case 0:
cell.textLabel.text = @"Settings";
break;
}
}
return cell;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch (section) {
case 0:
return @"Presentation";
case 2:
return @"Demo options";
default:
return nil;
}
}
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
return (section == [tableView numberOfSections] - 1) ? @"Copyright © 2014\nJesse Squires\nMIT License" : nil;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
switch (indexPath.row) {
case 0:
[self performSegueWithIdentifier:@"seguePushDemoVC" sender:self];
break;
case 1:
{
DemoMessagesViewController *vc = [DemoMessagesViewController messagesViewController];
[self.navigationController pushViewController:vc animated:YES];
}
break;
}
}
else if (indexPath.section == 1) {
switch (indexPath.row) {
case 0:
[self performSegueWithIdentifier:@"segueModalDemoVC" sender:self];
break;
case 1:
{
DemoMessagesViewController *vc = [DemoMessagesViewController messagesViewController];
vc.delegateModal = self;
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:vc];
[self presentViewController:nc animated:YES completion:nil];
}
break;
}
}
else if (indexPath.section == 2) {
switch (indexPath.row) {
case 0:
[self performSegueWithIdentifier:@"SegueToSettings" sender:self];
break;
}
}
}
#pragma mark - Segues
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"segueModalDemoVC"]) {
UINavigationController *nc = segue.destinationViewController;
DemoMessagesViewController *vc = (DemoMessagesViewController *)nc.topViewController;
vc.delegateModal = self;
}
}
- (IBAction)unwindSegue:(UIStoryboardSegue *)sender { }
#pragma mark - Demo delegate
- (void)didDismissJSQDemoViewController:(DemoMessagesViewController *)vc
{
[self dismissViewControllerAnimated:YES completion:nil];
}
@end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,28 +0,0 @@
//
// 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
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}

View File

@ -1,40 +0,0 @@
//
// 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 "NSString+JSQMessages.h"
@interface JSQMessagesNSStringTests : XCTestCase
@end
@implementation JSQMessagesNSStringTests
- (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");
XCTAssertEqualObjects(loremIpsum, [string3 jsq_stringByTrimingWhitespace], @"Strings should be equal after trimming whitespace");
}
@end

View File

@ -1,61 +0,0 @@
//
// 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 "UIColor+JSQMessages.h"
@interface JSQMessagesUIColorTests : XCTestCase
@end
@implementation JSQMessagesUIColorTests
- (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");
XCTAssertEqual(da, a, @"Alpha values should be equal");
}
- (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");
XCTAssertEqual(dg, 0.0f, @"Green values should be floored to zero");
XCTAssertEqual(db, b - darkeningValue, @"Blue values should be equal");
XCTAssertEqual(da, a, @"Alpha values should be equal");
}
@end

View File

@ -1,67 +0,0 @@
//
// 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 "UIImage+JSQMessages.h"
@interface JSQMessagesUIImageTests : XCTestCase
@end
@implementation JSQMessagesUIImageTests
- (void)testImageMasking
{
// 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");
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

@ -1,59 +0,0 @@
//
// 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 "UIView+JSQMessages.h"
@interface JSQMessagesUIViewTests : XCTestCase
@end
@implementation JSQMessagesUIViewTests
- (void)testViewAutoLayoutPinEdges
{
// GIVEN: a superview and subview
UIView *superview = [[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");
XCTAssertEqual([[subview constraints] count], 0U, @"Subview should have 0 constraints");
for (NSLayoutConstraint *eachConstraint in [superview constraints]) {
XCTAssertEqualObjects(eachConstraint.firstItem, superview, @"Constraint first item should be equal to superview");
XCTAssertEqualObjects(eachConstraint.secondItem, subview, @"Constraint second item should be equal to subview");
XCTAssertEqual(eachConstraint.relation, NSLayoutRelationEqual, @"Constraint relation should be NSLayoutRelationEqual");
XCTAssertEqual(eachConstraint.multiplier, 1.0f, @"Constraint multiplier should be 1.0");
XCTAssertEqual(eachConstraint.constant, 0.0f, @"Constraint constant should be 0.0");
}
}
@end

View File

@ -1,46 +0,0 @@
//
// 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 "JSQMessagesKeyboardController.h"
@interface JSQMessagesKeyboardControllerTests : XCTestCase
@end
@implementation JSQMessagesKeyboardControllerTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testKeyboardControllerInit
{
JSQMessagesKeyboardController *keyboardController = [[JSQMessagesKeyboardController alloc] initWithTextView:[UITextView new]
contextView:[UIView new]
panGestureRecognizer:[UIPanGestureRecognizer new]
delegate:nil];
XCTAssertNotNil(keyboardController, @"Keyboard controller should not be nil");
XCTAssertThrows([[JSQMessagesKeyboardController alloc] initWithTextView:nil
contextView:nil
panGestureRecognizer:nil
delegate:nil], @"Invalid init should throw");
}
@end

View File

@ -1,103 +0,0 @@
//
// 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 <OCMock/OCMock.h>
#import "JSQMessagesViewController.h"
#import "DemoMessagesViewController.h"
@interface JSQMessagesViewController ()
- (void)jsq_configureMessagesViewController;
@end
@interface JSQMessagesViewControllerTests : XCTestCase
@end
@implementation JSQMessagesViewControllerTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testJSQMessagesViewControllerInit
{
UINib *nib = [JSQMessagesViewController nib];
XCTAssertNotNil(nib, @"Nib should not be nil");
JSQMessagesViewController *vc = [JSQMessagesViewController messagesViewController];
[vc view];
XCTAssertNotNil(vc, @"View controller should not be nil");
XCTAssertNotNil(vc.view, @"View should not be nil");
XCTAssertNotNil(vc.collectionView, @"Collection view should not be nil");
XCTAssertNotNil(vc.inputToolbar, @"Input toolbar should not be nil");
XCTAssertEqualObjects(vc.senderId, @"JSQDefaultSender", @"Property should be equal to default value");
XCTAssertEqualObjects(vc.senderDisplayName, @"JSQDefaultSender", @"Property should be equal to default value");
XCTAssertEqual(vc.automaticallyAdjustsScrollViewInsets, YES, @"Property should be equal to default value");
XCTAssertEqualObjects(vc.incomingCellIdentifier, [JSQMessagesCollectionViewCellIncoming cellReuseIdentifier], @"Property should be equal to default value");
XCTAssertEqualObjects(vc.outgoingCellIdentifier, [JSQMessagesCollectionViewCellOutgoing cellReuseIdentifier], @"Property should be equal to default value");
XCTAssertEqual(vc.showTypingIndicator, NO, @"Property should be equal to default value");
XCTAssertEqual(vc.showLoadEarlierMessagesHeader, NO, @"Property should be equal to default value");
}
- (void)testJSQMessagesViewControllerSubclassInitProgramatically
{
DemoMessagesViewController *demoVC = [DemoMessagesViewController messagesViewController];
[demoVC view];
XCTAssertNotNil(demoVC, @"View controller should not be nil");
XCTAssertTrue([demoVC isKindOfClass:[DemoMessagesViewController class]], @"View controller should be kind of class: %@", [DemoMessagesViewController class]);
XCTAssertNotNil(demoVC.view, @"View should not be nil");
XCTAssertNotNil(demoVC.collectionView, @"Collection view should not be nil");
XCTAssertNotNil(demoVC.inputToolbar, @"Input toolbar should not be nil");
}
- (void)testJSQMessagesViewControllerSubclassInitStoryboards
{
UIStoryboard *mainSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
XCTAssertNotNil(mainSB, @"Storyboard should not be nil");
DemoMessagesViewController *demoVC = [mainSB instantiateViewControllerWithIdentifier:@"DemoVC"];
[demoVC view];
XCTAssertNotNil(demoVC, @"View controller should not be nil");
XCTAssertTrue([demoVC isKindOfClass:[DemoMessagesViewController class]], @"View controller should be kind of class: %@", [DemoMessagesViewController class]);
XCTAssertNotNil(demoVC.view, @"View should not be nil");
XCTAssertNotNil(demoVC.collectionView, @"Collection view should not be nil");
XCTAssertNotNil(demoVC.inputToolbar, @"Input toolbar should not be nil");
}
- (void)testViewConfiguration
{
JSQMessagesViewController *vc = [JSQMessagesViewController messagesViewController];
id mockVC = [OCMockObject partialMockForObject:vc];
[[mockVC expect] jsq_configureMessagesViewController];
[vc view];
[mockVC verify];
}
@end

View File

@ -1,73 +0,0 @@
//
// 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 "JSQMessagesAvatarImageFactory.h"
@interface JSQMessagesAvatarImageFactoryTests : XCTestCase
@end
@implementation JSQMessagesAvatarImageFactoryTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testAvatarImage
{
UIImage *image = [UIImage imageNamed:@"demo_avatar_jobs"];
XCTAssertNotNil(image, @"Image should not be nil");
CGFloat diameter = 50.0f;
JSQMessagesAvatarImage *avatar = [JSQMessagesAvatarImageFactory avatarImageWithPlaceholder:image diameter:diameter];
XCTAssertNotNil(avatar, @"Avatar should not be nil");
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarPlaceholderImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
XCTAssertEqual(avatar.avatarPlaceholderImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
avatar.avatarImage = [JSQMessagesAvatarImageFactory circularAvatarImage:image withDiameter:diameter];
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
XCTAssertEqual(avatar.avatarImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
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
{
CGFloat diameter = 50.0f;
JSQMessagesAvatarImage *avatar = [JSQMessagesAvatarImageFactory avatarImageWithUserInitials:@"JSQ"
backgroundColor:[UIColor lightGrayColor]
textColor:[UIColor darkGrayColor]
font:[UIFont systemFontOfSize:13.0f]
diameter:diameter];
XCTAssertNotNil(avatar, @"Avatar should not be nil");
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
XCTAssertEqual(avatar.avatarImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
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");
XCTAssertTrue(CGSizeEqualToSize(avatar.avatarPlaceholderImage.size, CGSizeMake(diameter, diameter)), @"Avatar size should be equal to diameter");
XCTAssertEqual(avatar.avatarPlaceholderImage.scale, [UIScreen mainScreen].scale, @"Avatar scale should be equal to screen scale");
}
@end

View File

@ -1,135 +0,0 @@
//
// 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 "JSQMessagesBubbleImageFactory.h"
#import "UIImage+JSQMessages.h"
@interface JSQMessagesBubbleImageFactoryTests : XCTestCase
@property (strong, nonatomic) JSQMessagesBubbleImageFactory *factory;
@end
@implementation JSQMessagesBubbleImageFactoryTests
- (void)setUp
{
[super setUp];
self.factory = [[JSQMessagesBubbleImageFactory alloc] init];
}
- (void)tearDown
{
self.factory = nil;
[super tearDown];
}
- (void)testOutgoingMessageBubbleImageView
{
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);
UIEdgeInsets capInsets = UIEdgeInsetsMake(center.y, center.x, center.y, center.x);
JSQMessagesBubbleImage *bubbleImage = [self.factory outgoingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, bubble.imageOrientation, @"Image orientation should equal bubble image orientation");
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, bubble.imageOrientation, @"HighlightedImage orientation should equal bubble image orientation");
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
}
- (void)testIncomingMessageBubbleImageView
{
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);
UIEdgeInsets capInsets = UIEdgeInsetsMake(center.y, center.x, center.y, center.x);
JSQMessagesBubbleImage *bubbleImage = [self.factory incomingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
}
- (void)testCustomOutgoingMessageBubbleImageView
{
UIImage *bubble = [UIImage jsq_bubbleRegularStrokedTaillessImage];
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
UIEdgeInsets capInsets = UIEdgeInsetsMake(1, 1, 1, 1);
JSQMessagesBubbleImageFactory *factory = [[JSQMessagesBubbleImageFactory alloc] initWithBubbleImage:bubble capInsets:capInsets];
JSQMessagesBubbleImage *bubbleImage = [factory outgoingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, bubble.imageOrientation, @"Image orientation should equal bubble image orientation");
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, bubble.imageOrientation, @"HighlightedImage orientation should equal bubble image orientation");
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
}
- (void)testCustomIncomingMessageBubbleImageView
{
UIImage *bubble = [UIImage jsq_bubbleRegularStrokedTaillessImage];
XCTAssertNotNil(bubble, @"Bubble image should not be nil");
UIEdgeInsets capInsets = UIEdgeInsetsMake(1, 1, 1, 1);
JSQMessagesBubbleImageFactory *factory = [[JSQMessagesBubbleImageFactory alloc] initWithBubbleImage:bubble capInsets:capInsets];
JSQMessagesBubbleImage *bubbleImage = [factory incomingMessagesBubbleImageWithColor:[UIColor lightGrayColor]];
XCTAssertNotNil(bubbleImage, @"Bubble image should not be nil");
XCTAssertNotNil(bubbleImage.messageBubbleImage, "Image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleImage.scale, bubble.scale, @"Image scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
XCTAssertTrue(bubbleImage.messageBubbleImage.resizingMode == UIImageResizingModeStretch, @"Image should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleImage.capInsets, capInsets), @"Image capInsets should be equal to capInsets");
XCTAssertNotNil(bubbleImage.messageBubbleHighlightedImage, @"Highlighted image should not be nil");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.scale, bubble.scale, @"HighlightedImage scale should equal bubble image scale");
XCTAssertEqual(bubbleImage.messageBubbleHighlightedImage.imageOrientation, UIImageOrientationUpMirrored, @"Image orientation should be flipped");
XCTAssertTrue(bubbleImage.messageBubbleHighlightedImage.resizingMode == UIImageResizingModeStretch, @"HighlightedImage should be stretchable");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(bubbleImage.messageBubbleHighlightedImage.capInsets, capInsets), @"HighlightedImage capInsets should be equal to capInsets");
}
@end

View File

@ -1,37 +0,0 @@
//
// 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

@ -1,104 +0,0 @@
//
// 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 "JSQMessagesTimestampFormatter.h"
@interface JSQMessagesTimestampFormatterTests : XCTestCase
@end
@implementation JSQMessagesTimestampFormatterTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testTimestampFormatterInit
{
JSQMessagesTimestampFormatter *formatter = [JSQMessagesTimestampFormatter sharedFormatter];
XCTAssertNotNil(formatter, @"Formatter should not be nil");
XCTAssertEqualObjects(formatter, [JSQMessagesTimestampFormatter sharedFormatter], @"Shared formatter should return the same instance");
UIColor *color = [UIColor lightGrayColor];
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.alignment = NSTextAlignmentCenter;
NSDictionary *dateAttrs = @{ NSFontAttributeName : [UIFont boldSystemFontOfSize:12.0f],
NSForegroundColorAttributeName : color,
NSParagraphStyleAttributeName : paragraphStyle };
NSDictionary *timeAttrs = @{ NSFontAttributeName : [UIFont systemFontOfSize:12.0f],
NSForegroundColorAttributeName : color,
NSParagraphStyleAttributeName : paragraphStyle };
XCTAssertEqualObjects(formatter.dateTextAttributes, dateAttrs, @"Date attributes should be equal to default values");
XCTAssertEqualObjects(formatter.timeTextAttributes, timeAttrs, @"Time attributes should be equal to default values");
XCTAssertNotNil(formatter.dateFormatter, @"Property should not be nil");
}
- (void)testTimestampForDate
{
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setCalendar:[NSCalendar currentCalendar]];
[components setYear:2013];
[components setMonth:6];
[components setDay:6];
[components setHour:19];
[components setMinute:6];
[components setSecond:0];
NSDate *date = [components date];
NSString *timestampString = [[JSQMessagesTimestampFormatter sharedFormatter] timestampForDate:date];
XCTAssertEqualObjects(timestampString, @"Jun 6, 2013, 7:06 PM", @"Timestamp string should return expected value");
NSAttributedString *timestampAttributedString = [[JSQMessagesTimestampFormatter sharedFormatter] attributedTimestampForDate:date];
XCTAssertEqualObjects([timestampAttributedString string], @"Jun 6, 2013 7:06 PM", @"Attributed timestamp string should return expected value");
}
- (void)testTimeForDate
{
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setCalendar:[NSCalendar currentCalendar]];
[components setHour:7];
[components setMinute:6];
[components setSecond:0];
NSDate *date = [components date];
NSString *timeForDateString = [[JSQMessagesTimestampFormatter sharedFormatter] timeForDate:date];
XCTAssertEqualObjects(timeForDateString, @"7:06 AM", @"Time string should return expected value");
}
- (void)testRelativeDataForDate
{
NSDate *date = [NSDate date];
NSString *relativeDateString = [[JSQMessagesTimestampFormatter sharedFormatter] relativeDateForDate:date];
XCTAssertEqualObjects(relativeDateString, @"Today", @"Relative date string shoudl return expected value");
}
@end

View File

@ -1,37 +0,0 @@
//
// 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 "JSQMessagesToolbarButtonFactory.h"
#import "UIColor+JSQMessages.h"
@interface JSQMessagesToolbarButtonFactoryTests : XCTestCase
@end
@implementation JSQMessagesToolbarButtonFactoryTests
- (void)testDefaultSendButtonItem
{
UIButton *button = [JSQMessagesToolbarButtonFactory defaultSendButtonItem];
XCTAssertNotNil(button, @"Button should not be nil");
}
- (void)testDefaultAccessoryButtonItem
{
UIButton *button = [JSQMessagesToolbarButtonFactory defaultAccessoryButtonItem];
XCTAssertNotNil(button, @"Button should not be nil");
}
@end

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>com.hexedbits.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
</dict>
</plist>

View File

@ -1,38 +0,0 @@
//
// 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 "JSQMessagesCollectionViewFlowLayout.h"
@interface JSQMessagesCollectionViewFlowLayoutTests : XCTestCase
@end
@implementation JSQMessagesCollectionViewFlowLayoutTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testFlowLayoutInit
{
JSQMessagesCollectionViewFlowLayout *layout = [[JSQMessagesCollectionViewFlowLayout alloc] init];
XCTAssertNotNil(layout, @"Layout should not be nil");
}
@end

View File

@ -1,52 +0,0 @@
//
// 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 "JSQMessagesCollectionViewLayoutAttributes.h"
@interface JSQMessagesCollectionViewLayoutAttributesTests : XCTestCase
@end
@implementation JSQMessagesCollectionViewLayoutAttributesTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testLayoutAttributesInitAndIsEqual
{
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];
JSQMessagesCollectionViewLayoutAttributes *attrs = [JSQMessagesCollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attrs.messageBubbleFont = [UIFont systemFontOfSize:15.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);
attrs.outgoingAvatarViewSize = CGSizeZero;
attrs.cellTopLabelHeight = 20.0f;
attrs.messageBubbleTopLabelHeight = 10.0f;
attrs.cellBottomLabelHeight = 15.0f;
XCTAssertNotNil(attrs, @"Layout attributes should not be nil");
JSQMessagesCollectionViewLayoutAttributes *copy = [attrs copy];
XCTAssertEqualObjects(attrs, copy, @"Copied attributes should be equal");
XCTAssertEqual([attrs hash], [copy hash], @"Copied attributes hashes should be equal");
}
@end

View File

@ -1,64 +0,0 @@
//
// 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

@ -1,112 +0,0 @@
//
// 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 <OCMock/OCMock.h>
#import "JSQMessage.h"
// Fake media object for testing
@interface FakeMedia : NSObject <JSQMessageMediaData, NSCoding>
@end
@implementation FakeMedia
- (UIView *)mediaView { return [UIView new]; }
- (UIView *)mediaPlaceholderView { return [self mediaView]; }
- (CGSize)mediaViewDisplaySize { return CGSizeMake(50, 50); }
- (void)encodeWithCoder:(NSCoder *)aCoder { }
- (id)initWithCoder:(NSCoder *)aDecoder { return [self init]; }
- (BOOL)isEqual:(id)object { return YES; }
@end
@interface JSQMessageMediaTests : XCTestCase
@property (strong, nonatomic) NSString *senderId;
@property (strong, nonatomic) NSString *senderDisplayName;
@property (strong, nonatomic) NSDate *date;
@property (strong, nonatomic) id<JSQMessageMediaData> mockMediaData;
@end
@implementation JSQMessageMediaTests
- (void)setUp
{
[super setUp];
self.senderId = @"324543-43556-212343";
self.senderDisplayName = @"Jesse Squires";
self.date = [NSDate date];
self.mockMediaData = [OCMockObject mockForProtocol:@protocol(JSQMessageMediaData)];
}
- (void)tearDown
{
self.senderId = nil;
self.senderDisplayName = nil;
self.date = nil;
self.mockMediaData = nil;
[super tearDown];
}
- (void)testMediaMessageInit
{
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:self.mockMediaData];
XCTAssertNotNil(msg, @"Message should not be nil");
}
- (void)testMediaMessageInvalidInit
{
XCTAssertThrows([[JSQMessage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil media:nil], @"Invalid init should throw");
}
- (void)testMediaMessageIsEqual
{
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, msg, @"Messages should be equal to itself");
}
- (void)testMediaMessageArchiving
{
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
media:[FakeMedia new]];
NSData *msgData = [NSKeyedArchiver archivedDataWithRootObject:msg];
JSQMessage *unarchivedMsg = [NSKeyedUnarchiver unarchiveObjectWithData:msgData];
XCTAssertEqualObjects(msg, unarchivedMsg, @"Message should be equal");
}
@end

View File

@ -1,95 +0,0 @@
//
// 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 "JSQMessage.h"
@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 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
{
self.senderId = nil;
self.senderDisplayName = nil;
self.date = nil;
self.text = nil;
[super tearDown];
}
#pragma mark - Text messages
- (void)testTextMessageInit
{
JSQMessage *msg = [[JSQMessage alloc] initWithSenderId:self.senderId
senderDisplayName:self.senderDisplayName
date:self.date
text:self.text];
XCTAssertNotNil(msg, @"Message should not be nil");
}
- (void)testTextMessageInvalidInit
{
XCTAssertThrows([[JSQMessage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQMessage alloc] initWithSenderId:nil senderDisplayName:nil date:nil text:nil], @"Invalid init should throw");
}
- (void)testTextMessageIsEqual
{
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, msg, @"Messages should be equal to itself");
}
- (void)testTextMessageArchiving
{
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];
XCTAssertEqualObjects(msg, unarchivedMsg, @"Message should be equal");
}
@end

View File

@ -1,75 +0,0 @@
//
// 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 "JSQMessagesAvatarImage.h"
@interface JSQMessagesAvatarImageTests : XCTestCase
@end
@implementation JSQMessagesAvatarImageTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testInitInvalid
{
XCTAssertThrows([[JSQMessagesAvatarImage alloc] init], @"Invalid init should throw");
XCTAssertThrows([JSQMessagesAvatarImage avatarImageWithPlaceholder:nil], @"Invalid init should throw");
XCTAssertThrows([[JSQMessagesAvatarImage alloc] initWithAvatarImage:nil highlightedImage:nil placeholderImage:nil], @"Invalid init should throw");
}
- (void)testInitValid
{
UIImage *mockImage = [UIImage imageNamed:@"demo_avatar_jobs"];
JSQMessagesAvatarImage *avatar = [JSQMessagesAvatarImage avatarImageWithPlaceholder:mockImage];
XCTAssertNotNil(avatar, @"Valid init should succeed");
JSQMessagesAvatarImage *avatar2 = [JSQMessagesAvatarImage avatarWithImage:mockImage];
XCTAssertNotNil(avatar2, @"Valid init should succeed");
XCTAssertEqualObjects(avatar2.avatarImage, avatar2.avatarHighlightedImage);
XCTAssertEqualObjects(avatar2.avatarHighlightedImage, avatar2.avatarPlaceholderImage);
}
- (void)testCopy
{
UIImage *mockImage = [UIImage imageNamed:@"demo_avatar_jobs"];
JSQMessagesAvatarImage *avatar = [[JSQMessagesAvatarImage alloc] initWithAvatarImage:mockImage
highlightedImage:mockImage
placeholderImage:mockImage];
JSQMessagesAvatarImage *copy = [avatar copy];
XCTAssertNotNil(copy, @"Copy should succeed");
XCTAssertFalse(avatar == copy, @"Copy should return new, distinct instance");
XCTAssertNotEqualObjects(avatar.avatarImage, copy.avatarImage, @"Images should not be equal");
XCTAssertNotEqual(avatar.avatarImage, copy.avatarImage, @"Images should not be equal");
XCTAssertNotEqualObjects(avatar.avatarHighlightedImage, copy.avatarHighlightedImage, @"Images should not be equal");
XCTAssertNotEqual(avatar.avatarHighlightedImage, copy.avatarHighlightedImage, @"Images should not be equal");
XCTAssertNotEqualObjects(avatar.avatarPlaceholderImage, copy.avatarPlaceholderImage, @"Images should not be equal");
XCTAssertNotEqual(avatar.avatarPlaceholderImage, copy.avatarPlaceholderImage, @"Images should not be equal");
}
@end

View File

@ -1,65 +0,0 @@
//
// 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 "JSQMessagesBubbleImage.h"
#import "UIImage+JSQMessages.h"
@interface JSQMessagesBubbleImageTests : XCTestCase
@end
@implementation JSQMessagesBubbleImageTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testInitInvalid
{
XCTAssertThrows([[JSQMessagesBubbleImage alloc] init], @"Invalid init should throw");
XCTAssertThrows([[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:nil highlightedImage:nil], @"Invalid init should throw");
}
- (void)testInitValid
{
UIImage *mockImage = [UIImage jsq_bubbleCompactImage];
JSQMessagesBubbleImage *bubbleImage = [[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:mockImage highlightedImage:mockImage];
XCTAssertNotNil(bubbleImage, @"Valid init should succeed");
}
- (void)testCopy
{
UIImage *mockImage = [UIImage jsq_bubbleCompactImage];
JSQMessagesBubbleImage *bubbleImage = [[JSQMessagesBubbleImage alloc] initWithMessageBubbleImage:mockImage highlightedImage:mockImage];
JSQMessagesBubbleImage *copy = [bubbleImage copy];
XCTAssertNotNil(copy, @"Copy should succeed");
XCTAssertFalse(bubbleImage == copy, @"Copy should return new, distinct instance");
XCTAssertNotEqualObjects(bubbleImage.messageBubbleImage, copy.messageBubbleImage, @"Images should not be equal");
XCTAssertNotEqual(bubbleImage.messageBubbleImage, copy.messageBubbleImage, @"Images should not be equal");
XCTAssertNotEqualObjects(bubbleImage.messageBubbleHighlightedImage, copy.messageBubbleHighlightedImage, @"Images should not be equal");
XCTAssertNotEqual(bubbleImage.messageBubbleHighlightedImage, copy.messageBubbleHighlightedImage, @"Images should not be equal");
}
@end

View File

@ -1,76 +0,0 @@
//
// 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,77 +0,0 @@
//
// 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

@ -1,53 +0,0 @@
//
// 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 "JSQMessagesCollectionViewCellIncoming.h"
#import "JSQMessagesCollectionViewCellOutgoing.h"
@interface JSQMessagesCollectionViewCellTests : XCTestCase
@end
@implementation JSQMessagesCollectionViewCellTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testMessagesIncomingCollectionViewCellInit
{
UINib *incomingCell = [JSQMessagesCollectionViewCellIncoming nib];
XCTAssertNotNil(incomingCell, @"Nib should not be nil");
NSString *incomingCellId = [JSQMessagesCollectionViewCellIncoming cellReuseIdentifier];
XCTAssertNotNil(incomingCellId, @"Cell identifier should not be nil");
XCTAssertEqualObjects(incomingCellId, NSStringFromClass([JSQMessagesCollectionViewCellIncoming class]));
}
- (void)testMessagesOutgoingCollectionViewCellInit
{
UINib *outgoingCell = [JSQMessagesCollectionViewCellOutgoing nib];
XCTAssertNotNil(outgoingCell, @"Nib should not be nil");
NSString *outgoingCellId = [JSQMessagesCollectionViewCellOutgoing cellReuseIdentifier];
XCTAssertNotNil(outgoingCellId, @"Cell identifier should not be nil");
XCTAssertEqualObjects(outgoingCellId, NSStringFromClass([JSQMessagesCollectionViewCellOutgoing class]));
}
@end

View File

@ -1,47 +0,0 @@
//
// 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 "JSQMessagesCollectionView.h"
#import "JSQMessagesCollectionViewFlowLayout.h"
@interface JSQMessagesCollectionViewTests : XCTestCase
@end
@implementation JSQMessagesCollectionViewTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testCollectionViewInit
{
JSQMessagesCollectionViewFlowLayout *layout = [[JSQMessagesCollectionViewFlowLayout alloc] init];
JSQMessagesCollectionView *view = [[JSQMessagesCollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds
collectionViewLayout:layout];
XCTAssertNotNil(view, @"Collection view should not be nil");
XCTAssertEqualObjects(view.backgroundColor, [UIColor whiteColor], @"Property should be equal to default value");
XCTAssertEqual(view.keyboardDismissMode, UIScrollViewKeyboardDismissModeInteractive, @"Property should be equal to default value");
XCTAssertEqual(view.alwaysBounceVertical, YES, @"Property should be equal to default value");
XCTAssertEqual(view.bounces, YES, @"Property should be equal to default value");
}
@end

View File

@ -1,70 +0,0 @@
//
// 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 "JSQMessagesComposerTextView.h"
@interface JSQMessagesComposerTextViewTests : XCTestCase
@property (strong, nonatomic) JSQMessagesComposerTextView *textView;
@end
@implementation JSQMessagesComposerTextViewTests
- (void)setUp
{
[super setUp];
self.textView = [[JSQMessagesComposerTextView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 50.0f)
textContainer:[NSTextContainer new]];
}
- (void)tearDown
{
self.textView = nil;
[super tearDown];
}
- (void)testComposerTextViewInit
{
XCTAssertNotNil(self.textView, @"Text view should not be nil");
XCTAssertNil(self.textView.text, @"Property should be equal to default value");
XCTAssertNil(self.textView.placeHolder, @"Property should be equal to default value");
XCTAssertEqualObjects(self.textView.placeHolderTextColor, [UIColor lightGrayColor], @"Property should be equal to default value");
XCTAssertEqualObjects(self.textView.backgroundColor, [UIColor whiteColor], @"Property should be equal to default value");
XCTAssertEqual(self.textView.layer.borderWidth, 0.5f, @"Property should be equal to default value");
XCTAssertEqual(self.textView.layer.borderColor, [UIColor lightGrayColor].CGColor, @"Property should be equal to default value");
XCTAssertEqual(self.textView.layer.cornerRadius, 6.0f, @"Property should be equal to default value");
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(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");
XCTAssertEqual(self.textView.userInteractionEnabled, YES, @"Property should be equal to default value");
XCTAssertEqual(self.textView.contentMode, UIViewContentModeRedraw, @"Property should be equal to default value");
XCTAssertEqual(self.textView.dataDetectorTypes, UIDataDetectorTypeNone, @"Property should be equal to default value");
XCTAssertEqual(self.textView.keyboardAppearance, UIKeyboardAppearanceDefault, @"Property should be equal to default value");
XCTAssertEqual(self.textView.keyboardType, UIKeyboardTypeDefault, @"Property should be equal to default value");
XCTAssertEqual(self.textView.returnKeyType, UIReturnKeyDefault, @"Property should be equal to default value");
}
@end

View File

@ -1,44 +0,0 @@
//
// 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 "JSQMessagesViewController.h"
#import "JSQMessagesInputToolbar.h"
@interface JSQMessagesInputToolbarTests : XCTestCase
@end
@implementation JSQMessagesInputToolbarTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testInputToolbarInit
{
JSQMessagesViewController *vc = [JSQMessagesViewController messagesViewController];
[vc loadView];
JSQMessagesInputToolbar *toolbar = vc.inputToolbar;
XCTAssertNotNil(toolbar, @"Toolbar should not be nil");
XCTAssertNotNil(toolbar.contentView, @"Toolbar content view should not be nil");
XCTAssertEqual(toolbar.sendButtonOnRight, YES, @"Property should be equal to default value");
}
@end

View File

@ -1,39 +0,0 @@
//
// 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 "JSQMessagesLabel.h"
@interface JSQMessagesLabelTests : XCTestCase
@end
@implementation JSQMessagesLabelTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)testMessagesLabelInit
{
JSQMessagesLabel *label = [[JSQMessagesLabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 200.0f, 40.0f)];
XCTAssertNotNil(label, @"Label should not be nil");
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets(label.textInsets, UIEdgeInsetsZero), @"Property should be equal to default value");
}
@end

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