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