Commit graph

1739 commits

Author SHA1 Message Date
Scott Nonnenberg
2b5e56f6be Use setElement to ensure that re-parented views listen for events
FREEBIE
2017-06-15 16:28:15 -07:00
Scott Nonnenberg
40651f44ab
MessageView.appendAttachmentView: Remove from proper parent
FREEBIE
2017-06-08 19:59:22 -07:00
Scott Nonnenberg
f602ac462f A little cleanup in ConversationView.resetLastSeenIndicator
FREEBIE
2017-06-08 17:04:07 -07:00
Ikarulus
1021f835fe changes due to feedback 2017-06-07 15:53:14 -07:00
Ikarulus
068cf5092c fix typo 2017-06-07 15:53:14 -07:00
Ikarulus
ec3278ca3a add message length warning for android clients 2017-06-07 15:53:14 -07:00
Scott Nonnenberg
d269751dbc Conversation.markRead: Return a promise so queueJob works
FREEBIE
2017-06-07 15:46:21 -07:00
Scott Nonnenberg
785b117b86 Mark older messages as read when we get out-of-order read receipt
FREEBIE
2017-06-07 15:46:21 -07:00
Scott Nonnenberg
aeefc530d2 Conversation.markRead: Remove checks for unread
We will now always attempt to mark things unread if this method. If the
conversation's unreadCount gets out of date, set to zero, we will still
do it. If we go through the motions, and nothing is newly marked read,
we will still set the unreadCount to zero.
2017-06-07 15:46:21 -07:00
Scott Nonnenberg
6fbdd63e7e Conversation.onReadMessage - queue job, don't send read receipts
We queue the job because we often get a whole lot of read receipts at
once, and their markRead calls could very easily overlap given the async
pull from DB.

We also disable read receipts for any message marked read due to a read
receipt. That's a notification explosion we don't need.

FREEBIE
2017-06-07 15:46:21 -07:00
Scott Nonnenberg
89046484ed Read receipts: Also mark all messages read prior to this one
We mark as read everything older than this message - to clean up old
stuff still marked unread in the database. If the user generally doesn't
read in the desktop app, so the desktop app only gets read receipts, we
can very easily end up with messages never marked as read (our previous
early read receipt handling, read receipts never sent because app was
offline).

FREEBIE
2017-06-07 15:46:21 -07:00
Scott Nonnenberg
f38d8eb4ae Fix: Ensure that attachments are always rendered
Because we only attach AttachmentViews to the DOM when they fire their
'update' event, we were subject to a race condition. If that event fired
after the final Message.render(), then it would be properly attached to
the final DOM node. If it fired early, it would end up missing from
the visible DOM entirely, attached to the old, discarded version of
the message.

This change updates our handling of a second call to loadAttachments().
Instead of bailing out if we've been called before, we attempt to
re-add our child AttachmentViews to the current DOM. But only if the
'update' event has been fired, and if their current parent node is not
what is in the DOM.

FREEBIE
2017-06-07 15:28:30 -07:00
Scott Nonnenberg
da8d49b5ed ConversationView.markRead: Mark all messages read when at bottom
To handle the same 'not quite at the bottom' case that our 30px buffer
gives us for marking messages read, we use the same atBottom() method to
determine whether we should mark everything unread. Saves the effort and
potential missed messages (due to partial pixels, etc.).

FREEBIE
2017-06-07 15:27:27 -07:00
Scott Nonnenberg
6bfeb7ab14 Conversation.sendMessage: Don't set unreadCount to zero
This is no longer guaranteed to be true. If you're scrolled up in a
conversation, you may not have read all messages. Setting the
unreadCount to zero will prevent the user from marking any of their
existing messages as unread until something else happens, like receiving
a read receipt or new message.

