mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-16 02:05:06 +08:00
Merge branch 'hotfix/1.4.20' into main
This commit is contained in:
commit
31bc66717f
@ -1,3 +1,12 @@
|
|||||||
|
Changes in Element 1.4.20 (2022-06-13)
|
||||||
|
======================================
|
||||||
|
|
||||||
|
Bugfixes 🐛
|
||||||
|
----------
|
||||||
|
- Fix: All rooms are shown in Home regardless of the switch state. ([#6272](https://github.com/vector-im/element-android/issues/6272))
|
||||||
|
- Fix regression on EventInsertLiveObserver getting blocked so there is no event being processed anymore. ([#6278](https://github.com/vector-im/element-android/issues/6278))
|
||||||
|
|
||||||
|
|
||||||
Changes in Element 1.4.19 (2022-06-07)
|
Changes in Element 1.4.19 (2022-06-07)
|
||||||
======================================
|
======================================
|
||||||
|
|
||||||
|
2
fastlane/metadata/android/en-US/changelogs/40104200.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40104200.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Main changes in this version: Various bug fixes and stability improvements.
|
||||||
|
Full changelog: https://github.com/vector-im/element-android/releases
|
@ -56,7 +56,7 @@ android {
|
|||||||
// that the app's state is completely cleared between tests.
|
// that the app's state is completely cleared between tests.
|
||||||
testInstrumentationRunnerArguments clearPackageData: 'true'
|
testInstrumentationRunnerArguments clearPackageData: 'true'
|
||||||
|
|
||||||
buildConfigField "String", "SDK_VERSION", "\"1.4.19\""
|
buildConfigField "String", "SDK_VERSION", "\"1.4.20\""
|
||||||
|
|
||||||
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
||||||
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
|
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
|
||||||
|
@ -19,10 +19,9 @@ package org.matrix.android.sdk.internal.database
|
|||||||
import com.zhuinden.monarchy.Monarchy
|
import com.zhuinden.monarchy.Monarchy
|
||||||
import io.realm.RealmConfiguration
|
import io.realm.RealmConfiguration
|
||||||
import io.realm.RealmResults
|
import io.realm.RealmResults
|
||||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
|
||||||
import kotlinx.coroutines.flow.launchIn
|
|
||||||
import kotlinx.coroutines.flow.onEach
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.sync.Mutex
|
||||||
|
import kotlinx.coroutines.sync.withLock
|
||||||
import org.matrix.android.sdk.internal.database.mapper.asDomain
|
import org.matrix.android.sdk.internal.database.mapper.asDomain
|
||||||
import org.matrix.android.sdk.internal.database.model.EventEntity
|
import org.matrix.android.sdk.internal.database.model.EventEntity
|
||||||
import org.matrix.android.sdk.internal.database.model.EventInsertEntity
|
import org.matrix.android.sdk.internal.database.model.EventInsertEntity
|
||||||
@ -37,65 +36,58 @@ internal class EventInsertLiveObserver @Inject constructor(@SessionDatabase real
|
|||||||
private val processors: Set<@JvmSuppressWildcards EventInsertLiveProcessor>) :
|
private val processors: Set<@JvmSuppressWildcards EventInsertLiveProcessor>) :
|
||||||
RealmLiveEntityObserver<EventInsertEntity>(realmConfiguration) {
|
RealmLiveEntityObserver<EventInsertEntity>(realmConfiguration) {
|
||||||
|
|
||||||
|
private val lock = Mutex()
|
||||||
|
|
||||||
override val query = Monarchy.Query {
|
override val query = Monarchy.Query {
|
||||||
it.where(EventInsertEntity::class.java).equalTo(EventInsertEntityFields.CAN_BE_PROCESSED, true)
|
it.where(EventInsertEntity::class.java).equalTo(EventInsertEntityFields.CAN_BE_PROCESSED, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val onResultsChangedFlow = MutableSharedFlow<RealmResults<EventInsertEntity>>()
|
|
||||||
|
|
||||||
init {
|
|
||||||
onResultsChangedFlow
|
|
||||||
.onEach { handleChange(it) }
|
|
||||||
.launchIn(observerScope)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onChange(results: RealmResults<EventInsertEntity>) {
|
override fun onChange(results: RealmResults<EventInsertEntity>) {
|
||||||
if (!results.isLoaded || results.isEmpty()) {
|
observerScope.launch {
|
||||||
return
|
lock.withLock {
|
||||||
}
|
if (!results.isLoaded || results.isEmpty()) {
|
||||||
observerScope.launch { onResultsChangedFlow.emit(results) }
|
return@withLock
|
||||||
}
|
|
||||||
|
|
||||||
private suspend fun handleChange(results: RealmResults<EventInsertEntity>) {
|
|
||||||
val idsToDeleteAfterProcess = ArrayList<String>()
|
|
||||||
val filteredEvents = ArrayList<EventInsertEntity>(results.size)
|
|
||||||
Timber.v("EventInsertEntity updated with ${results.size} results in db")
|
|
||||||
results.forEach {
|
|
||||||
if (shouldProcess(it)) {
|
|
||||||
// don't use copy from realm over there
|
|
||||||
val copiedEvent = EventInsertEntity(
|
|
||||||
eventId = it.eventId,
|
|
||||||
eventType = it.eventType
|
|
||||||
).apply {
|
|
||||||
insertType = it.insertType
|
|
||||||
}
|
}
|
||||||
filteredEvents.add(copiedEvent)
|
val idsToDeleteAfterProcess = ArrayList<String>()
|
||||||
|
val filteredEvents = ArrayList<EventInsertEntity>(results.size)
|
||||||
|
Timber.v("EventInsertEntity updated with ${results.size} results in db")
|
||||||
|
results.forEach {
|
||||||
|
if (shouldProcess(it)) {
|
||||||
|
// don't use copy from realm over there
|
||||||
|
val copiedEvent = EventInsertEntity(
|
||||||
|
eventId = it.eventId,
|
||||||
|
eventType = it.eventType
|
||||||
|
).apply {
|
||||||
|
insertType = it.insertType
|
||||||
|
}
|
||||||
|
filteredEvents.add(copiedEvent)
|
||||||
|
}
|
||||||
|
idsToDeleteAfterProcess.add(it.eventId)
|
||||||
|
}
|
||||||
|
awaitTransaction(realmConfiguration) { realm ->
|
||||||
|
Timber.v("##Transaction: There are ${filteredEvents.size} events to process ")
|
||||||
|
filteredEvents.forEach { eventInsert ->
|
||||||
|
val eventId = eventInsert.eventId
|
||||||
|
val event = EventEntity.where(realm, eventId).findFirst()
|
||||||
|
if (event == null) {
|
||||||
|
Timber.v("Event $eventId not found")
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
val domainEvent = event.asDomain()
|
||||||
|
processors.filter {
|
||||||
|
it.shouldProcess(eventId, domainEvent.getClearType(), eventInsert.insertType)
|
||||||
|
}.forEach {
|
||||||
|
it.process(realm, domainEvent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
realm.where(EventInsertEntity::class.java)
|
||||||
|
.`in`(EventInsertEntityFields.EVENT_ID, idsToDeleteAfterProcess.toTypedArray())
|
||||||
|
.findAll()
|
||||||
|
.deleteAllFromRealm()
|
||||||
|
}
|
||||||
|
processors.forEach { it.onPostProcess() }
|
||||||
}
|
}
|
||||||
idsToDeleteAfterProcess.add(it.eventId)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
awaitTransaction(realmConfiguration) { realm ->
|
|
||||||
Timber.v("##Transaction: There are ${filteredEvents.size} events to process ")
|
|
||||||
filteredEvents.forEach { eventInsert ->
|
|
||||||
val eventId = eventInsert.eventId
|
|
||||||
val event = EventEntity.where(realm, eventId).findFirst()
|
|
||||||
if (event == null) {
|
|
||||||
Timber.v("Event $eventId not found")
|
|
||||||
return@forEach
|
|
||||||
}
|
|
||||||
val domainEvent = event.asDomain()
|
|
||||||
processors.filter {
|
|
||||||
it.shouldProcess(eventId, domainEvent.getClearType(), eventInsert.insertType)
|
|
||||||
}.forEach {
|
|
||||||
it.process(realm, domainEvent)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
realm.where(EventInsertEntity::class.java)
|
|
||||||
.`in`(EventInsertEntityFields.EVENT_ID, idsToDeleteAfterProcess.toTypedArray())
|
|
||||||
.findAll()
|
|
||||||
.deleteAllFromRealm()
|
|
||||||
}
|
|
||||||
processors.forEach { it.onPostProcess() }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun shouldProcess(eventInsertEntity: EventInsertEntity): Boolean {
|
private fun shouldProcess(eventInsertEntity: EventInsertEntity): Boolean {
|
||||||
|
@ -31,7 +31,7 @@ ext.versionMinor = 4
|
|||||||
// Note: even values are reserved for regular release, odd values for hotfix release.
|
// Note: even values are reserved for regular release, odd values for hotfix release.
|
||||||
// When creating a hotfix, you should decrease the value, since the current value
|
// When creating a hotfix, you should decrease the value, since the current value
|
||||||
// is the value for the next regular release.
|
// is the value for the next regular release.
|
||||||
ext.versionPatch = 19
|
ext.versionPatch = 20
|
||||||
|
|
||||||
static def getGitTimestamp() {
|
static def getGitTimestamp() {
|
||||||
def cmd = 'git show -s --format=%ct'
|
def cmd = 'git show -s --format=%ct'
|
||||||
|
@ -289,7 +289,7 @@ class HomeDetailViewModel @AssistedInject constructor(
|
|||||||
.launchIn(viewModelScope)
|
.launchIn(viewModelScope)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun RoomGroupingMethod.BySpace.toActiveSpaceOrOrphanRooms(): SpaceFilter? {
|
private fun RoomGroupingMethod.BySpace.toActiveSpaceOrOrphanRooms(): SpaceFilter {
|
||||||
return spaceSummary?.roomId?.toActiveSpaceOrOrphanRooms()
|
return spaceSummary?.roomId.toActiveSpaceOrOrphanRooms()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -371,7 +371,7 @@ class RoomListSectionBuilderSpace(
|
|||||||
activeSpaceUpdaters.add(object : RoomListViewModel.ActiveSpaceQueryUpdater {
|
activeSpaceUpdaters.add(object : RoomListViewModel.ActiveSpaceQueryUpdater {
|
||||||
override fun updateForSpaceId(roomId: String?) {
|
override fun updateForSpaceId(roomId: String?) {
|
||||||
filteredPagedRoomSummariesLive.queryParams = roomQueryParams.copy(
|
filteredPagedRoomSummariesLive.queryParams = roomQueryParams.copy(
|
||||||
spaceFilter = roomId?.toActiveSpaceOrOrphanRooms()
|
spaceFilter = roomId.toActiveSpaceOrOrphanRooms()
|
||||||
)
|
)
|
||||||
liveQueryParams.update { filteredPagedRoomSummariesLive.queryParams }
|
liveQueryParams.update { filteredPagedRoomSummariesLive.queryParams }
|
||||||
}
|
}
|
||||||
@ -437,7 +437,7 @@ class RoomListSectionBuilderSpace(
|
|||||||
return when (spaceFilter) {
|
return when (spaceFilter) {
|
||||||
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL -> {
|
RoomListViewModel.SpaceFilterStrategy.ORPHANS_IF_SPACE_NULL -> {
|
||||||
copy(
|
copy(
|
||||||
spaceFilter = currentSpace?.toActiveSpaceOrOrphanRooms()
|
spaceFilter = currentSpace.toActiveSpaceOrOrphanRooms()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL -> {
|
RoomListViewModel.SpaceFilterStrategy.ALL_IF_SPACE_NULL -> {
|
||||||
|
Loading…
Reference in New Issue
Block a user