Merge pull request #2905 from vector-im/feature/bma/preview_fix
Try to fix crash about UrlPreview (#2640)
This commit is contained in:
commit
60cc441092
|
@ -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 🗣:
|
||||||
-
|
-
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue