* Ensure all controls visible at all times, on all form factors, even with keyboard active.
* Improve focus (i.e. auto-focus textfield on arrival and after errors).
* Move to programmatic view creation and layout.
* Improve spacing and sizing.
* Replace “change number” button with “back” button.
* Submit code with return key.
* Improve copy for clarity.
// FREEBIE
More fallout from the outbound call timeout which was causing all
CallKit calls not promptly answered to show "Call Failed"
Inserting the timeout exacerbated an existing issue: We can't wait for
long before choosing to fulfill/fail an action without CallKit falling
over and assuming the call failed.
We don't actually need to consider the case where we "fail to initiate"
the outgoing call. Instead we say it started "successfully, and if there
is an error, the existing promise error handling will fail the call at
that time.
// FREEBIE
- Previously only incoming calls had their timeout promise fulfilled
- Previously we'd stop the timeout once ringing started, but we
should continue the timeout clock until the users are speaking.
// FREEBIE
A couple of weird things left after the CallInitiator refactor:
removed unused segue
confusingly, call direction was *always* incoming, even for outgoing
calls. But we weren't using it anyway.
// FREEBIE
Previous logic assumed "VoiceChat" mode, but when the ringer goes off,
we set "SoloAmbient" which is incompatible with that mode, causing
assertion failure.
// FREEBIE
* Add "search by phone number" to "no contacts" mode.
* Coordinate "invite flow", "invite by SMS" and "new conversation with non-contact" to ensure only one (at most) is shown.
* Show "new conversation with non-contact" IFF phone number is known to correspond to a signal account.
// FREEBIE
Initially we were using AppAudioManager in our WebRTC calling
implementation to manage call related audio, but our differences from
how redphone uses the AppAudioManager diverged too much, so instead
we're instead using CallAudioManager.
reverting these changes lest we inadvertently break something re:
RedPhone.
// FREEBIE
* More space for non-callkit incoming call buttons
The "decline" and "accept" were too close together. Added a spacer, the
same size as an extra button between the two.
* Tweak spacing in call view rows.
// FREEBIE
consolidated feature-disable logic for incoming/outgoing calls to make
it easier to document, and less likely to break when we *do* implement
CallHolding
// FREEBIE
- Alice calls Bob on Signal and they start talking
- Charlie calls Alice on Not-Signal.
- Alice chooses to "Hold & Accept" putting Bob on Hold while the call with
Charlie connects.
- If Alice ends the call with Charlie, we're back in Signal-iOS and
talking to Bob, no problem.
- However, if, before ending the call with Charlie, Alice tries to swap
*back* to bob, bob won't hear any audio in the callkit screen. Alice
has to switch back to the Signal screen before the audio is transmitted.
// FREEBIE
Marking Signal-Call as started, changes the incoming call screen for
subsequent calls to show "Accept & End", "Send to VoiceMail" and "Accept
& Hold" instead of just "Accept" & "Decline"
Though - we don't support Holding. What we really want to see is just
"Accept & End" and "Decline | Send to Voicemail"
// FREEBIE
This slows the UI, but only for people who have locally opted into
WebRTC calls, and the alternative is that users are likely to have stale
settings the first time a pair of people opt-in.
// FREEBIE
Distinguish between localHangup, remoteHangup, and call failure.
This allows us to put CallKit in the proper state, ready to receive new
calls without having a backlog of phantom calls which haven't been
properly removed.
Note the "call error" occurs at the point ICE fails, which takes a
while. Anecdotally, like 10 seconds, which feels like a long to be
talking into the ether.
I briefly considered failing at 'disconnected', which happens much
sooner, but that's actually a recoverable state. E.g. if you toggle
airplane mode you can see that you bounce into `disconnected` and then
back to `connected`, so I don't think we'd want to fail the call as long
as WebRTC considers it "recoverable".
// FREEBIE
The removed code was from an older eon. CallService shouldn't be touched
except via the CallUIAdapter since only there is the omnipresent
distinction between CallKit vs. NonCallKit made.
i.e. when the RTCAudioSession get's started depends on the
CallUIAdaptee.
// FREEBIE
TODO: this is going to be weird when two parties are *just* enabling
webrtc for the first time. We might want to do something as drastic as
refetch contact information before completing the call.
// FREEBIE
coordinate SignalProtocol encryption/decryption on a single serial
queue. Previously message sending encrypted on the sending thread, while
message receiving decrypted on the main thread.
// FREEBIE
...in response to CR, move the AudioService off of the CallViewController
Adopt multiple observer pattern vs. a singular delegate. Doing so
required implementing some machinery to address the ARC (see:
Weak.swift)
// FREEBIE
Implement speakerphone toggle directly. Previously we were using
AppAudioManager for several things, but this is that last lingering bit.
Much of the AppAudioManager code is based on RedPhone calling, so by
removing the dependency we pave the way to throw that code away.
// FREEBIE
8 Cases considered:
(Silent Switch toggled vs. Silent Switch not-toggled)
x (App in Foreground vs. App in Background)
x (CallKit vs. NonCallKit)
CallKit already does the "right thing"
// FREEBIE
There isn't much the user can do in response to it, and the user will
get a subsequent "new message" notification when the fallback push
triggers.
// FREEBIE
Because logging-preference was previously stored on the storageManager
this meant we couldn't possible log anything related to the init'ing the
storage manager.
TODO: migrate old logging preference to use the new NSUserDefaults
setting
// FREEBIE
Most likely this would be because the user hasn't unlocked their device
since last restart.
This behavior existed once before, but the startup ordering is pretty
delicate. So, we're now redundantly checking in SSK in case this
delicate startup logic gets mis-ordered again.
Also fixed the AppDelegate method to check for the proper
applicationState, since it will never be "active" in didFinishLaunching.
fixes https://github.com/WhisperSystems/Signal-iOS/issues/1627
// FREEBIE
We do this by manually managing the RTCAudioSession.
Unfortunately to do this we have to include a couple of RTC headers not
exported by the default build of WebRTC.framework (see: Libraries/WebRTC)
// FREEBIE
This makes sense as PeerConnectionClient is our interface to WebRTC
- Makes it easier to test PeerConnectionClient and CallService
- Allows us to shrink CallService class a bit (it's huge)
// FREEBIE
This is an effort to better define boundaries and simplify
relationships.
This also fixes a theoretical problem where CallKit was showing the in-app
call screen before the call was successfully answered, now we wait until
the action is fulfilled.
// FREEBIE
In the process, extracted the CallDelegate to allow the
CAllViewController to observe useful call state properties (call.state
and call.isMuted)
// FREEBIE
* Ensure NotificationsManager has dependencies
Otherwise it's easy to mess up the order of the required dependencies.
* move AccountManager into Environment, it's heavy to construct
// FREEBIE
* Add generated Signal-Swift.h to test search header path. You must do
this when testing an ObjC clas with swift dependencies (PushManager. in this case)
* Word on the street is that XCode8.2 is less flaky for running simulator tests
// FREEBIE
* show better errors if it *does* happen.
If someone tries to send from their old device, they'll see a
depressing, but sensible warning message.
* new translations
// FREEBIE
The previous launch screen was initially built on iphone5, but we never
scaled the logo to have the same proportions on iphone6 and larger
screens. Now it's scaled proportional to the screen width.
// FREEBIE
The broken code addressed in 8211d4584f
was duplicated a couple of places. This commit ferrets out the rest of
them and centralizes the logic in the ContactsManager.
// FREEBIE
number
The invite contact picker was rendering the "#" avatar for contacts who
had a name, but no phone number.
In some ways this approach is dumber. But since we have "surprising"
logic to set the contacts firstName to a phone number or maybe a company
name when contacts are built from ABContacts, this approach is more on
the level with the existing assumptions of what could be in that field
(which is to say, pretty much anything).
// FREEBIE
For consistency with the Android and Desktop client behavior.
* Show a placeholder avatar when no image, initials (#1512)
If all we know about the user is their phone number, their avatar image
is rendered as a placeholder. Previously, it would render the first few
characters of their phone number as if they were initials (eg. "+")
* Rename, extend OWSContactsManager methods (#1512)
Rename from: nameStringForPhoneIdentifier
to: displayNameForPhoneIdentifier
Also, add:
- (BOOL)nameExistsForPhoneIdentifier:(NSString *)identifier;
Which reports whether there's any "name" for a contact.
* Remove unused typedefs
These aren't used in the project anymore, and they were causing
compiling warnings due to a lack of nullability indication.
* Resolve some OWSContactsManager nullability warnings
Did a pass through all of the existing nullability warnings in
OWSContactsManager. Tried to pick descriptors that best reflected the
behavior of the methods.
// FREEBIE
- Update translations
- Updated transifex scripts to convert appropriately
- Run script from any dir
- Check that target directories exist
- We're currently not pulling any strings from JSQMVC
UTF-8 is preferred since we can see diffs in GH and have sane merges.
// FREEBIE
Preferred to the system contact picker because:
1. removes "group" clutter from header, unlikely to be used much.
2. can select while searching
3. fixes unified contact problem where e.g.
If only one of your contact has a phone number, they appear disabled
when choosing to invite via messaging, even though the other linked
contact *does* have a phone number.
4. label users w/o email so it's clearer why they can't be selected
Also:
* Twitter share-image was too tall
// FREEBIE
* Spruce up compose contact-picker
- Fix random sorting for contacts missing first or last name
- Add Avatar to contact picker
- de-dupe contacts
Better copy for INVALID_MESSAGE error.
// FREEBIE
* Automatically adjust message bubble text size on dynamic text changes.
- Addresses part of #1453.
* Renamed dynamic text notification handler method.
Only send a message if the local number is part of the group
* Fix error on empty group #1449
* Fix an unlogged issue about notification sent to group members even is the local user already quit the group
There was a bug in voiceover mode. When reading messages, Voiceover
would read out "message author: message content" for each chat bubble,
but the message author was always the name of the chat. So if it was
a contact chat, every message would be read as if from the other party,
and if it was a group chat, every message would be from the title of
the group.
This patch looks up the display name for the given signal id so
Voiceover reads the correct name for each message. It will read "Me" if
the message is outgoing.
We use this to determine which legacy migrations to run.
Also, soften the "your device is too old" behavior to just exit, rather
than blow away the users installation. Ouch!
* bump version
// FREEBIE
Data detectors work by matching local text against a series of local
matchers. No network activity is required. Some of the data detectors
are really useful (e.g. a link, or being able to copy a phone number).
Some aren't very useful, e.g. pop culture references, and seeing things
underlined is giving people the false impression that their data is
being inspected remotely.
// FREEBIE
Some folks get the wrong idea and think Signal Service knows their name,
when really, we were just showing them the entry for the registered
phone number in their address book.
In any case, presumably the user already knows their name, so we don't
need to remind them.
// FREEBIE
This is an expedient, but not good, "fix". Some messages are going to
have extra space at the bottom of the bubble. But, for the time being,
that's preferable to getting messages clipped.
// FREEBIE
When your partner changes their identity key (e.g. by reinstalling),
you'll see a notice alongside their message, but it will no longer
prevent the message from showing. aka "non blocking".
Existing users will be opted into the previous blocking behavior.
This is configurable for all users in Settings > Privacy.
// FREEBIE
This action was previously hidden under a secret longpress gesture in
the fingerprint view controller.
Ideally we'd never receive corrupted messages, but at the point we do,
our sessions are out of whack, and the only recovery option is to reset.
Let's help our users do that.
* Resetting session sends END_SESSION message
Otherwise the remote side wouldn't know we reset the session and will
send us a message on the old ratchet.
* Don't reset their identity key when resetting sender ratchet.
* Updated translations
// FREEBIE
The earlier fix for the broken ios10 emoji font ended up breaking
messages for some users with a tall font.
Here we have a lighter touch - ensuring we don't touch messages that
don't use emoji.
Also, introduce a different approach to the fix, rather than trying to
compute the bounding rect of an appropriately attributed string, just
add an extra bit of height per line.
This approach isn't ideal for long messages with only one emoji line in
them, but the previous approach was incompatible with Chinese messages
that also contain emoji. See the new
`MesssagesBubblesSizeCalculatorTest.swift` for test cases considered.
// FREEBIE
* Separate registering an account from registering for push notifications
* Allows us to complete registration without prompting user for
notification settings.
UX Changes
----------
* Automatically keep push tokens in sync on startup.
Push tokens *can* change, though they rarely do. It happens more often
for people switching between appstore/beta builds.
fixes#1174
* Show alert with registration failure
* add secret 8-tap debug log gesture to registration flow
* Move registration to separate flow
* don't see flash of inbox when first launching
* show useful error messages when given wrong code / no code
* remove background fetch
We werent using it, but only relying on a side effect of it which is
no longer necessary.
Code Changes
------------
* More registration logging.
* Install PromiseKit with carthage
Our dependencies are not yet framework compatible, so we can't use
cocoapods.
* Merge preferences util "category" into superclass.
The immediate reason for this is Swift interop was assuming optional
types were not optional, and exploding when a value was nil.
This is clearer anyway, since we were treating it like a subclass, and
it was the only thing using the class anyway.
* auto-genstrings now searches *.swift (and *.h, which was previously
broken) for translateable strings.
// FREEBIE
fixes#1329
We must register notification settings earlier to be sure we'll be able
to get the users push tokens.
We were previously relying on a quirk of background fetch, a feature
which we don't *actually* use, wherein it's possible to get push tokens
for a user without first prompting them for their notification
settings. More on this from UIApplication.h:
// Calling this will result in either application:didRegisterForRemoteNotificationsWithDeviceToken: or application:didFailToRegisterForRemoteNotificationsWithError: to be called on the application delegate.
// ---> Note: these callbacks will be made only if the application has successfully registered for user notifications with registerUserNotificationSettings:, or if it is enabled for Background App Refresh.
- (void)registerForRemoteNotifications NS_AVAILABLE_IOS(8_0);
In the previous implementation, if a user had disabled background
notifications (e.g. in order to save battery), we were waiting for push
tokens that would never come.
However, this simple "fix" introduces a UX problem - now we prompt for
an alert in the middle of our registration flow.
// FREEBIE
Improves the detection logic for iPhone 6 and above (uses interface idiom and the pixel width of the screen). This fixes detection on the iPhone 7 which was previously broken because it’s model number wasn’t include.
Also removes a number of category methods that weren’t being used in the codebase and were equally incomplete.
// FREEBIE
On iPhone 6 and above, media bubble sizes are 10% wider
On iPhone 5s and below, media bubbles are fixed in their larger dimension and the other dimension is calculated based on the aspect ratio of the underlying image (clamped to a reasonable min/max height).
// FREEBIE
Media bubbles (for photo, video and animated) sizes are calculated using shared logic. The bubbles are fixed width and their height is calculated based on the aspect ratio of the underlying image (clamped to a reasonable min/max height).
Fixes#1270
// FREEBIE
* From the error dialog you are able to back out of scanning or try again. Adds English localization for this message.
Adds an extra flag in OWSQRCodeScanningViewController to make sure that we don’t handle captureResults when capture is disabled (this was racing before because the call to [capture stop] is async and that was causing the cancel case to present the error dialog multiple times.
Fixes Signal-iOS#1347
* Fixes appearance of race with starting capture
Also marks the capture variable as atomic since it is accessed on
multiple threads.
// FREEBIE
fixes#1231
Motivation
----------
Previously when messages failed to send, there was no reason given.
Furthermore, when media messages failed to send there was no indication
that any attempt to send the message even occurred, nor a retry
dialog.
UX Changes
----------
- Show "uploading" status for media
- Show specific error message in retry-send dialog
- Only scroll to bottom when new message is inserted
- Show specific errors when group creation fails
Code Changes
-----------
- Updated incorrect references to TSMessageAdapters which were actually
references to OWSMessageData
- MessageSender was extracted from SSK MessagesManager
- access MessagesManager as property
- idiomatic init/properties for Env
- log contact intersections
- Move scroll-to-bottom animation to main thread.
// FREEBIE
TSOutgoingMessage is created with details about the group changes so that we see more than just “Group Updated.”
* Customizes message for new group creation
Replaces GROUP_UPDATED with GROUP_CREATED for a brand new group. Localized for English only.
* Updates to use fixed SignalServiceKit branch
// FREEBIE
Inadvertently stole credit for work done when squashing the commits.
Reverting and re-merging giving appropriate credit.
This reverts commit 8242c9e381.
TSOutgoingMessage is created with details about the group changes so that we see more than just “Group Updated.”
* Customizes message for new group creation
Replaces GROUP_UPDATED with GROUP_CREATED for a brand new group. Localized for English only.
* Updates to use fixed SignalServiceKit branch
// FREEBIE
* Inline #define strings, so genstrings can find them
* Make all strings single line so they don't get truncated by auto-genstrings
* Properly quote LHS in strings file
// FREEBIE
Fix animation memory leak exacerbated every time you reload a
conversation with expiration timers.
Stop animation on cells that aren't currently being displayed. This is
relatively minor compared to the above, but still, no reason to waste
cycles.
// FREEBIE
* lighter tint for icons, their bold stroke width makes them darker than
the text
* Replace double hourglass icons with a single one. It aligns better,
and the "small time" vs "big time" is confusing
* Add description of what disappearing messages do
// FREEBIE
* calculate size of info message using the info message font.
* offset by the info message header
There were instances of lines getting cropped, or an extra line being
added. The previous, more conservative, solution was to just make every
bubble too big, but it looked terrible.
// FREEBIE
* ContactsUI framework is not available on ios<9.
And it never was, so this framework should not be "required".
* Fix conversation settings title font on ios8
* Fix fingerprint not displaying on ios8
* ios8 safety number indented on third line.
* Fix glitchy table cell animation (not ios8 specific)
The defaut slide-under animation only looks good if you're using a
standard table cell height, but our duration slider is taller than the
rest of the table's cells.
Plus add a little bottom padding to the slider cell
// FREEBIE
fixes#1368
Apple switched emoji fonts from AppleColorEmoji to AppleColorEmojiUI.
The new font doesn't compute it's size correctly, causing containing
rectangles to be too small.
This commit scrubs strings of the new emoji font, and replaces it with
the old.
// FREEBIE
* Per thread settings menu accessed by tapping on thread title
This removed the toggle-phone behavior. You'll be able to see the phone
number in the settings table view.
This removed the "add contact" functionality, although it was already
broken for ios>=9 (which is basically everybody).
The group actions menu was absorbed into this screen
* Added a confirm alert to leave group (fixes#938)
* New Translation Strings
* Extend "Add People" label to fit translations.
* resolved issues with translations not fitting in group menu
* Fix the long standing type warning where TSCalls were assigned to a TSMessageAdapter.
* Can delete info messages
Follow the JSQMVC pattern and put UIResponder-able content in the
messageBubbleContainer. This gives us more functionality *and* allows us
to delete some code. yay!
It's still not yet possible to delete phone messages. =(
* Fixed some compiler warnings.
* xcode8 touching storyboard. So long xcode7!
* Fixup multiline info messages.
We were seeing info messages like "You set disappearing message timer to
10" instead of "You set disappearing message timer to 10 seconds."
Admittedly this isn't a very good fix, as now one liners feel like they
have too much padding.
If the message is well over one line, we were wrapping properly, but
there's a problem when the message is *just barely* two lines, the cell
height grows, but the label still thinks it's just one line (as evinced
by the one line appearing in the center of the label frame. The result
being that the last word of the label is cropped.
* Disable group actions after leaving group.
// FREEBIE
Rather than verifying eachothers keys separately, you now verify the
privacy with your recipient by sharing a single composite number or
QRCode.
This is a breaking change, in coordination with Desktop and Android.
UX
--
Fingeprint is no longer in line with identity key error. Instead you
have the option of going to the full-screen safety number verification
experience.
Overhauled fingerprint design
-----------------------------
* use same modal dismiss button as elsewhere
* remove fingerprint from settings.
* quick slide in animation vs slow fade
* existing was painfully slow
* blur effect is better metaphor for something slide over top
* anyway there was a rendering glitch in the end of fade where
underlying navbar would "snap" out
Also Fixed
----------
Always provide a name string for contact
* Centralize all the nil-checking
* Fall back to "unknown contact"
allow multi-line error messages
// FREEBIE
I botched a migration 6 months ago, which left some lingering TSRecipients serialized in our data store, laying in wait to explode the next time we enumerate every object in the database (e.g. when we add an index).
The bloom filter migration failed to remove TSRecipients in the somewhat rare event that the local user had no downloaded bloom filters. This could happen e.g. if they were low on disk space at the time of running the migration, I believe the app would remove the bloom filter cache.
// FREEBIE
* New bg (Bulgarian) localization!
* New sq (Albanian) localization!
* replace unfinished bg_BG localization with complete bg localization
* caps keys to make it easier to see missing localizations
* pull with newly pushed source keys
// FREEBIE
Also made identity key scanner appear faster. Previously we were
waiting for camera to initialize. Now we do this after the view has
loaded - with a black background, the affect is preferable than
lagging on the transition.
// FREEBIE
* Avoid intermittent crash in device manager via YapDatabaseModified
* Properly align refresh text when expecting new device
* Avoid glitchy activityIndicator while polling
* Expose edit mode toggle
Much of the code changes here were in the corresponding SSK update.
// FREEBIE
TSAnimatedAdapter is used when rendering GIFs. TSAnimatedAdapter
inherits from JSQMediaItem but does not provide a custom implementation
of the hash method. The default implementation of hash in JSQMediaItem
results in all messages of a given interaction type (incoming,
outgoing) sharing a cached bubble size. For this reason, JSQMediaItem
subclasses are required to implement hash (see
https://github.com/jessesquires/JSQMessagesViewController/issues/631).
This commit fixes issue #1275 by implementing hash in TSAnimatedAdapter
the same way TSPhotoAdapter does.
On older devices with lots of data, the orphan data cleaner can time
out. Here we're trading certainty that the migration completed for
confidence that the boot process doesn't time out.
// FREEBIE
The object is already cached & the waveform view constructed when scrolling,
so there's no need to re-create the view.
This doesn't fix the problem with the wave-form generation on the first
view of the message. That is a more critical problem in the underlying
SCWaveformView class which renders on the main thread instead of doing
it asynchronously.
FIXES#1258
Most of the work was done in SignalServiceKit 0.0.7, this adapts to
those changes.
Migration to clean any orphaned interactions/attachments.
- don't set new migration version until migration was successful.
- remove dead code from migrations
- rename message.attachments->message.attachmentIds
- Remove unused parameter from GroupModel
- formatting touched method/'s signatures
//FREEBIE
* Set height of toolbar based on actual font height. FIXES#1282
* max height for compose field FIXES#1186
Still absent is resizing to fit draft.
// FREEBIE
The root of the problem is we were using the deprecated ALAssetsLibrary
framework, which couldn't find certain assets.
By using the photos framework not only are we able to find these
assets, but it also cleans up our code:
* no more copying byte buffers
* no more detecting file type
// FREEBIE
This is closer to the 2.3 version.
Seems like upstream sizing has changed since our JSQMVC upgrade. This wider size calculation makes sense if you're losing space to the avatar, but since we're not using avatars the full width bubbles can make the whole view seem a bit crowded when you have large blobs of text.
// FREEBIE
We were ocassionally seeing extra tall error messages. This is because,
when appropriate, we were adding the space for a timestamp, but then
never actually rendering the time stamp.
So now:
- Error Messages aren't rendered too-tall
- Error Messages get a printed timestamp when appropriate
// FREEBIE
copy/save/delete is accessed via longpress for all media messages, just
like for simple text messages.
Notes
-----
We don't support saving audio attachments as it's not clear where they should go.
(I don't think users expect them to end up in their iTunes library.)
There is still no UX for "pasting" media into Signal.
Removed the now redundant (and confusing) "share" button interface.
//FREEBIE
The history here is that the radius I'm removing was added in #884 after
having straight edges added in our custom fork for a while.
So, rather than override our override, I'm just reverting to the
upstream value, which is close in proximity, and closer to iMessages
radius.
// FREEBIE
* Use NS_DESIGNATE_INTIALIZER to ensure we're setting all the variables we need to be in OWSCall
* no need to nil properties in dealloc on ARC
* use declarative dictionaries for legability
// FREEBIE
use declarative dictionaries for clarity
This was done as part of unforking JSQMessagesViewController, but is
intentionally a separate commit so we can separate formatting changes
from code changes in git history.
* Import frameworks like:
#import <FrameworkName/HeaderName.h>
* instead of:
#import "HeaderName.h"
// FREEBIE
This is part of unforking JSQMVC, but I'm only reformatting files
otherwise changed rather than reformatting the entire project for git
sanity.
This is intentionally a second commit so we can separate formatting
changes from code changes
* brace should drop after method definition (this is common across
almost all objc projects, and allows you to quickly differentiate
multi-line method signatures from their implementation.
* aligning consecutive assignments ongoingly muddies git history
// FREEBIE
Geting back on upstream fixes a couple bugs (see ##Bugfixes), and also
will make future updates easier.
The unforking process was basically this:
* move custom message types (Calls and DisplayedMessages) classes from our
custom JSQMVC fork into Signal-iOS.
* Move any method customization into our subclass. Including
ColletionView stuff, bubble sizing, and gesture behavior
Bug Fixes
---------
* Fix mis-sized incoming media bubbles.
Bubble size was being cached by interaction id. Which broke when
receiving an attachment. The problem is that incoming media messages
were initially the height of a "Downloading Attachment" info message.
Instead we use the mediaHash for media messages to expire the bubble
size when the media changes.
* fix missized bubble when MVC did appear
The MessagesViewController isn't sized correctly until ViewWillAppear.
This caused the first round of bubbles to be rendered incorrectly (they
assumed a larger container than they had). I think is reflected in the
current version of the app by a reflow occurring shortly after the view
appears.
Chores
------
* bump travis to build with xcode8
* specify RQV development team for device build. required by xcode 8 beta
Cleanup
------
* Refactor messageing XIB so that elements are hangning outside of
the views frame
* Fix compiler warning with explicit cast
* delete deprecated lineBreakmode, it's the default value anyway.
// FREEBIE
* Latest SocketRocket includes
* crash fixes.
* our new security policy management, so we don't have to
keep rebasing to incorporate updates.
* Adapt to policy renaming in SignalServiceKit
* bump XCode version to play nice with SWIFT_NAME
// FREEBIE