Commit graph

446 commits

Author SHA1 Message Date
Josh Perez
fc425304fc
Moves the attach-file shortcut into the component 2021-10-15 14:51:58 -04:00
Fedor Indutny
27573e6dce
Use non-throttled timeouts for websockets 2021-10-07 11:18:22 -07:00
Fedor Indutny
8cf6748dce
Delay initializing SQL in renderer 2021-10-07 11:16:51 -07:00
Josh Perez
b9134f8332
Actionable toasts 2021-10-06 14:00:51 -07:00
Fedor Indutny
3e31a7405b Use physical keys+layout for shortcuts 2021-09-29 14:21:15 -07:00
Josh Perez
603c315c82
Moves AudioCapture into react 2021-09-29 13:23:06 -07:00
Evan Hahn
7b9a68b7f9
Upgrade zkgroup to v0.8.1 2021-09-28 09:30:30 -07:00
Fedor Indutny
af387095be
API to suspend/resume tasks with timeout 2021-09-27 11:22:46 -07:00
Scott Nonnenberg
cf4c81b11c
Clear stale sender certificates 2021-09-27 10:31:34 -07:00
Fedor Indutny
af66a5b265
Truncate lastHeartbeat to day millis 2021-09-24 10:01:46 -07:00
Fedor Indutny
4ef0bf96cc
Uint8Array migration 2021-09-23 17:49:05 -07:00
Evan Hahn
d2ef82686d
Notification improvements 2021-09-23 13:16:09 -05:00
Josh Perez
e6d952d105
Removes ToastView, new React toast 2021-09-22 16:59:54 -04:00
Fedor Indutny
b9d6497cb1
Better types for WebAPI 2021-09-21 17:58:03 -07:00
Josh Perez
4e6c415ad8
Ensure that delete logs timeout does not run after resolution 2021-09-20 20:25:29 -04:00
Josh Perez
e9ef239ff0
Move emoji loading into TS 2021-09-20 10:59:09 -07:00
Josh Perez
65ddf0a9e8
Import log instead of using it off of window 2021-09-17 14:27:53 -04:00
Fedor Indutny
3f7957c20d
Self-repairing message counter 2021-09-15 11:45:22 -07:00
Fedor Indutny
5780c3d4b8
Fix socket management for unlinkAndDisconnect 2021-09-15 11:44:27 -07:00
Evan Hahn
240585ef94
Allow duplicates in reaction palette 2021-09-13 10:04:45 -07:00
Fedor Indutny
c7e7d55af4
UUID-keyed lookups in SignalProtocolStore 2021-09-09 19:38:11 -07:00
Fedor Indutny
cd809a9922
Add changeNumber capability 2021-09-09 13:53:58 -07:00
Evan Hahn
f28456c160
Let users customize the preferred reaction palette 2021-09-09 09:29:01 -07:00
Fedor Indutny
7a5385e00a
Flush message counter on shutdown 2021-09-08 16:28:18 -07:00
Scott Nonnenberg
c6278aa173
Lightbox: A number of tweaks 2021-09-07 09:12:26 -07:00
Fedor Indutny
c7873dd7ea
Reconnect websocket on e164 change 2021-09-02 16:47:42 -05:00
Evan Hahn
01b015680b
Move getMessageById next to getMessagesById 2021-09-02 10:44:54 -07:00
Evan Hahn
a85dd1be36
Retry outbound "normal" messages for up to a day 2021-08-31 13:58:39 -07:00
Fedor Indutny
62cf51c060
Pass mode in unlinkAndDisconnect event listener 2021-08-31 13:34:32 -07:00
Fedor Indutny
798533a417
Keep UI settings on heartbeat expiration 2021-08-30 14:39:57 -07:00
Evan Hahn
f86f753df9
Add durations utility for computing durations 2021-08-26 09:10:58 -05:00
Scott Nonnenberg
9f1bd94627
New version startup: clear remote expiration, hydrate from remote config 2021-08-24 16:36:43 -07:00
Josh Perez
e9308bbafb
New option for control over update downloads 2021-08-19 15:56:29 -07:00
Josh Perez
aecb11247f
Removes old feature flags 2021-08-18 18:04:38 -07:00
Josh Perez
91af0dad78
Faster preferences window 2021-08-18 13:08:14 -07:00
Fedor Indutny
6343e7c902
Do not initialize receivedAtCounter in connect 2021-08-17 16:15:45 -07:00
Evan Hahn
75f0cd50be
Send viewed receipt when you start listening to an audio message 2021-08-17 08:43:26 -07:00
Fedor Indutny
962515031d
Reduce number of SQL queries during conversation update 2021-08-16 11:56:27 -05:00
Evan Hahn
b0750e5f4e
Show "unplayed" dot on incoming audio messages 2021-08-12 13:15:55 -05:00
Fedor Indutny
12c78c742f
Optimize rendering 2021-08-11 09:23:21 -07:00
Scott Nonnenberg
81f06e2404
Sender Key: Hardcode senderKey to true, during link and thereafter 2021-08-10 17:41:27 -07:00
Fedor Indutny
0d3e3851e2
Send profileKeys less frequently 2021-08-10 17:16:12 -07:00
Fedor Indutny
cc5da98565
Ignore empty e164 in storage service 2021-08-06 11:20:11 -07:00
Scott Nonnenberg
5069f48cf0
Message Send Log: Increase retention length 2021-08-05 20:17:23 -04:00
Fedor Indutny
a001882d58
Change Phone Number notifications 2021-08-05 16:34:49 -07:00
Scott Nonnenberg
3bbe859452
Partially revert "Sender Key: Prepare for testing in beta"
Partial revert of commit ab5a12fded
2021-08-04 16:49:05 -07:00
Fedor Indutny
c68fd3d727
confirmCode endpoint shouldn't reconnect socket 2021-08-04 13:12:35 -07:00
Fedor Indutny
6d04bfdf67
Fix undefined log function 2021-08-03 12:05:20 -05:00
Scott Nonnenberg
ab5a12fded
Sender Key: Prepare for testing in beta 2021-08-02 19:12:49 -05:00
Fedor Indutny
c5de4c6284
Revert "Process read syncs after batches of messages"
This reverts commit eccace481b.
2021-08-02 15:47:33 -07:00
Evan Hahn
73bcd3b531
Remove the word "receipt" from read syncs code 2021-08-02 11:47:59 -05:00
Fedor Indutny
eccace481b
Process read syncs after batches of messages 2021-07-30 15:39:41 -05:00
Fedor Indutny
03874a788f
Use smaller batches for receipts and syncs 2021-07-29 18:08:04 -07:00
Fedor Indutny
4a402126b4
Make sure to restore registration before relink 2021-07-29 01:19:26 -07:00
Fedor Indutny
1c1d0e2da0
Move to websocket for requests to signal server 2021-07-28 14:37:09 -07:00
Evan Hahn
8449f343a6
Fix send sync message bugs 2021-07-28 13:53:18 -05:00
Evan Hahn
14929fb408
Show "unplayed" dot on outgoing audio messages 2021-07-27 10:42:25 -05:00
Scott Nonnenberg
67d13e9ba8
More logging in addDeliveryIssue, properly wait in getProfiles 2021-07-26 17:00:16 -07:00
Fedor Indutny
9c6343e10d
Unify MessageReceiver and MessageReceiverInner 2021-07-23 13:47:03 -07:00
Fedor Indutny
fdec47d637
Use single WebAPI instance across the app 2021-07-23 10:23:50 -07:00
Evan Hahn
07f0efc45f
Rename "view sync" to "view once open sync" 2021-07-22 12:07:53 -05:00
Josh Perez
d9e90e9ea8
Improvements to shared library components 2021-07-21 13:45:41 -07:00
Josh Perez
56d5d283bd
Support for announcement-only groups 2021-07-20 13:18:35 -07:00
Evan Hahn
863ae9ed83
Combine DeliveryReceipts and MessageReceipts modifiers 2021-07-20 13:17:25 -07:00
Fedor Indutny
886e8966ff
Drop support for signaling key 2021-07-19 18:11:07 -07:00
Evan Hahn
c4a09b7507
Refactor outbound delivery state, take 2
This reverts commit ad217c808d.
2021-07-19 17:44:49 -05:00
Scott Nonnenberg
7761d83055
Update timers whenever we mark messages read 2021-07-19 13:45:18 -07:00
Scott Nonnenberg
8415db499c
Initialize ConversationController earlier 2021-07-16 11:21:00 -07:00
Scott Nonnenberg
a42c41ed01
Message Send Log to enable comprehensive resend 2021-07-15 16:48:09 -07:00
Fedor Indutny
ad217c808d
Revert "Refactor outbound delivery state"
This reverts commit 9c48a95eb5.
2021-07-12 16:51:45 -07:00
Evan Hahn
9c48a95eb5
Refactor outbound delivery state 2021-07-09 16:38:51 -05:00
Fedor Indutny
ddbbe3a6b1
More protobufjs migration 2021-07-09 12:36:10 -07:00
Fedor Indutny
299fe2af36
More protobufjs use 2021-07-02 14:21:24 -05:00
Scott Nonnenberg
615ae1ccf7
Refactor SendMessage.ts to named parameters 2021-07-02 13:34:17 -05:00
Fedor Indutny
71572db7a9
Get native theme through IPC not remote 2021-06-30 11:57:43 -07:00
Evan Hahn
af1f2ea449
Officially support the system tray on Windows 2021-06-29 12:18:03 -05:00
Evan Hahn
79aba6bff4
A couple cleanups in createSentMessage 2021-06-29 09:41:42 -05:00
Evan Hahn
c69b2d3ace
Add type for second parameter of createSentMessage 2021-06-28 12:15:48 -07:00
Josh Perez
01eabf9ec6
Option to send photos as high quality 2021-06-25 11:08:16 -05:00
Fedor Indutny
cf64fbdc7c
Fix Cmd+T navigation for left pane 2021-06-23 10:53:04 -07:00
Fedor Indutny
a6394e0c8b
Reconnect within MessageReceiver 2021-06-23 09:47:42 -05:00
Evan Hahn
0ec23be91b
Fix React warning when mounting <App> 2021-06-23 09:33:27 -05:00
Fedor Indutny
972a4cba0c
Show universal timer notification in open conversation 2021-06-22 09:18:22 -05:00
Evan Hahn
ca330899bb
Backfill missing expire times for incoming messages 2021-06-18 12:12:04 -07:00
Scott Nonnenberg
68f1023946
Move message.getPropsForBubble and friends to selectors 2021-06-17 10:15:10 -07:00
Evan Hahn
03a187097f
Disappearing message cleanups 2021-06-16 17:20:17 -05:00
Scott Nonnenberg
1520c80013
Remove messageCollection from Conversation model 2021-06-15 17:44:14 -07:00
Evan Hahn
9dd7e763c4
Remove references to non-existent messageExpired action 2021-06-15 16:30:23 -07:00
Fedor Indutny
8f5086227a
Enforce stronger types for ArrayBuffers and storage 2021-06-14 17:09:37 -07:00
Fedor Indutny
61ac79e9ae
Log conversation job wait time and duration 2021-06-14 14:55:14 -07:00
Josh Perez
173771d34b
New top-level React root: <App /> 2021-06-14 12:01:00 -07:00
Fedor Indutny
17e6ec468e
Faster WebSocket reconnects 2021-06-09 15:28:54 -07:00
Fedor Indutny
3cac4a19e1
Move to new getSendOptions location 2021-06-09 12:16:45 -07:00
Scott Nonnenberg
bff3f0c74a
Sender Key: Prepare for production 2021-06-08 14:51:58 -07:00
Scott Nonnenberg
f226822dff
Conversation: Prevent getProps errors on initial link
Co-authored-by: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com>
2021-06-08 16:31:35 -05:00
Josh Perez
d38a0042ba
Fix new link scenario where default color is not set 2021-06-07 15:17:44 -07:00
Josh Perez
d4875fd8f4
Remove isPrivate, isMe, isGroupV1, isGroupV2 from model 2021-06-07 09:39:13 -07:00
Josh Perez
bd46e3afd6
Fixes global chat color setting 2021-06-02 14:05:09 -07:00
Fedor Indutny
3776909c24
Fix storage upload for universal timers 2021-06-02 13:25:30 -07:00
Fedor Indutny
19f8042cd3
Universal Disappearing Messages 2021-06-01 13:45:43 -07:00
Scott Nonnenberg
5a4fc5e425
Sender Key: Disable capability and bug fixes 2021-06-01 12:40:09 -07:00
Scott Nonnenberg
ee513a1965
Support for message retry requests 2021-05-28 12:11:19 -07:00
Josh Perez
28f016ce48
Conversation Colors 2021-05-28 09:15:17 -07:00
Scott Nonnenberg
ee41e4f71d
A few small bugfixes 2021-05-27 13:47:39 -07:00
Evan Hahn
d4dc9b8e39 Message Requests: Add new "Report spam and block" button 2021-05-27 13:37:58 -07:00
Scott Nonnenberg
e6f1ec2b6b
Send support for Sender Key 2021-05-25 15:40:04 -07:00
Fedor Indutny
227f532ec2
Fix processing of cached envelopes 2021-05-24 14:30:56 -07:00
Fedor Indutny
25f4154cde
Add checks for unregistering message receiver 2021-05-24 12:01:45 -07:00
Fedor Indutny
6323dd6492
Go back to main process before delayed processing 2021-05-21 09:51:27 -05:00
Fedor Indutny
2abc331058 Fix in-memory transactions while accessing sessions 2021-05-20 17:37:10 -07:00
Scott Nonnenberg
38f9aef2af On 401 response from Signal server, reconnect websocket 2021-05-20 17:37:09 -07:00
Fedor Indutny
fe505a7f2f Fix hanging "Clear All Data" on Windows 2021-05-20 17:37:08 -07:00
Jacob Kiesel
75d54e7737 Add launch-on login option
See [#5244][0].

[0]: https://github.com/signalapp/Signal-Desktop/pull/5244
2021-05-11 15:59:21 -05:00
Evan Hahn
b41dab2704
Fix "open conversation menu" keyboard shortcut 2021-05-11 13:40:36 -05:00
Fedor Indutny
e51260a23f
Batch and de-duplicate profile key updates 2021-05-11 13:26:44 -05:00
Josh Perez
e0c324e4ba
Send/Receive support for reaction read syncs 2021-05-06 21:15:25 -04:00
Fedor Indutny
986d8a66bc
Show challenge when requested by server 2021-05-05 17:09:29 -07:00
Evan Hahn
8ef14e6f39
When incoming message should've been sealed sender, reply with profile key 2021-05-05 09:39:16 -07:00
Evan Hahn
c1730e055f
Remove 25 trivial WhatIsThis types 2021-05-03 09:38:20 -07:00
Evan Hahn
bbd7fd3854
Initial support for job queue 2021-04-29 18:02:27 -05:00
Evan Hahn
bf6487c5b9 Don't mark conversations as unregistered unless there's no UUID 2021-04-29 14:27:37 -07:00
Evan Hahn
013923d3c1 Remove CDS feature flag 2021-04-29 14:27:36 -07:00
Evan Hahn
e77dcf7f85 Don't create an unnecessary array in conversation batcher 2021-04-29 14:27:36 -07:00
Josh Perez
d203f125c6
Adds message forwarding 2021-04-27 18:35:35 -04:00
Josh Perez
5e2d48cc2f
Do not populate left pane on initial link 2021-04-20 19:16:49 -04:00
Fedor Indutny
1746d27b5e
Wait for appView to be there in onEmpty 2021-04-15 11:17:28 -07:00
Evan Hahn
2ee5f57516 Ensure storage is ready before starting sender certificate service 2021-04-14 14:15:26 -07:00
Fedor Indutny
a4ff7ae240
Report more performance stats 2021-04-13 16:43:56 -07:00
Scott Nonnenberg
e0415de893 Don't always show an error on manual contact sync 2021-04-09 00:06:46 -04:00
Evan Hahn
a82fa86176 Fetch sender certificates on-demand 2021-04-09 00:06:46 -04:00
Fedor Indutny
6ff55914f0 Deduplicate conversations before passing to redux
Receiving a single message on conversations triggers ~4 updates.
However, since `.format()` is called on next tick - the value is going
to be the same regardless of which particular update triggered it. Batch
conversations and de-duplicate them before passing to redux to save
time.
2021-04-09 00:06:14 -04:00
Evan Hahn
f615b1a75f Reject reactions with invalid number of graphemes 2021-04-08 23:53:18 -04:00
Fedor Indutny
37c8c1727f Types, better-sqlite3, and worker_threads for our sqlite 2021-04-08 23:53:18 -04:00
Evan Hahn
b95dd207ca Periodically refresh both sender certificates 2021-04-05 18:08:50 -04:00
Evan Hahn
99928ee831 Move refresh_sender_certificate.js to TypeScript 2021-04-05 18:08:50 -04:00
Fedor Indutny
cf50550936 Finish all renderer SQL queries switching to main
Don't switch to main process until all renderer SQL queries are
completed. If we switch while some of them are still running - we can
get SQL_BUSY from concurrent writes in main and renderer processes.
2021-04-05 18:08:50 -04:00
Evan Hahn
63ece2e9b4 Don't set or read reaction target phone number 2021-04-05 18:08:50 -04:00
Fedor Indutny
746e99b8c2
Flush all watchers on empty queue 2021-03-25 17:00:03 -07:00
Fedor Indutny
a75402d290
Add timestamp utilities with helpful names 2021-03-22 16:08:52 -05:00
Fedor Indutny
6fec6b2646 Fix attachments not loading for stickers/long messages 2021-03-19 16:57:36 -04:00
Evan Hahn
850e759579 Keeping profile data around longer in the face of errors 2021-03-19 16:57:36 -04:00
Evan Hahn
b725ed2ffb Refresh profiles on app start (at most every 12 hours) 2021-03-19 16:57:36 -04:00
Fedor Indutny
59d1159c06 Set attachmentDownloadQueue = undefined on empty 2021-03-19 16:57:35 -04:00
Josh Perez
62e04a1bbd Fix for unread syncs and ooo reactions 2021-03-19 16:57:35 -04:00
Josh Perez
0bd3c78187 Do not batch single saveMessage calls after start-up 2021-03-19 16:57:35 -04:00
Josh Perez
f07da67c60 Toggle between db in renderer and in main 2021-03-19 16:57:35 -04:00
Josh Perez
468d491d34 Optimizations to the performance improvement changes 2021-03-19 16:57:35 -04:00
Evan Hahn
729d808f62 macOS: make conversation and main header draggable 2021-03-19 16:57:35 -04:00
Josh Perez
3cc6c5f5ad Fix for missing replacement text in bodyRanges 2021-03-19 16:57:35 -04:00
Josh Perez
d82ce07942 Improve cold start performance 2021-03-19 16:57:35 -04:00
Fedor Indutny
a2a0d56270 Ensure a theme setting value is saved on first startup 2021-03-19 16:53:51 -04:00
Evan Hahn
dfa5005e7d Update conversation header design 2021-03-19 16:53:51 -04:00
Scott Nonnenberg
d0e3a2ce29 background.ts/conversation_view.ts modules, Whisper.View/ToastView in TS 2021-03-19 16:53:51 -04:00
Scott Nonnenberg
2aa2aca9f2 A few bug fixes 2021-03-19 16:53:51 -04:00
Evan Hahn
06fb4fd0bc Add "new conversation" composer for direct messages 2021-03-19 16:53:51 -04:00
Scott Nonnenberg
98e7e65d25 Automatic session reset 2021-03-19 16:53:51 -04:00
Evan Hahn
eb203ba929 Disable search keyboard shortcuts when main header isn't shown 2021-03-19 16:53:51 -04:00
Josh Perez
022a381397
onChangeTheme: Guard against uninitialized redux 2021-02-12 11:45:22 -08:00
Scott Nonnenberg
73d62a98e6 Fix composer reference in Ctrl-T shortcut handling 2021-02-12 10:38:58 -08:00
Josh Perez
34285054f6
Manual download of attachments with no blurHash 2021-02-11 17:50:11 -08:00
Evan Hahn
92e5ccd764 When initializing Redux, add 2 missing properties to conversations slice 2021-02-10 14:47:55 -08:00
david yang
2501584db6
Add keyboard shortcut to match other MacOS Chat Apps (#4719)
MacOS Messages and WhatsApp (amongst other messaging apps) use this Cmd + Shift + [/] to switch between convos.  Would be great to have that in Signal as well.
2021-02-04 14:36:39 -08:00
Evan Hahn
ddebbf8121
Hide title bar on macOS 2021-02-01 12:01:25 -08:00
Scott Nonnenberg
a48b3e381e
Support for joining New Groups via invite links 2021-01-29 14:16:48 -08:00
Scott Nonnenberg
12c44d40a8
makeLookup: Allow for key of zero 2021-01-27 14:39:45 -08:00
Josh Perez
bba50c8427 Log app startup time 2021-01-25 18:29:00 -08:00
Scott Nonnenberg
cbc6c29479 Finish in-redux conversation lookups, getPropsForSearchResult moved 2021-01-25 18:28:58 -08:00
Evan Hahn
fff95d1262 Fix CI by updating license years and fixing a type error 2021-01-25 18:28:58 -08:00
Josh Perez
2529e208c1 Move confirmation_dialog_view to ts and React
* Moves confirmation_dialog_view to ts and React

* showConfirmationDialog API
2021-01-25 18:28:58 -08:00
Evan Hahn
8ace4b6321 Improve window activity detection, improving notification delivery 2021-01-25 18:28:57 -08:00
Scott Nonnenberg
8116a8561d
Show progress dialog during delete 2021-01-12 18:42:15 -06:00
Scott Nonnenberg
3a726ad311
Adjust timeouts for better performance 2021-01-11 13:59:46 -08:00
Scott Nonnenberg
3f58a9b762
Clean up UUID-handling to prepare for future 2020-12-09 17:26:37 -05:00
Evan Hahn
1098e59f87
Handle group calling event sync messages 2020-12-09 16:04:34 -06:00
Evan Hahn
a2f285d243
Put group calling behind a remote feature flag 2020-12-07 14:35:14 -06:00
Evan Hahn
23fed9ce63
Group calling SFU URL should be configurable 2020-12-07 13:40:11 -06:00
Evan Hahn
ec35bdc3e5
Don't peek group calls if feature flag is disabled 2020-12-07 14:19:59 -05:00
Evan Hahn
6d53cb1740 Group calling: Peek into a group call 2020-11-23 14:49:32 -05:00
Scott Nonnenberg
2c69f2c367 Support for GV1 -> GV2 migration 2020-11-23 14:48:12 -05:00
Scott Nonnenberg
26884432a2 Update TypeScript, Prettier and typescript-eslint for new TypeScript 3.8 syntax 2020-11-23 14:45:44 -05:00
Chris Svenningsen
d593f74241
New contact popup when clicking on group member or avatar 2020-11-11 09:36:05 -08:00
Scott Nonnenberg
cd599f92c8
background/connect: Prevent concurrent calls to connect 2020-11-11 10:24:29 -06:00
Evan Hahn
8bfaf598af Add license headers across the project 2020-11-04 13:03:13 -06:00
Evan Hahn
decc93532b Hide call buttons when on call 2020-11-04 13:03:13 -06:00
Scott Nonnenberg
29eaa7b9a2
Cleanup: Reactions, Delete for Everyone 2020-11-02 14:49:07 -08:00
Scott Nonnenberg
05f905fd10
A few small bugfixes 2020-10-30 10:56:03 -07:00
Scott Nonnenberg
fa2d300714 Show 'accept invite UI' for re-invite, calm progress spinner 2020-10-26 15:55:27 -07:00
Scott Nonnenberg
04b7a29229 Modern profile sharing in 1:1 and GroupV1 groups 2020-10-26 15:48:44 -07:00
Chris Svenningsen
e5fae1a346 Fix shortcuts with pinned chats 2020-10-15 19:00:15 -04:00
Scott Nonnenberg
0122cfd22a Resilience to quick reconnects: always reprocess from cache first 2020-10-12 18:10:08 -04:00
Scott Nonnenberg
358ee4ab72 storage: Don't throw if we store undefined 2020-10-12 18:10:08 -04:00
Scott Nonnenberg
b914b59969 Disable obsolete feature flags 2020-10-12 18:10:08 -04:00
Scott Nonnenberg
d51a0b5ece GroupsV2: Better group invite behavior 2020-10-12 18:10:08 -04:00
Chris Svenningsen
cf9764c85a Consolidate checks for v2 Groups 2020-10-12 18:10:08 -04:00
Josh Perez
27759233e4 Storage Service Write: Improved conflict handling 2020-10-12 18:10:08 -04:00
Chris Svenningsen
b5df9b4067 Migrate messages, conversations, conversation_view, background to TS
Co-authored-by: Sidney Keese <sidney@carbonfive.com>
2020-10-12 18:10:07 -04:00
Renamed from js/background.js (Browse further)