FREEBIE
2017-06-07 15:27:27 -07:00
Scott Nonnenberg
bb483474a3 Fix: Show hourglass on incoming disappearing messages once read
FREEBIE
2017-06-06 15:33:55 -07:00
Scott Nonnenberg
9a09e7a16b TimerView: Update only as often as 500ms
FREEBIE
2017-06-06 15:33:55 -07:00
Scott Nonnenberg
5351b60365 TimerView: Remove some unused bits of code
- initialize doesn't need to call update because
  MessageView.renderExpiring() calls it immediately
- we don't need the className because that's already present on
  the el it attaches to, part of the MessageView's template.

FREEBIE
2017-06-06 15:33:55 -07:00
Scott Nonnenberg
fb7e7cf34c TimerView: don't continue to update after expiration
FREEBIE
2017-06-06 15:33:55 -07:00
Scott Nonnenberg
0c2c36c11a loadMoreMessages: Fix broken reference to this.view.outerHeight
:0/

FREEBIE
2017-06-02 12:08:06 -07:00
Ikarulus
ab5489baa0 fixed #1163, dark theme flaw 2017-06-01 16:45:17 -07:00
Scott Nonnenberg
ec22445f75 Bulletproofing of markRead and findNewestVisibleUnread
FREEBIE
2017-06-01 16:09:27 -07:00
Scott Nonnenberg
1775e97bcd Add comment and fine-tune last-seen indicator when not focused
FREEBIE
2017-06-01 16:09:27 -07:00
Scott Nonnenberg
672a517b73 Preserve lastSeenIndicator location when not focused
Also, a couple name changes of ConversationView methods to better
reflect what they do. update -> reset, since the method is destructive.

FREEBIE
2017-06-01 16:09:27 -07:00
Scott Nonnenberg
944ae296eb Prevent 'mark read on scroll' during fetches
FREEBIE
2017-06-01 16:09:27 -07:00
Scott Nonnenberg
b60b20bde4 Mark messages read only when visible, on receipt, focus, scroll
- Only mark messages read when scrolling if in focus and visible
- Remove last seen indicator when scrolling to the bottom with scroll
  down button
- Update last seen indicator when we don't already have one and we're
  scrolled up.

FREEBIE
2017-06-01 16:09:27 -07:00
Scott Nonnenberg
9a0a87ab40 Last seen indicator: dismissed only on open and send
It can be moved if you're not scrolled to the bottom of of the window
or the window doesn't have focus when a new message comes in. Other than
that, it marches up the window until you close and reopen the
conversation, or send a message.

Note that we do NOT mark messages as read if they come in when you are
scrolled up. But we do mark the entire conversation as read if you
switch away from the app and back.

FREEBIE
2017-06-01 16:09:27 -07:00
Scott Nonnenberg
eb1a4b3ac6 loadAttachments: Handle the zero -> some attachments case
FREEBIE
2017-06-01 15:38:26 -07:00
Scott Nonnenberg
0e1b534d3c Make MessageView.render() idempotent
Re-renders happen when we re-fetch messages from the database, and our
previous technique for loading attachments resulted in a new attachment
view added for every call to render()

This change ensures that a second call to render() does not add any more
attachment views.

FREEBIE
2017-06-01 15:38:26 -07:00
Scott Nonnenberg
25ebcc3131 Fix broken reference to i18n string 'mediaMessage'
FREEBIE
2017-06-01 15:38:26 -07:00
Scott Nonnenberg
0b6d5de753 Update the scroll position when 'fetch more messages' is complete
FREEBIE
2017-06-01 15:19:08 -07:00
lilia
3dbb21c53c Fix being re-added to a group you previously left
Negate the flag marking the group as left. Fixes #1207.

// FREEBIE
2017-05-30 10:51:07 -07:00
Scott Nonnenberg
13a91eece8 MessageListView.measureScrollPosition: reuse variables 2017-05-30 10:44:00 -07:00
Scott Nonnenberg
c5530b7235 Increase wiggle room to 30 px, which should ensure text cut off
FREEBIE
2017-05-30 10:44:00 -07:00
Scott Nonnenberg
84397a2ef4 20px at bottom of conversation considered 'at the bottom'
So users who are 'close enough' at the bottom of the conversation won't
get marooned in history.

