Skip to content

Commit 2ee51ec

Browse files
authored
Merge pull request #7962 from vector-im/feature/bma/oomRealm
Fix oom crashes.
2 parents 0cdbcea + 9537170 commit 2ee51ec

File tree

8 files changed

+18
-36
lines changed

8 files changed

+18
-36
lines changed

changelog.d/7962.bugfix

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix OOM crashes.

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/DefaultTimeline.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ internal class DefaultTimeline(
102102
realm = backgroundRealm,
103103
eventDecryptor = eventDecryptor,
104104
paginationTask = paginationTask,
105-
realmConfiguration = realmConfiguration,
106105
fetchTokenAndPaginateTask = fetchTokenAndPaginateTask,
107106
fetchThreadTimelineTask = fetchThreadTimelineTask,
108107
getContextOfEventTask = getEventTask,

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/LoadTimelineStrategy.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package org.matrix.android.sdk.internal.session.room.timeline
1919
import io.realm.OrderedCollectionChangeSet
2020
import io.realm.OrderedRealmCollectionChangeListener
2121
import io.realm.Realm
22-
import io.realm.RealmConfiguration
2322
import io.realm.RealmResults
2423
import io.realm.kotlin.createObject
2524
import io.realm.kotlin.executeTransactionAwait
@@ -97,7 +96,6 @@ internal class LoadTimelineStrategy constructor(
9796
val realm: AtomicReference<Realm>,
9897
val eventDecryptor: TimelineEventDecryptor,
9998
val paginationTask: PaginationTask,
100-
val realmConfiguration: RealmConfiguration,
10199
val fetchThreadTimelineTask: FetchThreadTimelineTask,
102100
val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
103101
val getContextOfEventTask: GetContextOfEventTask,
@@ -351,7 +349,6 @@ internal class LoadTimelineStrategy constructor(
351349
fetchThreadTimelineTask = dependencies.fetchThreadTimelineTask,
352350
eventDecryptor = dependencies.eventDecryptor,
353351
paginationTask = dependencies.paginationTask,
354-
realmConfiguration = dependencies.realmConfiguration,
355352
fetchTokenAndPaginateTask = dependencies.fetchTokenAndPaginateTask,
356353
timelineEventMapper = dependencies.timelineEventMapper,
357354
uiEchoManager = uiEchoManager,
@@ -360,7 +357,6 @@ internal class LoadTimelineStrategy constructor(
360357
initialEventId = mode.originEventId(),
361358
onBuiltEvents = dependencies.onEventsUpdated,
362359
onEventsDeleted = dependencies.onEventsDeleted,
363-
realm = dependencies.realm,
364360
localEchoEventFactory = dependencies.localEchoEventFactory,
365361
decorator = createTimelineEventDecorator()
366362
)

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/SendingEventsDataSource.kt

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@ internal class RealmSendingEventsDataSource(
4242

4343
private var roomEntity: RoomEntity? = null
4444
private var sendingTimelineEvents: RealmList<TimelineEventEntity>? = null
45-
private var frozenSendingTimelineEvents: RealmList<TimelineEventEntity>? = null
45+
private var mappedSendingTimelineEvents: List<TimelineEvent> = emptyList()
4646

4747
private val sendingTimelineEventsListener = RealmChangeListener<RealmList<TimelineEventEntity>> { events ->
4848
if (events.isValid) {
4949
uiEchoManager.onSentEventsInDatabase(events.map { it.eventId })
50-
updateFrozenResults(events)
50+
mapSendingEvents(events)
5151
onEventsUpdated(false)
5252
}
5353
}
@@ -57,37 +57,29 @@ internal class RealmSendingEventsDataSource(
5757
roomEntity = RoomEntity.where(safeRealm, roomId = roomId).findFirst()
5858
sendingTimelineEvents = roomEntity?.sendingTimelineEvents
5959
sendingTimelineEvents?.addChangeListener(sendingTimelineEventsListener)
60-
updateFrozenResults(sendingTimelineEvents)
60+
mapSendingEvents(sendingTimelineEvents)
6161
}
6262

6363
override fun stop() {
6464
sendingTimelineEvents?.removeChangeListener(sendingTimelineEventsListener)
65-
updateFrozenResults(null)
65+
mapSendingEvents(null)
6666
sendingTimelineEvents = null
6767
roomEntity = null
6868
}
6969

70-
private fun updateFrozenResults(sendingEvents: RealmList<TimelineEventEntity>?) {
71-
// Makes sure to close the previous frozen realm
72-
if (frozenSendingTimelineEvents?.isValid == true) {
73-
frozenSendingTimelineEvents?.realm?.close()
74-
}
75-
frozenSendingTimelineEvents = sendingEvents?.freeze()
70+
private fun mapSendingEvents(sendingEvents: RealmList<TimelineEventEntity>?) {
71+
mappedSendingTimelineEvents = sendingEvents?.map { timelineEventMapper.map(it) }.orEmpty()
7672
}
7773

7874
override fun buildSendingEvents(): List<TimelineEvent> {
7975
val builtSendingEvents = mutableListOf<TimelineEvent>()
8076
uiEchoManager.getInMemorySendingEvents()
8177
.addWithUiEcho(builtSendingEvents)
82-
if (frozenSendingTimelineEvents?.isValid == true) {
83-
frozenSendingTimelineEvents
84-
?.filter { timelineEvent ->
85-
builtSendingEvents.none { it.eventId == timelineEvent.eventId }
86-
}
87-
?.map {
88-
timelineEventMapper.map(it)
89-
}?.addWithUiEcho(builtSendingEvents)
90-
}
78+
mappedSendingTimelineEvents
79+
.filter { timelineEvent ->
80+
builtSendingEvents.none { it.eventId == timelineEvent.eventId }
81+
}
82+
.addWithUiEcho(builtSendingEvents)
9183

9284
return builtSendingEvents
9385
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/TimelineChunk.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ package org.matrix.android.sdk.internal.session.room.timeline
1818

1919
import io.realm.OrderedCollectionChangeSet
2020
import io.realm.OrderedRealmCollectionChangeListener
21-
import io.realm.Realm
22-
import io.realm.RealmConfiguration
2321
import io.realm.RealmObjectChangeListener
2422
import io.realm.RealmQuery
2523
import io.realm.RealmResults
@@ -48,7 +46,6 @@ import org.matrix.android.sdk.internal.session.sync.handler.room.ThreadsAwarenes
4846
import timber.log.Timber
4947
import java.util.Collections
5048
import java.util.concurrent.atomic.AtomicBoolean
51-
import java.util.concurrent.atomic.AtomicReference
5249

5350
/**
5451
* This is a wrapper around a ChunkEntity in the database.
@@ -63,7 +60,6 @@ internal class TimelineChunk(
6360
private val fetchThreadTimelineTask: FetchThreadTimelineTask,
6461
private val eventDecryptor: TimelineEventDecryptor,
6562
private val paginationTask: PaginationTask,
66-
private val realmConfiguration: RealmConfiguration,
6763
private val fetchTokenAndPaginateTask: FetchTokenAndPaginateTask,
6864
private val timelineEventMapper: TimelineEventMapper,
6965
private val uiEchoManager: UIEchoManager?,
@@ -72,7 +68,6 @@ internal class TimelineChunk(
7268
private val initialEventId: String?,
7369
private val onBuiltEvents: (Boolean) -> Unit,
7470
private val onEventsDeleted: () -> Unit,
75-
private val realm: AtomicReference<Realm>,
7671
private val decorator: TimelineEventDecorator,
7772
val localEchoEventFactory: LocalEchoEventFactory,
7873
) {
@@ -605,7 +600,6 @@ internal class TimelineChunk(
605600
timelineId = timelineId,
606601
eventDecryptor = eventDecryptor,
607602
paginationTask = paginationTask,
608-
realmConfiguration = realmConfiguration,
609603
fetchThreadTimelineTask = fetchThreadTimelineTask,
610604
fetchTokenAndPaginateTask = fetchTokenAndPaginateTask,
611605
timelineEventMapper = timelineEventMapper,
@@ -616,7 +610,6 @@ internal class TimelineChunk(
616610
onBuiltEvents = this.onBuiltEvents,
617611
onEventsDeleted = this.onEventsDeleted,
618612
decorator = this.decorator,
619-
realm = realm,
620613
localEchoEventFactory = localEchoEventFactory
621614
)
622615
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/timeline/decorator/UiEchoDecorator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ package org.matrix.android.sdk.internal.session.room.timeline.decorator
1919
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
2020
import org.matrix.android.sdk.internal.session.room.timeline.UIEchoManager
2121

22-
internal class UiEchoDecorator(private val uiEchoManager: UIEchoManager?) : TimelineEventDecorator {
22+
internal class UiEchoDecorator(private val uiEchoManager: UIEchoManager) : TimelineEventDecorator {
2323

2424
override fun decorate(timelineEvent: TimelineEvent): TimelineEvent {
25-
return uiEchoManager?.decorateEventWithReactionUiEcho(timelineEvent) ?: timelineEvent
25+
return uiEchoManager.decorateEventWithReactionUiEcho(timelineEvent)
2626
}
2727
}

matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/handler/SyncResponsePostTreatmentAggregatorHandler.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ internal class SyncResponsePostTreatmentAggregatorHandler @Inject constructor(
105105
.enqueue()
106106
}
107107

108-
private fun handleUserIdsForCheckingTrustAndAffectedRoomShields(userIdsWithDeviceUpdate: Iterable<String>) {
108+
private fun handleUserIdsForCheckingTrustAndAffectedRoomShields(userIdsWithDeviceUpdate: Collection<String>) {
109+
if (userIdsWithDeviceUpdate.isEmpty()) return
109110
crossSigningService.checkTrustAndAffectedRoomShields(userIdsWithDeviceUpdate.toList())
110111
}
111112
}

vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ class TimelineFragment :
797797
}
798798
// We use a custom layout for this menu item, so we need to set a ClickListener
799799
menu.findItem(R.id.open_matrix_apps)?.let { menuItem ->
800-
menuItem.actionView?.debouncedClicks {
800+
menuItem.actionView?.setOnClickListener {
801801
handleMenuItemSelected(menuItem)
802802
}
803803
}
@@ -808,7 +808,7 @@ class TimelineFragment :
808808

809809
// Custom thread notification menu item
810810
menu.findItem(R.id.menu_timeline_thread_list)?.let { menuItem ->
811-
menuItem.actionView?.debouncedClicks {
811+
menuItem.actionView?.setOnClickListener {
812812
handleMenuItemSelected(menuItem)
813813
}
814814
}

0 commit comments

Comments
 (0)