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
This shouldn't have any affect on behavior, we're just removing unused
strings, extracting comments, and re ordering.
Going forward we can use auto-genstrings to get a sensible diff without
having to manually add/remove/update strings and comments.
Thanks @nixnuex!
// 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
* Don't attempt to send a message unless we've successfully built device-messages
* Only process message exception when we're done with retries.
// FREEBIE
Even though it's pretty obvious why we need your camera when you push a
"take photo" button...
Unfortunately this warning will be confusing if someone's first exposure
to it is to scan an identity code, but that seems like an edge case not
worth pegging an extra sentence of copy to an already unnecessary
warning.
Also, we're enabling push notifications for dev, per apple build
submission feedback.
// 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
Previously ios was generating the asset for us from our vector (pdf),
but apparently it does a crappy job. Most notably on small thin lines
like our paperclip.
// 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
* compress non-GIF media as JPEG
There are some problems with this approach
- Potentially re-encoding files
- Lots of code in the controller
* Compress GIF > 5MB into static JPEG.
This isn't ideal, but a stopgap to prevent people from sending huge
GIFs, while also giving them *some* kind of feedback (e.g. a static jpeg
is sent rather than their being no indication to sender+recipient that
anything was attempted.)
* spell bmp correctly
// FREEBIE
FIXES#1222
Maybe this code was a vestige of a former way we were customizing the
back button. In any case, it's no longer required for swipe-to-pop
functionality.
// FREEBIE
4% of our crashes are from accessing latestContactsById with an invalid
address. This was partially addressed by assigning a value on init, but
it's still happening.
By converting the ivar to an atomic property we can avoid any funny
business that would happen when accessing this var while it's being
updated in a different thread.
Also, make sure we're copying to defensively strip mutability.
Also:
* bumped release target
* removed unused code
* dealloc at the top per style.
* Rebased OWS fork of SocketRocket against upstream
* Pulling in SocketRocket directly from OWS Github rather than going
through the motions of publishing a pod that only we use.
* Bump version
// FREEBIE
* bump version
* pulled latest translations
* Register localizations with app.
- Persian (fa)
- Indonesian (id)
- Macedonian (Macedonia) (mk)
- Shona (sn)
- Galacian (gl)
(Project > Signal > Localizations > Add Localizations)
Generalized Macedonian locale since it seems like iOS doesn't support
the "Macedonia(Macedonia)" sub-locale
* disable farsi until proper RTL interface work is done
// FREEBIE
* modify script to fetch all uploaded translations.
Otherwise we don't always get the latest translations.
This might be because we're only fetching "reviewed" translations, but
so-far-so-good with unreviewed translations, and we don't have a real
"reviewing" hierachy in place anyway. This policy might change in the
future, but at least now it's not ambiguous.
// FREEBIE
* latest translations
* Fixes "New Message" --> "Invite contact" exception for iPhone devices that do not support SMS messaging
* fix SMS invite on empty inbox
This code appears in two contexts - (1) in an empty inbox , where no other view
controller is presented, and (2) in compose interface where a
search controller is presented, and must first be dismissed.
* only check SMS sending ability directly, (not device model)
This is better because:
1. sometimes iPhones can't send SMS
2. Sometimes iPads/iPods can send SMS
* correct localization key
* bump build
// FREEBIE
* all Signal users can send text messages, never hide texting toolbar.
//FREEBIE
* Fix composition box size when switching threads.
Partial revert of 2c83046ff6 which
introduced a shared reusable message view controller across threads.
2c83046ff6 resulted in several discovered
bugs so far (#1179, #1150, #1152, and maybe: #1146). It's pretty clear
at this point we're going against the grain of how
JSQMesageViewController is intended to be used, and since the nominal
purpose of this feature (iPad Layout) doesn't exist, we should revert to
the known good way of interacting with the MessageViewController,
creating a fresh instance per thread.
// FREEBIE
* bump release
//FREEBIE
* fix invite over sms alert
Could not present the sms invite alert controller because we were
already presenting the UISearchController
FIXES: #1182
// FREEBIE
* Update translations (4 new translations!)
*New Translations*
- Persian (fa) (100%)
- Indonesian (id) (82%)
- Macedonian (Macedonia) (mk_MK) 100%
- Shona (sn) 98%
Inluded a script to pull translations that are >=80% complete
80% is completely arbitrary, but nicely bisects the current translation
efforts which fall into buckets of "over 80%" and "under 50%."
// FREEBIE
* final tx pull before push source
//FREEBIE
* tx pull, after updating source (plus some eager beavers already pushed new translations)
iStringVerify passes
* Make "add person" label more i18n flexible
This accommodates (e.g.) Italian, which was being truncated.
// FREEBIE
* Galician localization
Moitas grazas xesusmosquera!
// FREEBIE
* i18n for Unarchive action
started leaving hints for our translators. These are currently manually
redundantly duplicated in the source/strings file, in hopes of a more
automated future with genstrings.
// FREEBIE
* include iStringsVerify check in update-translations script
and pull latest translations after including UNARCHIVE action
// FREEBIE
* i18n GROUP_MEMBERS_HEADER
//FREEBIE
* pull translations
* Group actions bar button image was too big
Added image inset to resize.
// FREEBIE
* return blue line to neutral gray. (partial revert of 0c1a97a743)
// FREEBIE
* Podfile.lock corollary to updating SSL in b7813bdc9a
// FREEBIE
Since we're now re-using the message controller across threads, we have
to reset some elements to their initial state when switching threads.
Missed this one.
Fixes: #1150
// FREEBIE
* Fix ability to attach photos from camera
Looks like this came about with the animated GIF handling. We'll only
go down the byte-comparison-mime-type-detecting code path for attaching
existing photos, since it only exists for animated GIFs.
This will also revert to properly compressing our image attachments, so
long as they are taken from the camera.
* Prevent crash when tapping broken image
It never makes sense to present a "full screen" nil image. Previously
this happened when camera-capture was broken, but could conceivably
happen for other as-of-yet unknown reasons.
// FREEBIE
*most* of our time when scrolling around a message view is in this
method. Doubly so when these are media items.
remove interaction from cache when it is deleted/updated
// FREEBIE
Since "Key Path" is the header for run time attributes, my guess is that
this was a click misfire so long ago. I'm not clear if this was ever
causing a crash or just a warning, but we don't want the noise.
Fix "Unbalanced calls to begin/end appearance transitions"
You should not segue while animations are in progress. I'm not sure if
this was causing intermittent crashes or just the warning.
//FREEBIE
Closes#1130
- Use single MessagesViewController. Goal: Being able to reuse that UI
for SplitViewController on iPad. Prevents unnecessary deallocations and
re-allocations.
- Remove custom archiving UI for default swipe right to left archive
action, like in iOS Mail.app.
- DynamicType for main view.
- Simplify API of MessagesViewController to prevent undefined behavior.
//FREEBIE
- Using same clang format file for old and new files.
- Moving out all TextSecure code to allow other clients (OS X, iOS) to
integrate easily TextSecure functionality.
- Use TextSecure API to signup.
Implemented using corbett's suggestion in issue #525. Uses
Flipboard/FLAnimatedImage in an AttachmentAdapter. Detects gifs using
new Animated category in MIMETypeUtil.
Backwards compatible with previous versions of Signal on iOS for both
sending and receiving Gifs, though they are sent/received in older
versions as UIImage and won't animate. Gifs also animate on both ends of
conversations with TextSecure users on Android.
//FREEBIE
Upon receiving a 404 to a prekey request for a particular device D, the client handles that error by removing device D from the recipient's device list, and proceeds to encrypt and send to the remaining known devices.
Reviewed & Patched by @FredericJacobs
- Adding support for ContactsUI when adding contacts on iOS 9.
- Multiple performance updates by liberating the main thread and
reusing tableview cells.
- Fixing size classes rendering bugs.
- Supporting native iOS San Francisco font.
- Quick Reply
- Settings now slide to the left as suggested in original designed
opposed to modal.
- Simplification of restraints on many screens.
- Full-API compatiblity with iOS 9 and iOS 8 legacy support.
- Customized AddressBook Permission prompt when restrictions are
enabled. If user installed Signal previously and already approved
access to Contacts, don't bugg him again.
- Fixes crash in migration for users who installed Signal <2.1.3 but hadn't signed up
yet.
- Xcode 7 / iOS 9 Travis Support
- Bitcode Support is disabled until it is better understood how exactly
optimizations are performed. In a first time, we will split out the
crypto code into a separate binary to make it easier to optimize the
non-sensitive code. Blog post with more details coming.
- Partial ATS support. We are running our own Certificate Authority at
Open Whisper Systems. Signal is doing certificate pinning to verify
that certificates were signed by our own CA. Unfortunately Apple's App
Transport Security requires to hand over chain verification to their
framework with no control over the trust store. We have filed a radar
to get ATS features with pinned certificates. In the meanwhile, ATS is
disabled on our domain. We also followed Amazon's recommendations for
our S3 domain we use to upload/download attachments. (#891)
- Implement a unified `AFSecurityOWSPolicy` pinning strategy accross
libraries (AFNetworking RedPhone/TextSecure & SocketRocket).
Signal requires the AddressBook permission to use the app at the
moment. This avoids the edgecases where a user doesn’t allow access to
his address book and then tries to use the app. We’re also doing a
significantly better job at explaining why we need this permission to
the user.
We’ve noticed that most people went to the App Store to leave really
bad reviews of the app and it is severely affecting our discoverability.
We will ask for a rating if we see you’ve been using the app for some
time. If you rate the app or decline to rate, that’s fine. We will
never bug you again!
declaring constants instead of string literals
avoiding using self within block
removed unused method decleration from header file
Reviewed-by: @FredericJacobs
- Removes large confusing UX bar and related assets. Replaced with UISwitch.
- Enhanced user experience for missed calls.
- Fixes issue where missed call would appear as incoming call in call log.
- Fixing issues where PushKit handler not called on launch.
The oval part of the speech bubble was vertically centered, but the hanging triangle made it appear to be lower-than-center. This pushes the entire bubble up to correct for that.
- Tap to reply to a message.
- Badges application with the number of unread messages.
- Pick up a phone call from lock screen, or decline it.
- Settings for notification sounds while app in foreground and text displayed on local notifications.
Hour format was set to static “h:mm a” leading to localization issues.
Current locale will now be respected in every formatting.
Adjusted the decision when to label the message with a date from
“more then 24 hours ago” to “not today”.