FREEBIE
2017-05-30 10:44:00 -07:00
Scott Nonnenberg
09791ab7d9 Make last seen indicator more stable, with less forced removal
FREEBIE
2017-05-26 17:26:35 -07:00
Scott Nonnenberg
c3dc9732ef Fix: Don't scroll to last seen indicator on focus
FREEBIE
2017-05-26 17:26:35 -07:00
Scott Nonnenberg
10c2874d19 Fix race condition: Pull from database after add to conversation
Also add some console logs to help us determine whether this ever
happens to people in the wild.

FREEBIE
2017-05-26 16:02:14 -07:00
Scott Nonnenberg
9de384f3b8 Reset last seen indicator timing on focus of window
FREEBIE
2017-05-25 16:41:21 -07:00
Scott Nonnenberg
01918049b4 Keep last seen indicator around for five seconds
Helps calm the user experience a little more, makes it easier to
understand what's happening when messages are coming in quickly.

FREEBIE
2017-05-25 16:41:21 -07:00
Scott Nonnenberg
4e9e811d12 Last seen indicator: Keep scroll position when window loses focus
FREEBIE
2017-05-25 16:41:21 -07:00
Scott Nonnenberg
3beecce94e fetchConversation: Minimize scans across loaded messages
FREEBIE
2017-05-25 16:30:30 -07:00
Scott Nonnenberg
d5d1d58cc2 Exclude Backbone-sourced method from jscs checks
FREEBIE
2017-05-25 16:30:30 -07:00
Scott Nonnenberg
3ceb3a049e Override Message.fetch to ensure that db data overrides local
FREEBIE
2017-05-25 16:30:30 -07:00
Scott Nonnenberg
2c81539042 A guard to prevent infinite loops in fetching of conversation
FREEBIE
2017-05-25 16:30:30 -07:00
r-clancy
66b19d5cf7 Add support for opening the inbox via a shortcut - fixes #1134. 2017-05-24 10:51:38 -07:00
Scott Nonnenberg
fdf04f6229 Ensure that we never show last seen indicator if count is zero
FREEBIE
2017-05-23 15:41:05 -07:00
Scott Nonnenberg
e023c58883 Update last seen indicator even if window doesn't have focus
FREEBIE
2017-05-23 11:08:23 -07:00
lilia
72019eb79c Reuse a variable
FREEBIE
2017-05-23 11:08:23 -07:00
lilia
176339ffe6 Add log to see if we ever fetch while fetching
// FREEBIE
2017-05-23 11:08:23 -07:00
lilia
16f3717824 Move refresh prekeys out of SignalProtocolStore
Use an event/listener instead

// FREEBIE
2017-05-23 11:08:23 -07:00
lilia
017bb56cca Fix some corner casese with last seen indicator
* Remove increment behavior
* Dismiss when new messages arrive but the window is focused
* Update the indicator when window becomes focused.

// FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
bb468e7b01 Wait for scroll before deciding whether to add scroll down button
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
30b7bf23db Recursively fetch messages until we've loaded all unread
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
8b4402e8a5 Only show scroll down button if we're not at bottom of convo
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
4c7bfbe9ff Scroll down button: when scrolled up, or new non-visible message
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
3cfac58d78 Eliminate all console errors during test run
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
3e01d78c89 MessageListView remove unused reset-scroll event
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
73f2a4a0fb Simplify MessageListView.resetScrollPosition: no translation math
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
bfdb8254a4 Scroll on new message only if we were already at bottom
FREEBIE
2017-05-23 11:08:23 -07:00
Scott Nonnenberg
fed26c36ca Add new Last Seen Indicator with unread count, scroll to it
This is to ensure that when there are a lot of unread messages, the user
is given the chance to see all of them by being scrolled to the oldest
new message.

