Tree:
99fbb1919d
Johennes-patch-1
bma/otherProposal
bma/testRustMatrixClient
ci/jme/fix-nightly-reports-owasp
develop
dkasak/custom-build
emoji-search-poc
experiment/roborazzi
experiment/rust-notifications-sync
experiment/screenshots-oom
feature/bma/bloomOptim
feature/bma/elementCallMaestro
feature/bma/fixCi
feature/bma/fixNotificationContent
feature/bma/fixPreviewArchitecture
feature/bma/flipper
feature/bma/fullyRead
feature/bma/improveLayout
feature/bma/noApkInstall
feature/bma/pendingSkdBranch
feature/bma/reactionLocalEcho
feature/bma/testPinUnlockPresenter
feature/bma/unreadNotificationMapping
feature/bma/useRustInterfaces
feature/fga/enable_encryption_loop
feature/fga/pinned_message_icon
feature/fga/power_level
feature/fga/session_coroutine_scope_rework
feature/fga/small_timeline_improvements
feature/fga/unlock_settings
feature/fga/update-rust-sdk-0.1.29
feature/fga/update-rust-sdk-0.1.56
feature/fga/update_compose_foundation_material3_beta
feature/fga/update_room_list_api
feature/jme/element-call-tests
feature/jme/open-room-member-details-when-clicking-on-user-data
feature/jme/update_rust_sdk
feature/julioromano/geocoding_api
feature/julioromano/noDelayInTests
fix/jme/dont-intercept-mas-domain
fix/jme/fix-flaky-media-tests
fix/jme/screenshot-tests-issues
fix/jme/use-shared-membershipobserver-in-room-list
fix/jme/workaround-deadlock-when-paginating
gh-pages
gh-readonly-queue/develop/pr-1068-c35c3471bda57d64673e6938bd305e5acc20efc2
jme/20-permission-management
jme/remove-kover-from-test-modules
jme/room_list_filters_embedded
jonny/proxy
jonny/vm-remove-feature-flag
jonny/vm-set-media
jonny/voice-message-preview-seek
julioromano/acquirePlayerWithoutPlaying
julioromano/custompreview4
julioromano/desugar_nio
julioromano/fixTallAndWidePreviews
julioromano/keep_presenters
julioromano/keep_presenters_2
julioromano/konisist
julioromano/nio/desugar_nio
julioromano/nio/nio_file_move
julioromano/nio_file_move
julioromano/poll_history_rust
julioromano/poll_reply_vote_end
julioromano/rust_room_timeline_split
julioromano/sendMyLocation_compose
julioromano/singleExo
julioromano/staticImageBuildConfig
julioromano/stop_playing_redacted_voice_message
julioromano/timeline_di
julioromano/timeline_di_2
julioromano/timeline_di_try2
julioromano/timeline_saveable_bug
julioromano/voiceMessageAttachmentA11y
julioromano/waveform_float
kittykat-patch-1
main
misc/cjs/dark-previews
misc/jme/3078-unify-dm-check
misc/jme/adapt-sdk-changes
misc/jme/add-custom-sliding-sync-proxy-option-in-developer-options
misc/jme/add-logging-to-state-machine
misc/jme/fix-maestro-map-tiler
misc/jme/move-preview-annotations-to-its-own-module
misc/jme/optimize-module-dependencies
misc/jme/sdk-type-event-filter
misc/jme/try-to-fix-screenshot-autoincrement-name
other/julioromano/inlineasync2
other/julioromano/molecule_test_failure
release/0.3.0
renovate/accompanist
renovate/com.lemonappdev-konsist-0.x
renovate/com.otaliastudios-transcoder-0.x
renovate/com.posthog-posthog-android-3.x
renovate/compose.bom
renovate/io.nlopez.compose.rules-detekt-0.x
renovate/kotlin
renovate/lifecycle
renovate/major-kotlin
renovate/org.maplibre.gl-android-sdk-11.x
revert-2500-renovate/compose.bom
test/diawi-in-ci
test/element-call-comms
test/ffi-kotlin-room-list-tests
test/jme/compound-poc
test/jme/debug-ci-leaks
test/jme/fix-danger-lint-duplicate-reports
test/jme/fixing-record-screenshots-in-forks
test/jme/full-screen-popup
test/jme/sonar-5
test/jme/wait-until-the-call-is-active-to-send-notify-event
test/kotlin-2.0
test/rust-room-list-filtering
test/sss
wip/anvil-ksp-fork
wip/kotlin-2.0
0.1.0
v0.1.2
v0.1.4
v0.1.5
v0.1.6
v0.2.0
v0.2.1
v0.2.2
v0.2.3
v0.2.4
v0.3.0
v0.3.1
v0.3.2
v0.4.0
v0.4.1
v0.4.10
v0.4.12
v0.4.13
v0.4.14
v0.4.15
v0.4.16
v0.4.2
v0.4.3
v0.4.4
v0.4.5
v0.4.6
v0.4.7
v0.4.8
v0.4.9
v0.5.0
v0.5.1
v0.5.2
v0.5.3
v0.6.0
v0.6.1
v0.6.2
v0.6.3
${ noResults }
1 Commits (99fbb1919d1b1e476e4d79fd14ede651afc0b640)
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. |
11 months ago |