Commit graph

1835 commits

Author SHA1 Message Date
Marco Romano
6e66c989f4
Receive and play a voice message (#1503)
## Type of change

- [x] Feature
- [ ] Bugfix
- [ ] Technical
- [ ] Other :

## Content

This PR consists of several macro-blocks separated by path/package:
- `messages.impl.mediaplayer` : Global (room-wide) media player, now used only for voice messages but could be used for all media within EX in the future. It is backed by media3's exoplayer. Currently not unit-tested because mocking exoplayer is not trivial.
- `messages.impl.voicemessages.play` : Business logic of a timeline voice message. This is all the logic that manages the voice message bubble.
- `messages.impl.timeline.model` & `messages.impl.timeline.factories`: Timeline code that takes care of creating the `content` object for voice messages.
-  `messages.impl.timeline.components` : The actual View composable that shows the UI inside a voice message bubble.

All the rest is just small related changes that must be done here and there in existing code.

From a high level perspective this is how it works:
- Voice messages are unlike other message bubbles because they carry state (i.e. playing, downloading...) so they have a Presenter managing this state.
- Media content (i.e. the ogg file) of a voice message is downloaded from the rust SDK on first play then stored in a voice messages cache (see the `VoiceMessageCache` class, it is just a subdirectory in the app's cacheDir which is indexed by the matrix content uri). All further play attempts are done from the cache without hitting the rust SDK anymore.
- Playback of the ogg file is handled with the `VoiceMessagePlayer` class which is basically a "view" of the global `MediaPlayer` that allow the voice message to only see the media player state belonging to its media content. 
- Drawing of the waveform is done with an OSS library wrapped in the `WaveformProgressIndicator` composable.

Known issues:
 - The waveform has no position slider.
 - The waveform (and together with it the whole message bubble) is taller than the actual Figma design.
 - Swipe to reply for voice messages is disabled to avoid conflict with the audio scrubbing gesture (to reply to a voice message you have to use the long press menu).
 - The loading indicator is always shown (there is no delay).
 - Voice messages don't stop playing when redacted.

## Motivation and context

https://github.com/vector-im/element-meta/issues/2083

## Screenshots / GIFs

Provided by Screenshot tests in the PR itself.
2023-10-24 21:47:51 +00:00
jonnyandrew
8c7a0c0e0a
Allow deleting a recorded voice message (#1635)
---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
2023-10-24 21:02:19 +00:00
Benoit Marty
aadfb79945 Test coverage: Add missing preview for RoomDetailsView. 2023-10-24 17:17:15 +02:00
Benoit Marty
b5839aa42a Test coverage: Add missing preview for MessagesView. 2023-10-24 17:17:15 +02:00
Benoit Marty
307680c62a Test coverage: extract EmojiItem to improve coverage. 2023-10-24 17:17:15 +02:00
jonnyandrew
9b027fcb67
Update package of voice message composer (#1633) 2023-10-24 14:48:35 +00:00
jonnyandrew
f1b142f002
Add voice message recording duration indicator and limit (#1628)
---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
2023-10-24 11:44:53 +00:00
jonnyandrew
8c0d9cc6a0
Add progress indicator for sending voice messages (#1618)
---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
2023-10-24 08:36:42 +00:00
jonnyandrew
b476654489
Record and send voice messages (#1596)
---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
2023-10-23 17:28:00 +00:00
David Langley
503efbf4c0
Merge pull request #1625 from vector-im/langleyd/fix_emoji_shortcut_values
Fix emoji shortcut values
2023-10-23 16:49:56 +01:00
ganfra
005e5cc1a1
Merge pull request #1624 from vector-im/feature/fga/pin_auth_ui
PIN : unlock screen ui
2023-10-23 16:35:22 +02:00
David Langley
f159ca9d7d Update thumbs up emoji in the state provider. 2023-10-23 15:25:28 +01:00
ganfra
20eed4f7d7 PIN : fix tests with new LockScreenConfig 2023-10-23 16:03:11 +02:00
ganfra
da4dd44654 PIN unlock : adjust ui a bit 2023-10-23 15:38:24 +02:00
ganfra
05a999acd4 Pin: add LockScreenConfig and address PR reviews 2023-10-23 15:30:17 +02:00
Benoit Marty
f8512d3964 Remove unused import 2023-10-23 14:01:23 +02:00
David Langley
afc3958ecf Fix emoji shortcut values 2023-10-23 12:06:52 +01:00
Benoit Marty
8ca42d4cfc Konsist: add test to ensure that functions with @PreviewsDayNight contain ElementTheme composable, and fix existing issues. 2023-10-23 12:23:27 +02:00
ganfra
6230d9d48b PIN : add test for SetupPinPresenter 2023-10-23 11:41:08 +02:00
ganfra
4fbe32a6da PIN: fix konsist 2023-10-23 11:00:47 +02:00
ganfra
35dce75fd1 PIN : fix warning 2023-10-23 10:34:49 +02:00
ganfra
0bc992c1ba Pin : fix tests after rename 2023-10-23 10:32:43 +02:00
jonnyandrew
7048da2e20
Fix issue where text is cleared when cancelling a reply (#1617) 2023-10-23 08:31:32 +00:00
ElementBot
c8dc364147
Sync Strings (#1623)
* Sync Strings from Localazy

* Fix strings

* Update screenshots

---------

Co-authored-by: bmarty <bmarty@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
2023-10-23 08:20:49 +00:00
renovate[bot]
244c45797f
Update dependency org.matrix.rustcomponents:sdk-android to v0.1.63 (#1619)
* Update dependency org.matrix.rustcomponents:sdk-android to v0.1.63

* Update Element Call integrated APIs

* Take into account the new `MessageType.Other` from the SDK

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Jorge Martín <jorgem@element.io>
Co-authored-by: Benoit Marty <benoit@matrix.org>
2023-10-20 22:32:59 +02:00
ganfra
ab13c5d696 Fix some warnings 2023-10-20 20:38:27 +02:00
ganfra
fd63220ee0 Fix compilation 2023-10-20 20:26:04 +02:00
ganfra
4a24e1cd7e Pin unlock : better PinKeypad management 2023-10-20 20:25:54 +02:00
ganfra
67d4271f4d Pin unlock : add signout prompt 2023-10-20 18:52:56 +02:00
ganfra
f12de0ce1d Pin unlock : best effort for small height 2023-10-20 17:57:29 +02:00
ganfra
a6060ab4ab Pin unlock : fix some ui 2023-10-20 16:35:54 +02:00
ganfra
55a272d8b7 Pin unlock : start branching logic 2023-10-20 15:43:55 +02:00
ganfra
1d3a75fbd4 Pin : move some classes around 2023-10-20 15:23:10 +02:00
ganfra
5b611ed017 Lockscreen: renaming 2023-10-20 15:15:19 +02:00
ganfra
7c509ab460 Merge branch 'develop' into feature/fga/pin_auth_ui 2023-10-20 14:54:22 +02:00
ganfra
0df609cef5 Create PIN : hopefully fix remaining issues 2023-10-20 10:54:59 +02:00
ganfra
20c2ee9e3a Merge branch 'develop' into feature/fga/pin_create_ui 2023-10-19 22:26:21 +02:00
ganfra
b4173fbe46 Create pin : fix some spacing 2023-10-19 22:23:19 +02:00
ganfra
784415f698 Pin auth : simple first iteration on ui 2023-10-19 21:58:12 +02:00
Jorge Martin Espinosa
46f78ef700
Integrate Element Call with widget API (#1581)
* Integrate Element Call with widget API.

- Add `appconfig` module and extract constants that can be overridden in forks there.
- Add an Element Call feature flag, disabled by default.
- Refactor the whole `ElementCallActivity`, move most logic out of it.
- Integrate with the Rust Widget Driver API (note the Rust SDK version used in this PR lacks some needed changes to make the calls actually work).
- Handle calls differently based on `CallType`.
- Add UI to create/join a call.

---------

Co-authored-by: ElementBot <benoitm+elementbot@element.io>
2023-10-19 15:38:43 +00:00
ganfra
b5a9dc80dd Create pin : fix konsist 2023-10-19 16:32:58 +02:00
ganfra
55282417a8 Create pin : change digit size box 2023-10-19 16:29:16 +02:00
ganfra
7ebe6719da Pin create: use localazy strings 2023-10-19 16:28:20 +02:00
Marco Romano
a814c4a95a
TimelineItemPresenterFactories (#1609)
DI infrastructure to allow injection of presenters into the timeline.
Add an `@AssistedFactory` of type `TimelineItemPresenterFactory` to a `Presenter` class and bind this factory into the TimelineItemPresenterFactory map multi binding using:

```
@Binds
@IntoMap
@TimelineItemEventContentKey(MyTimelineItemContent::class)
```

A map multibinding of such factories will be available in the `LocalTimelineItemPresenterFactories` composition local for further use down the UI tree.
2023-10-19 15:57:34 +02:00
ganfra
e88a5fc858 Pin create: add test for presenter 2023-10-19 15:45:11 +02:00
Marco Romano
5a7f77bc92
Extract more content from audio messages. (#1607)
`TimelineItemAudioContent`:
- Use `java.time.Duration` instead of milliseconds. This will ease up things in the future because currently milliseconds are sent over the wire but in the future seconds will be sent (as per the stable MSC). Using `Duration` will allow our downstream code to be independent of what's passed over the wire.
- Rename `audioSource` property to `mediaSource` to better match its type.

`AudioMessageType`:
- Add and populate new fields `details` and `isVoiceMessage` to be used by voice messages.
2023-10-19 13:32:43 +02:00
ganfra
caf6d6b674 Create pin : render failures 2023-10-19 12:34:29 +02:00
ganfra
539854b18c Create pin : remove PinCodeManager and add TODO 2023-10-19 12:18:26 +02:00
ganfra
7b611e7c7a Pin create : improve clear validation 2023-10-19 12:16:30 +02:00
ganfra
c15a193d4a Pin create : add some more states to manage validation and confirmation 2023-10-19 12:11:14 +02:00