When a new message comes in, the indicator will be incremented.

When the user sends a message or switches away from the conversation,
the last seen indicator will be removed.

FREEBIE
2017-05-23 11:08:23 -07:00
lilia
3f1d8ee2b8 Fix display name for ios voice messages
iOS populates a filename for voice messages which was overruling our check for
the voice message flag when choosing the display name.

// FREEBIE
2017-05-19 10:25:30 -07:00
lilia
89a7875747 Remove unused function
This was supposed to solve the problem of losing group state after a reinstall
by inspecting member registration ids and pre-emptively sending group updates to
those who appear newly re-registered, but it has been unused since 6123c419.

Nowadays there's a protocol for requesting lost group state from other members.

// FREEBIE
2017-05-16 15:37:05 -07:00
lilia
80bfe18f02 Mark groups left on synced "You left the group"
When leaving a group on mobile, we sync the group quit message to desktop, but
we weren't marking the conversation left.

// FREEBIE
2017-05-16 15:23:29 -07:00
lilia
4842ef6153 Sync end session messages
// FREEBIE
2017-05-16 12:14:07 -07:00
lilia
cfe0c77243 Conversation view blocks sending to left groups
Instead of attempting to send, which will throw an 'Unknown group' exception,
show a toast.

// FREEBIE
2017-05-16 12:10:29 -07:00
lilia
3ea5c0435b Update attachment style
Add names and sizes for all attachments except images, and (as with
arbitrary attachments), clicking on the text will open a save dialog.
In the absence of a filename, choose something that makes sense.

Display different icons for different media types, including distinct icons
for voice notes and audio files.

In iOS theme, audio, video, voice, and files are all encapsulated in bubbles.

Closes #804
Closes #842
Closes #836

// FREEBIE
2017-05-12 15:27:45 -07:00
lilia
6c53605dfd Flag voice note attachment protos as such
// FREEBIE
2017-05-12 09:55:15 -07:00
lilia
8bd7280673 Early read receipts should start expiration timers
Check for early read receipts for an incoming messages *after*
processing the expireTimer on that message. Then we can set
expirationStartTime appropriately if an early receipt is found.

Closes #950

// FREEBIE
2017-05-11 13:47:58 -07:00
Scott Nonnenberg
0496518af4 Bulletproof getCountOfAllMatches against non-global regex input
FREEBIE
2017-05-10 15:51:39 -07:00
Scott Nonnenberg
423a0fef67 Jumbomoji support matching Android support
FREEBIE
2017-05-10 15:51:39 -07:00
lilia
aed5735620 Improve keychange notice reliability/perf
Bind a single listener to keychange events from the storage interface,
which then looks up relevant conversations and adds notices to them,
with tests.

Previously we would need to instantiate a conversation model in order to
start listening to its key change events. In practice this usually
happens at startup but we shouldn't rely on it, and it incurs higher
overhead since it creates a different listener for each conversation.

// FREEBIE
2017-05-09 15:41:41 -07:00
lilia
787c393e1b Log key change advisory creation
// FREEBIE
2017-05-09 15:28:16 -07:00
lilia
8aa2f771a7 Remove self-listener in conversation model
Since there is the only source/listener on this event, it can be called
directly.

// FREEBIE
2017-05-09 15:28:16 -07:00
Scott Nonnenberg
ee00ad0e15 File attachments: show file size, bold filename, make icon bigger
FREEBIE
2017-05-09 15:14:20 -07:00
Scott Nonnenberg
2a04fa02df Introduce new filesize dependency
FREEBIE
2017-05-09 15:14:20 -07:00
lilia
a5a9118c5c Fix empty bubble on accepting a new key
// FREEBIE
2017-05-02 13:50:48 -07:00
r-clancy
499ca5537a Increase max GIF size to match Signal-Android.
Signal-Android had the max GIF size changed to 25MB in
WhisperSystems/Android@ad0f283

