mirror of
https://github.com/element-hq/element-android
synced 2024-11-27 03:48:12 +03:00
Timeline: get better perf
This commit is contained in:
parent
f06211ce4f
commit
6c7bc2b40c
5 changed files with 48 additions and 19 deletions
|
@ -17,12 +17,9 @@
|
||||||
package im.vector.riotredesign.core.extensions
|
package im.vector.riotredesign.core.extensions
|
||||||
|
|
||||||
import im.vector.matrix.android.api.session.events.model.Event
|
import im.vector.matrix.android.api.session.events.model.Event
|
||||||
import org.threeten.bp.Instant
|
import im.vector.riotredesign.core.resources.DateProvider
|
||||||
import org.threeten.bp.LocalDateTime
|
import org.threeten.bp.LocalDateTime
|
||||||
import org.threeten.bp.ZoneId
|
|
||||||
|
|
||||||
|
|
||||||
fun Event.localDateTime(): LocalDateTime {
|
fun Event.localDateTime(): LocalDateTime {
|
||||||
val instant = Instant.ofEpochMilli(originServerTs ?: 0)
|
return DateProvider.toLocalDateTime(originServerTs)
|
||||||
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
|
|
||||||
}
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2019 New Vector Ltd
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package im.vector.riotredesign.core.resources
|
||||||
|
|
||||||
|
import org.threeten.bp.Instant
|
||||||
|
import org.threeten.bp.LocalDateTime
|
||||||
|
import org.threeten.bp.ZoneId
|
||||||
|
|
||||||
|
object DateProvider {
|
||||||
|
|
||||||
|
private val zoneId = ZoneId.systemDefault()
|
||||||
|
|
||||||
|
fun toLocalDateTime(timestamp: Long?): LocalDateTime {
|
||||||
|
val instant = Instant.ofEpochMilli(timestamp ?: 0)
|
||||||
|
return LocalDateTime.ofInstant(instant, zoneId)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -30,13 +30,13 @@ class HomeNavigator {
|
||||||
|
|
||||||
var activity: HomeActivity? = null
|
var activity: HomeActivity? = null
|
||||||
|
|
||||||
private var currentRoomId: String? = null
|
private var rootRoomId: String? = null
|
||||||
|
|
||||||
fun openRoomDetail(roomId: String,
|
fun openRoomDetail(roomId: String,
|
||||||
eventId: String?,
|
eventId: String?,
|
||||||
addToBackstack: Boolean = false) {
|
addToBackstack: Boolean = false) {
|
||||||
Timber.v("Open room detail $roomId - $eventId - $addToBackstack")
|
Timber.v("Open room detail $roomId - $eventId - $addToBackstack")
|
||||||
if (!addToBackstack && isRoomOpened(roomId)) {
|
if (!addToBackstack && isRoot(roomId)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
activity?.let {
|
activity?.let {
|
||||||
|
@ -46,7 +46,7 @@ class HomeNavigator {
|
||||||
if (addToBackstack) {
|
if (addToBackstack) {
|
||||||
it.addFragmentToBackstack(roomDetailFragment, R.id.homeDetailFragmentContainer, roomId)
|
it.addFragmentToBackstack(roomDetailFragment, R.id.homeDetailFragmentContainer, roomId)
|
||||||
} else {
|
} else {
|
||||||
currentRoomId = roomId
|
rootRoomId = roomId
|
||||||
clearBackStack(it.supportFragmentManager)
|
clearBackStack(it.supportFragmentManager)
|
||||||
it.replaceFragment(roomDetailFragment, R.id.homeDetailFragmentContainer)
|
it.replaceFragment(roomDetailFragment, R.id.homeDetailFragmentContainer)
|
||||||
}
|
}
|
||||||
|
@ -61,9 +61,7 @@ class HomeNavigator {
|
||||||
Timber.v("Open user detail $userId")
|
Timber.v("Open user detail $userId")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isRoomOpened(roomId: String): Boolean {
|
// Private Methods *****************************************************************************
|
||||||
return currentRoomId == roomId
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun clearBackStack(fragmentManager: FragmentManager) {
|
private fun clearBackStack(fragmentManager: FragmentManager) {
|
||||||
if (fragmentManager.backStackEntryCount > 0) {
|
if (fragmentManager.backStackEntryCount > 0) {
|
||||||
|
@ -72,4 +70,8 @@ class HomeNavigator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun isRoot(roomId: String): Boolean {
|
||||||
|
return rootRoomId == roomId
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -37,9 +37,6 @@ class TimelineEventController(private val roomId: String,
|
||||||
EpoxyAsyncUtil.getAsyncBackgroundHandler(),
|
EpoxyAsyncUtil.getAsyncBackgroundHandler(),
|
||||||
EpoxyAsyncUtil.getAsyncBackgroundHandler()
|
EpoxyAsyncUtil.getAsyncBackgroundHandler()
|
||||||
) {
|
) {
|
||||||
init {
|
|
||||||
setFilterDuplicates(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
private var isLoadingForward: Boolean = false
|
private var isLoadingForward: Boolean = false
|
||||||
private var isLoadingBackward: Boolean = false
|
private var isLoadingBackward: Boolean = false
|
||||||
|
|
|
@ -34,22 +34,23 @@ internal class RoomMemberExtractor(private val monarchy: Monarchy,
|
||||||
private val cached = HashMap<String, RoomMember?>()
|
private val cached = HashMap<String, RoomMember?>()
|
||||||
|
|
||||||
fun extractFrom(event: EventEntity): RoomMember? {
|
fun extractFrom(event: EventEntity): RoomMember? {
|
||||||
if (cached.containsKey(event.eventId)) {
|
|
||||||
return cached[event.eventId]
|
|
||||||
}
|
|
||||||
val sender = event.sender ?: return null
|
val sender = event.sender ?: return null
|
||||||
|
val cacheKey = sender + event.stateIndex
|
||||||
|
if (cached.containsKey(cacheKey)) {
|
||||||
|
return cached[cacheKey]
|
||||||
|
}
|
||||||
// If the event is unlinked we want to fetch unlinked state events
|
// If the event is unlinked we want to fetch unlinked state events
|
||||||
val unlinked = event.isUnlinked
|
val unlinked = event.isUnlinked
|
||||||
// When stateIndex is negative, we try to get the next stateEvent prevContent()
|
// When stateIndex is negative, we try to get the next stateEvent prevContent()
|
||||||
// If prevContent is null we fallback to the Int.MIN state events content()
|
// If prevContent is null we fallback to the Int.MIN state events content()
|
||||||
val content = if (event.stateIndex <= 0) {
|
val content = if (event.stateIndex <= 0) {
|
||||||
baseQuery(monarchy, roomId, sender, unlinked).next(from = event.stateIndex)?.prevContent
|
baseQuery(monarchy, roomId, sender, unlinked).next(from = event.stateIndex)?.prevContent
|
||||||
?: baseQuery(monarchy, roomId, sender, unlinked).last(since = event.stateIndex)?.content
|
?: baseQuery(monarchy, roomId, sender, unlinked).last(since = event.stateIndex)?.content
|
||||||
} else {
|
} else {
|
||||||
baseQuery(monarchy, roomId, sender, unlinked).last(since = event.stateIndex)?.content
|
baseQuery(monarchy, roomId, sender, unlinked).last(since = event.stateIndex)?.content
|
||||||
}
|
}
|
||||||
val roomMember: RoomMember? = ContentMapper.map(content).toModel()
|
val roomMember: RoomMember? = ContentMapper.map(content).toModel()
|
||||||
cached[event.eventId] = roomMember
|
cached[cacheKey] = roomMember
|
||||||
return roomMember
|
return roomMember
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue