Merge pull request #2905 from vector-im/feature/bma/preview_fix

Try to fix crash about UrlPreview (#2640)
This commit is contained in:
Benoit Marty 2021-02-23 16:07:16 +01:00 committed by GitHub
commit 60cc441092
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 9 deletions

View file

@ -9,7 +9,7 @@ Improvements 🙌:
- Improve initial sync performance (#983) - Improve initial sync performance (#983)
Bugfix 🐛: Bugfix 🐛:
- - Try to fix crash about UrlPreview (#2640)
Translations 🗣: Translations 🗣:
- -

View file

@ -132,7 +132,7 @@ class RoomDetailViewModel @AssistedInject constructor(
val timeline = room.createTimeline(eventId, timelineSettings) val timeline = room.createTimeline(eventId, timelineSettings)
// Same lifecycle than the ViewModel (survive to screen rotation) // Same lifecycle than the ViewModel (survive to screen rotation)
val previewUrlRetriever = PreviewUrlRetriever(session) val previewUrlRetriever = PreviewUrlRetriever(session, viewModelScope)
// Slot to keep a pending action during permission request // Slot to keep a pending action during permission request
var pendingAction: RoomDetailAction? = null var pendingAction: RoomDetailAction? = null
@ -1425,7 +1425,7 @@ class RoomDetailViewModel @AssistedInject constructor(
snapshot snapshot
.takeIf { state.asyncRoomSummary.invoke()?.isEncrypted == false } .takeIf { state.asyncRoomSummary.invoke()?.isEncrypted == false }
?.forEach { ?.forEach {
previewUrlRetriever.getPreviewUrl(it, viewModelScope) previewUrlRetriever.getPreviewUrl(it)
} }
} }
} }

View file

@ -16,17 +16,17 @@
package im.vector.app.features.home.room.detail.timeline.url package im.vector.app.features.home.room.detail.timeline.url
import android.os.Handler
import android.os.Looper
import im.vector.app.BuildConfig import im.vector.app.BuildConfig
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.cache.CacheStrategy import org.matrix.android.sdk.api.cache.CacheStrategy
import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.getLatestEventId import org.matrix.android.sdk.api.session.room.timeline.getLatestEventId
class PreviewUrlRetriever(session: Session) { class PreviewUrlRetriever(session: Session,
private val coroutineScope: CoroutineScope) {
private val mediaService = session.mediaService() private val mediaService = session.mediaService()
private data class EventIdPreviewUrlUiState( private data class EventIdPreviewUrlUiState(
@ -38,12 +38,11 @@ class PreviewUrlRetriever(session: Session) {
// Keys are the main eventId // Keys are the main eventId
private val data = mutableMapOf<String, EventIdPreviewUrlUiState>() private val data = mutableMapOf<String, EventIdPreviewUrlUiState>()
private val listeners = mutableMapOf<String, MutableSet<PreviewUrlRetrieverListener>>() private val listeners = mutableMapOf<String, MutableSet<PreviewUrlRetrieverListener>>()
private val uiHandler = Handler(Looper.getMainLooper())
// In memory list // In memory list
private val blockedUrl = mutableSetOf<String>() private val blockedUrl = mutableSetOf<String>()
fun getPreviewUrl(event: TimelineEvent, coroutineScope: CoroutineScope) { fun getPreviewUrl(event: TimelineEvent) {
val eventId = event.root.eventId ?: return val eventId = event.root.eventId ?: return
val latestEventId = event.getLatestEventId() val latestEventId = event.getLatestEventId()
@ -115,7 +114,7 @@ class PreviewUrlRetriever(session: Session) {
private fun updateState(eventId: String, latestEventId: String, state: PreviewUrlUiState) { private fun updateState(eventId: String, latestEventId: String, state: PreviewUrlUiState) {
data[eventId] = EventIdPreviewUrlUiState(latestEventId, state) data[eventId] = EventIdPreviewUrlUiState(latestEventId, state)
// Notify the listener // Notify the listener
uiHandler.post { coroutineScope.launch(Dispatchers.Main) {
listeners[eventId].orEmpty().forEach { listeners[eventId].orEmpty().forEach {
it.onStateUpdated(state) it.onStateUpdated(state)
} }