This change brings parity to the two projects and fixed #1116.
2017-05-01 11:00:10 -07:00
lilia
7a8f2f0fec Allow sending arbitrary files 2017-05-01 09:58:03 -07:00
lilia
40af226a4a Move Whisper.events out of views and tests 2017-04-21 13:21:18 -07:00
lilia
bab9580c3a Don't fallback to file view for images
Also lengthen the timeout a bit.

// FREEBIE
2017-04-19 18:17:14 -07:00
lilia
267f1f5d93 Use ISO format in log message 2017-04-19 13:58:20 -07:00
lilia
6b531ad342 Fix attachment size
This is already a number.

// FREEBIE
2017-04-18 18:09:21 -07:00
lilia
c98ec91cab Fix tests again 2017-04-18 16:51:56 -07:00
lilia
a2f0d6c739 Fix tests 2017-04-18 16:39:00 -07:00
lilia
c9b4ae6e80 Save 'video/quicktime' files as .mov
Sometimes .mov files arrive with content type video/quicktime, but must
be saved to .mov in order for osx to recognize them as videos and open
the appropriate default program, display thumbnails, etc...

// FREEBIE
2017-04-18 16:27:50 -07:00
lilia
a27ea20f3e Improve unsupported file type handling
Make arbitrary files look nicer and display the filename.

If an audio or video element fails to load for any reason, timeout after
a few seconds and render it as an arbitrary file. Also short circuit to
this treatment for common audio and video file types that we know are
going to fail, e.g., proprietary formats from apple.

// FREEBIE
2017-04-18 16:27:50 -07:00
lilia
27a1c9f18a Populate attachment file size
// FREEBIE
2017-04-18 12:08:37 -07:00
lilia
fc514aa96f Add support for attachment file names
Send, receive, and save attachment filenames. Use them as suggested
names when saving files.

// FREEBIE
2017-04-18 11:48:56 -07:00
lilia
a256f17e19 Cleanup attachment attributes
Convert attachment ids from longs to strings, and byte buffers to
arrays.

// FREEBIE
2017-04-18 11:48:53 -07:00
lilia
b68f438cee Use appendChild instead of append
`append` is only supported in Chrome > 54

Fixes #1127

// FREEBIE
2017-04-15 23:46:02 -07:00
lilia
dcfc4701c2 Tweak socket event logging 2017-04-13 13:15:42 -07:00
lilia
44a4ff3b52 Refactor install view
Let install view manage the connection to the provisioning socket as
well as cleaning up the window on completion, simplifying options.js.
Call `remove` so that the view stops listening when the window closes.
Move view script and template to background page.
Adds ability to hide nav if this isn't our first run.

// FREEBIE
2017-04-13 13:15:42 -07:00
lilia
df65585e71 Network status listens to some global events
Listen for reconnectTimer to display reconnection info. Listen for
unauthorized to update network status immediately after a failed login,
rather than waiting for the normal 5s interval to time out.

// FREEBIE
2017-04-12 20:43:16 -07:00
lilia
d3492960a6 Display info in network status when unlinked
When we can't connect due to being unlinked, network status indicator
will show an appropriate informational message and a button to open the
installer window to relink.

// FREEBIE
2017-04-12 20:43:16 -07:00
lilia
587e5265c5 Only re-render network status when it changes
// FREEBIE
2017-04-12 20:43:16 -07:00
lilia
3f05c8ff87 Rename window.events to Whisper events
// FREEBIE
2017-04-12 20:43:16 -07:00
lilia
fcff07df98 Remove some global refs to window.events
// FREEBIE
2017-04-12 20:43:16 -07:00
lilia
510a5cb7fe Namespace global listeners to Whisper 2017-04-12 20:43:16 -07:00
lilia
3c2b7c8cbd Log missing signed prekey ids
// FREEBIE
2017-04-12 13:02:31 -07:00
lilia
26d97e621b Update libsignal-protocol 2017-04-12 13:02:31 -07:00