Apply ktlinFormat

This commit is contained in:
ariskotsomitopoulos 2021-12-21 13:23:17 +02:00
parent cc7e3ea78c
commit ed48eb38c9
35 changed files with 28 additions and 75 deletions

View file

@ -21,7 +21,6 @@ import kotlinx.coroutines.flow.Flow
import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.Room import org.matrix.android.sdk.api.session.room.Room
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams import org.matrix.android.sdk.api.session.room.members.RoomMemberQueryParams
import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary import org.matrix.android.sdk.api.session.room.model.EventAnnotationsSummary
import org.matrix.android.sdk.api.session.room.model.ReadReceipt import org.matrix.android.sdk.api.session.room.model.ReadReceipt

View file

@ -91,5 +91,4 @@ interface TimelineService {
* @param rootThreadEventId the eventId of the current thread * @param rootThreadEventId the eventId of the current thread
*/ */
suspend fun markThreadAsRead(rootThreadEventId: String) suspend fun markThreadAsRead(rootThreadEventId: String)
} }

View file

@ -30,5 +30,4 @@ enum class ThreadNotificationState {
// The is at least one new message that should bi highlighted // The is at least one new message that should bi highlighted
// ex. "Hello @aris.kotsomitopoulos" // ex. "Hello @aris.kotsomitopoulos"
NEW_HIGHLIGHTED_MESSAGE; NEW_HIGHLIGHTED_MESSAGE;
} }

View file

@ -26,7 +26,6 @@ import org.matrix.android.sdk.api.session.room.model.VersioningState
import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.api.session.threads.ThreadNotificationState import org.matrix.android.sdk.api.session.threads.ThreadNotificationState
import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields
import org.matrix.android.sdk.internal.database.model.EditAggregatedSummaryEntityFields import org.matrix.android.sdk.internal.database.model.EditAggregatedSummaryEntityFields
import org.matrix.android.sdk.internal.database.model.EditionOfEventFields import org.matrix.android.sdk.internal.database.model.EditionOfEventFields
@ -89,7 +88,6 @@ internal class RealmSessionStoreMigration @Inject constructor(
if (oldVersion <= 17) migrateTo18(realm) if (oldVersion <= 17) migrateTo18(realm)
if (oldVersion <= 18) migrateTo19(realm) if (oldVersion <= 18) migrateTo19(realm)
if (oldVersion <= 19) migrateTo20(realm) if (oldVersion <= 19) migrateTo20(realm)
} }
private fun migrateTo1(realm: DynamicRealm) { private fun migrateTo1(realm: DynamicRealm) {

View file

@ -37,13 +37,10 @@ import org.matrix.android.sdk.internal.database.query.whereRoomId
* of threads included. If there is no root thread event no action is done * of threads included. If there is no root thread event no action is done
*/ */
internal fun Map<String, EventEntity>.updateThreadSummaryIfNeeded(roomId: String, realm: Realm, currentUserId: String) { internal fun Map<String, EventEntity>.updateThreadSummaryIfNeeded(roomId: String, realm: Realm, currentUserId: String) {
if (!BuildConfig.THREADING_ENABLED) return if (!BuildConfig.THREADING_ENABLED) return
for ((rootThreadEventId, eventEntity) in this) { for ((rootThreadEventId, eventEntity) in this) {
eventEntity.findAllThreadsForRootEventId(eventEntity.realm, rootThreadEventId).let { eventEntity.findAllThreadsForRootEventId(eventEntity.realm, rootThreadEventId).let {
if (it.isNullOrEmpty()) return@let if (it.isNullOrEmpty()) return@let
val latestMessage = it.firstOrNull() val latestMessage = it.firstOrNull()
@ -55,7 +52,6 @@ internal fun Map<String, EventEntity>.updateThreadSummaryIfNeeded(roomId: String
threadsCounted = it.size, threadsCounted = it.size,
latestMessageTimelineEventEntity = latestMessage latestMessageTimelineEventEntity = latestMessage
) )
} }
} }
@ -175,7 +171,6 @@ internal fun isUserMentioned(currentUserId: String, timelineEventEntity: Timelin
* immediately so we should not display wrong notifications * immediately so we should not display wrong notifications
*/ */
internal fun updateNotificationsNew(roomId: String, realm: Realm, currentUserId: String) { internal fun updateNotificationsNew(roomId: String, realm: Realm, currentUserId: String) {
val readReceipt = findMyReadReceipt(realm, roomId, currentUserId) ?: return val readReceipt = findMyReadReceipt(realm, roomId, currentUserId) ?: return
val readReceiptChunk = ChunkEntity val readReceiptChunk = ChunkEntity
@ -190,7 +185,7 @@ internal fun updateNotificationsNew(roomId: String, realm: Realm, currentUserId:
val readReceiptChunkPosition = readReceiptChunkTimelineEvents.indexOfFirst { it.eventId == readReceipt } val readReceiptChunkPosition = readReceiptChunkTimelineEvents.indexOfFirst { it.eventId == readReceipt }
if(readReceiptChunkPosition == -1) return if (readReceiptChunkPosition == -1) return
if (readReceiptChunkPosition < readReceiptChunkTimelineEvents.lastIndex) { if (readReceiptChunkPosition < readReceiptChunkTimelineEvents.lastIndex) {
// If the read receipt is found inside the chunk // If the read receipt is found inside the chunk

View file

@ -44,7 +44,6 @@ internal open class ChunkEntity(@Index var prevToken: String? = null,
val room: RealmResults<RoomEntity>? = null val room: RealmResults<RoomEntity>? = null
companion object companion object
} }
internal fun ChunkEntity.deleteOnCascade(deleteStateEvents: Boolean, canDeleteRoot: Boolean) { internal fun ChunkEntity.deleteOnCascade(deleteStateEvents: Boolean, canDeleteRoot: Boolean) {

View file

@ -95,5 +95,4 @@ internal open class EventEntity(@Index var eventId: String = "",
} }
fun isThread(): Boolean = rootThreadEventId != null fun isThread(): Boolean = rootThreadEventId != null
} }

View file

@ -46,9 +46,6 @@ internal fun ChunkEntity.Companion.findLastForwardChunkOfRoom(realm: Realm, room
.findFirst() .findFirst()
} }
internal fun ChunkEntity.Companion.findAllIncludingEvents(realm: Realm, eventIds: List<String>): RealmResults<ChunkEntity> { internal fun ChunkEntity.Companion.findAllIncludingEvents(realm: Realm, eventIds: List<String>): RealmResults<ChunkEntity> {
return realm.where<ChunkEntity>() return realm.where<ChunkEntity>()
.`in`(ChunkEntityFields.TIMELINE_EVENTS.EVENT_ID, eventIds.toTypedArray()) .`in`(ChunkEntityFields.TIMELINE_EVENTS.EVENT_ID, eventIds.toTypedArray())
@ -59,7 +56,6 @@ internal fun ChunkEntity.Companion.findIncludingEvent(realm: Realm, eventId: Str
return findAllIncludingEvents(realm, listOf(eventId)).firstOrNull() return findAllIncludingEvents(realm, listOf(eventId)).firstOrNull()
} }
internal fun ChunkEntity.Companion.create( internal fun ChunkEntity.Companion.create(
realm: Realm, realm: Realm,
prevToken: String?, prevToken: String?,

View file

@ -49,13 +49,11 @@ internal fun EventEntity.Companion.where(realm: Realm, eventId: String): RealmQu
.equalTo(EventEntityFields.EVENT_ID, eventId) .equalTo(EventEntityFields.EVENT_ID, eventId)
} }
internal fun EventEntity.Companion.whereRoomId(realm: Realm, roomId: String): RealmQuery<EventEntity> { internal fun EventEntity.Companion.whereRoomId(realm: Realm, roomId: String): RealmQuery<EventEntity> {
return realm.where<EventEntity>() return realm.where<EventEntity>()
.equalTo(EventEntityFields.ROOM_ID, roomId) .equalTo(EventEntityFields.ROOM_ID, roomId)
} }
internal fun EventEntity.Companion.where(realm: Realm, eventIds: List<String>): RealmQuery<EventEntity> { internal fun EventEntity.Companion.where(realm: Realm, eventIds: List<String>): RealmQuery<EventEntity> {
return realm.where<EventEntity>() return realm.where<EventEntity>()
.`in`(EventEntityFields.EVENT_ID, eventIds.toTypedArray()) .`in`(EventEntityFields.EVENT_ID, eventIds.toTypedArray())

View file

@ -25,11 +25,9 @@ import io.realm.kotlin.where
import org.matrix.android.sdk.api.session.room.send.SendState import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.room.timeline.TimelineEventFilters import org.matrix.android.sdk.api.session.room.timeline.TimelineEventFilters
import org.matrix.android.sdk.internal.database.model.ChunkEntity import org.matrix.android.sdk.internal.database.model.ChunkEntity
import org.matrix.android.sdk.internal.database.model.ChunkEntityFields
import org.matrix.android.sdk.internal.database.model.RoomEntity import org.matrix.android.sdk.internal.database.model.RoomEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntity import org.matrix.android.sdk.internal.database.model.TimelineEventEntity
import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
import timber.log.Timber
internal fun TimelineEventEntity.Companion.where(realm: Realm, roomId: String, eventId: String): RealmQuery<TimelineEventEntity> { internal fun TimelineEventEntity.Companion.where(realm: Realm, roomId: String, eventId: String): RealmQuery<TimelineEventEntity> {
return realm.where<TimelineEventEntity>() return realm.where<TimelineEventEntity>()

View file

@ -169,7 +169,6 @@ internal class DefaultRelationService @AssistedInject constructor(
autoMarkdown: Boolean, autoMarkdown: Boolean,
formattedText: String?, formattedText: String?,
eventReplied: TimelineEvent?): Cancelable? { eventReplied: TimelineEvent?): Cancelable? {
val event = if (eventReplied != null) { val event = if (eventReplied != null) {
eventFactory.createReplyTextEvent( eventFactory.createReplyTextEvent(
roomId = roomId, roomId = roomId,

View file

@ -258,7 +258,6 @@ internal class DefaultSendService @AssistedInject constructor(
roomIds: Set<String>, roomIds: Set<String>,
rootThreadEventId: String? rootThreadEventId: String?
): Cancelable { ): Cancelable {
// Ensure that the event will not be send in a thread if we are a different flow. // Ensure that the event will not be send in a thread if we are a different flow.
// Like sending files to multiple rooms // Like sending files to multiple rooms
val rootThreadId = if (roomIds.isNotEmpty()) null else rootThreadEventId val rootThreadId = if (roomIds.isNotEmpty()) null else rootThreadEventId

View file

@ -397,7 +397,6 @@ internal class LocalEchoEventFactory @Inject constructor(
msgType: String, msgType: String,
autoMarkdown: Boolean, autoMarkdown: Boolean,
formattedText: String?): Event { formattedText: String?): Event {
val content = formattedText?.let { TextContent(text, it) } ?: createTextContent(text, autoMarkdown) val content = formattedText?.let { TextContent(text, it) } ?: createTextContent(text, autoMarkdown)
return createEvent( return createEvent(
roomId, roomId,

View file

@ -180,7 +180,6 @@ internal class DefaultTimeline(
.endGroup() .endGroup()
.sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING) .sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING)
.findAll() .findAll()
} ?: buildEventQuery(realm).sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING).findAll() } ?: buildEventQuery(realm).sort(TimelineEventEntityFields.DISPLAY_INDEX, Sort.DESCENDING).findAll()
timelineEvents.addChangeListener(eventsChangeListener) timelineEvents.addChangeListener(eventsChangeListener)
@ -332,7 +331,6 @@ internal class DefaultTimeline(
val firstCacheEvent = results.firstOrNull() val firstCacheEvent = results.firstOrNull()
val chunkEntity = getLiveChunk() val chunkEntity = getLiveChunk()
updateState(Timeline.Direction.FORWARDS) { updateState(Timeline.Direction.FORWARDS) {
it.copy( it.copy(
hasMoreInCache = !builtEventsIdMap.containsKey(firstCacheEvent?.eventId), // what is in DB hasMoreInCache = !builtEventsIdMap.containsKey(firstCacheEvent?.eventId), // what is in DB
@ -340,7 +338,6 @@ internal class DefaultTimeline(
) )
} }
updateState(Timeline.Direction.BACKWARDS) { updateState(Timeline.Direction.BACKWARDS) {
it.copy( it.copy(
hasMoreInCache = !builtEventsIdMap.containsKey(lastCacheEvent?.eventId), hasMoreInCache = !builtEventsIdMap.containsKey(lastCacheEvent?.eventId),
hasReachedEnd = if (isFromThreadTimeline) true else chunkEntity?.isLastBackward ?: false || lastCacheEvent?.root?.type == EventType.STATE_ROOM_CREATE hasReachedEnd = if (isFromThreadTimeline) true else chunkEntity?.isLastBackward ?: false || lastCacheEvent?.root?.type == EventType.STATE_ROOM_CREATE
@ -497,7 +494,6 @@ internal class DefaultTimeline(
* This has to be called on TimelineThread as it accesses realm live results * This has to be called on TimelineThread as it accesses realm live results
*/ */
private fun executePaginationTask(direction: Timeline.Direction, limit: Int) { private fun executePaginationTask(direction: Timeline.Direction, limit: Int) {
val currentChunk = getLiveChunk() val currentChunk = getLiveChunk()
val token = if (direction == Timeline.Direction.BACKWARDS) currentChunk?.prevToken else currentChunk?.nextToken val token = if (direction == Timeline.Direction.BACKWARDS) currentChunk?.prevToken else currentChunk?.nextToken
if (token == null) { if (token == null) {
@ -604,8 +600,7 @@ internal class DefaultTimeline(
nextDisplayIndex = offsetIndex + 1 nextDisplayIndex = offsetIndex + 1
} }
if (!BuildConfig.THREADING_ENABLED) {
if(!BuildConfig.THREADING_ENABLED) {
// Prerequisite to in order for the ThreadsAwarenessHandler to work properly // Prerequisite to in order for the ThreadsAwarenessHandler to work properly
fetchRootThreadEventsIfNeeded(offsetResults) fetchRootThreadEventsIfNeeded(offsetResults)
} }

View file

@ -21,7 +21,6 @@ import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.session.filter.FilterRepository import org.matrix.android.sdk.internal.session.filter.FilterRepository
import org.matrix.android.sdk.internal.session.room.RoomAPI import org.matrix.android.sdk.internal.session.room.RoomAPI
import org.matrix.android.sdk.internal.task.Task import org.matrix.android.sdk.internal.task.Task
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
internal interface PaginationTask : Task<PaginationTask.Params, TokenChunkEventPersistor.Result> { internal interface PaginationTask : Task<PaginationTask.Params, TokenChunkEventPersistor.Result> {

View file

@ -115,7 +115,6 @@ internal class TimelineEventDecryptor @Inject constructor(
.findFirst() .findFirst()
eventEntity?.apply { eventEntity?.apply {
val decryptedPayload = val decryptedPayload =
if (!BuildConfig.THREADING_ENABLED) { if (!BuildConfig.THREADING_ENABLED) {
threadsAwarenessHandler.handleIfNeededDuringDecryption( threadsAwarenessHandler.handleIfNeededDuringDecryption(

View file

@ -238,7 +238,6 @@ internal class TokenChunkEventPersistor @Inject constructor(
// This is a normal event or a root thread one // This is a normal event or a root thread one
optimizedThreadSummaryMap[eventEntity.eventId] = eventEntity optimizedThreadSummaryMap[eventEntity.eventId] = eventEntity
} }
} }
// Find all the chunks which contain at least one event from the list of eventIds // Find all the chunks which contain at least one event from the list of eventIds

View file

@ -102,7 +102,7 @@ internal class SyncResponseHandler @Inject constructor(
val aggregator = SyncResponsePostTreatmentAggregator() val aggregator = SyncResponsePostTreatmentAggregator()
// Prerequisite for thread events handling in RoomSyncHandler // Prerequisite for thread events handling in RoomSyncHandler
if(!BuildConfig.THREADING_ENABLED) { if (!BuildConfig.THREADING_ENABLED) {
threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(syncResponse) threadsAwarenessHandler.fetchRootThreadEventsIfNeeded(syncResponse)
} }

View file

@ -376,7 +376,7 @@ internal class RoomSyncHandler @Inject constructor(private val readReceiptHandle
decryptIfNeeded(event, roomId) decryptIfNeeded(event, roomId)
} }
if(!BuildConfig.THREADING_ENABLED) { if (!BuildConfig.THREADING_ENABLED) {
threadsAwarenessHandler.handleIfNeeded( threadsAwarenessHandler.handleIfNeeded(
realm = realm, realm = realm,
roomId = roomId, roomId = roomId,

View file

@ -45,7 +45,6 @@ import org.matrix.android.sdk.internal.session.permalinks.PermalinkFactory
import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory import org.matrix.android.sdk.internal.session.room.send.LocalEchoEventFactory
import org.matrix.android.sdk.internal.session.room.timeline.GetEventTask import org.matrix.android.sdk.internal.session.room.timeline.GetEventTask
import org.matrix.android.sdk.internal.util.awaitTransaction import org.matrix.android.sdk.internal.util.awaitTransaction
import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
/** /**

View file

@ -25,10 +25,7 @@ import im.vector.app.BuildConfig
import im.vector.app.features.autocomplete.AutocompleteClickListener import im.vector.app.features.autocomplete.AutocompleteClickListener
import im.vector.app.features.autocomplete.RecyclerViewPresenter import im.vector.app.features.autocomplete.RecyclerViewPresenter
import im.vector.app.features.command.Command import im.vector.app.features.command.Command
import im.vector.app.features.home.room.detail.AutoCompleter
import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.VectorPreferences
import timber.log.Timber
import javax.inject.Inject
class AutocompleteCommandPresenter @AssistedInject constructor( class AutocompleteCommandPresenter @AssistedInject constructor(
@Assisted val isInThreadTimeline: Boolean, @Assisted val isInThreadTimeline: Boolean,
@ -62,8 +59,9 @@ class AutocompleteCommandPresenter @AssistedInject constructor(
.filter { .filter {
if (BuildConfig.THREADING_ENABLED && isInThreadTimeline) { if (BuildConfig.THREADING_ENABLED && isInThreadTimeline) {
it.isThreadCommand it.isThreadCommand
} else } else {
true true
}
} }
.filter { .filter {
if (query.isNullOrEmpty()) { if (query.isNullOrEmpty()) {

View file

@ -64,14 +64,14 @@ object CommandParser {
// If the command is not supported by threads return error // If the command is not supported by threads return error
if(BuildConfig.THREADING_ENABLED && isInThreadTimeline){ if (BuildConfig.THREADING_ENABLED && isInThreadTimeline) {
val slashCommand = messageParts.first() val slashCommand = messageParts.first()
val notSupportedCommandsInThreads = Command.values().filter { val notSupportedCommandsInThreads = Command.values().filter {
!it.isThreadCommand !it.isThreadCommand
}.map { }.map {
it.command it.command
} }
if(notSupportedCommandsInThreads.contains(slashCommand)){ if (notSupportedCommandsInThreads.contains(slashCommand)) {
return ParsedCommand.ErrorCommandNotSupportedInThreads(slashCommand) return ParsedCommand.ErrorCommandNotSupportedInThreads(slashCommand)
} }
} }

View file

@ -37,8 +37,8 @@ import im.vector.app.core.platform.ToolbarConfigurable
import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.platform.VectorBaseActivity
import im.vector.app.databinding.ActivityRoomDetailBinding import im.vector.app.databinding.ActivityRoomDetailBinding
import im.vector.app.features.home.room.breadcrumbs.BreadcrumbsFragment import im.vector.app.features.home.room.breadcrumbs.BreadcrumbsFragment
import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker
import im.vector.app.features.home.room.detail.arguments.TimelineArgs import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.home.room.detail.timeline.helper.VoiceMessagePlaybackTracker
import im.vector.app.features.matrixto.MatrixToBottomSheet import im.vector.app.features.matrixto.MatrixToBottomSheet
import im.vector.app.features.navigation.Navigator import im.vector.app.features.navigation.Navigator
import im.vector.app.features.room.RequireActiveMembershipAction import im.vector.app.features.room.RequireActiveMembershipAction

View file

@ -89,5 +89,4 @@ data class RoomDetailViewState(
fun isDm() = asyncRoomSummary()?.isDirect == true fun isDm() = asyncRoomSummary()?.isDirect == true
fun isThreadTimeline() = rootThreadEventId != null fun isThreadTimeline() = rootThreadEventId != null
} }

View file

@ -63,8 +63,6 @@ import com.airbnb.epoxy.EpoxyModel
import com.airbnb.epoxy.OnModelBuildFinishedListener import com.airbnb.epoxy.OnModelBuildFinishedListener
import com.airbnb.epoxy.addGlidePreloader import com.airbnb.epoxy.addGlidePreloader
import com.airbnb.epoxy.glidePreloader import com.airbnb.epoxy.glidePreloader
import com.airbnb.mvrx.Mavericks
import com.airbnb.mvrx.activityViewModel
import com.airbnb.mvrx.args import com.airbnb.mvrx.args
import com.airbnb.mvrx.fragmentViewModel import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState import com.airbnb.mvrx.withState
@ -136,7 +134,6 @@ import im.vector.app.features.command.Command
import im.vector.app.features.crypto.keysbackup.restore.KeysBackupRestoreActivity import im.vector.app.features.crypto.keysbackup.restore.KeysBackupRestoreActivity
import im.vector.app.features.crypto.verification.VerificationBottomSheet import im.vector.app.features.crypto.verification.VerificationBottomSheet
import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.UnreadMessagesSharedViewModel
import im.vector.app.features.home.room.detail.arguments.TimelineArgs import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.home.room.detail.composer.MessageComposerAction import im.vector.app.features.home.room.detail.composer.MessageComposerAction
import im.vector.app.features.home.room.detail.composer.MessageComposerView import im.vector.app.features.home.room.detail.composer.MessageComposerView
@ -975,7 +972,6 @@ class TimelineFragment @Inject constructor(
} }
override fun onPrepareOptionsMenu(menu: Menu) { override fun onPrepareOptionsMenu(menu: Menu) {
menu.forEach { menu.forEach {
it.isVisible = roomDetailViewModel.isMenuItemVisible(it.itemId) it.isVisible = roomDetailViewModel.isMenuItemVisible(it.itemId)
} }
@ -1014,7 +1010,6 @@ class TimelineFragment @Inject constructor(
// Handle custom threads badge notification // Handle custom threads badge notification
updateMenuThreadNotificationBadge(menu, state) updateMenuThreadNotificationBadge(menu, state)
} }
} }
@ -1057,7 +1052,6 @@ class TimelineFragment @Inject constructor(
val permalink = session.permalinkService().createPermalink(timelineArgs.roomId, it) val permalink = session.permalinkService().createPermalink(timelineArgs.roomId, it)
copyToClipboard(requireContext(), permalink, false) copyToClipboard(requireContext(), permalink, false)
showSnackWithMessage(getString(R.string.copied_to_clipboard)) showSnackWithMessage(getString(R.string.copied_to_clipboard))
} }
true true
} }
@ -1109,7 +1103,6 @@ class TimelineFragment @Inject constructor(
val int = RoomDetailActivity.newIntent(con, newRoom) val int = RoomDetailActivity.newIntent(con, newRoom)
int.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK int.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
con.startActivity(int) con.startActivity(int)
} }
} }
} }
@ -1388,7 +1381,7 @@ class TimelineFragment @Inject constructor(
} }
private fun updateJumpToReadMarkerViewVisibility() { private fun updateJumpToReadMarkerViewVisibility() {
if(isThreadTimeLine()) return if (isThreadTimeLine()) return
viewLifecycleOwner.lifecycleScope.launchWhenResumed { viewLifecycleOwner.lifecycleScope.launchWhenResumed {
withState(roomDetailViewModel) { withState(roomDetailViewModel) {
val showJumpToUnreadBanner = when (it.unreadState) { val showJumpToUnreadBanner = when (it.unreadState) {
@ -1488,7 +1481,7 @@ class TimelineFragment @Inject constructor(
} }
private fun observerUserTyping() { private fun observerUserTyping() {
if(isThreadTimeLine()) return if (isThreadTimeLine()) return
views.composerLayout.views.composerEditText.textChanges() views.composerLayout.views.composerEditText.textChanges()
.skipInitialValue() .skipInitialValue()
.debounce(300) .debounce(300)
@ -1774,7 +1767,6 @@ class TimelineFragment @Inject constructor(
if (roomId != timelineArgs.roomId) return false if (roomId != timelineArgs.roomId) return false
// Navigation to same room // Navigation to same room
if (!isThreadTimeLine()) { if (!isThreadTimeLine()) {
if (rootThreadEventId != null) { if (rootThreadEventId != null) {
// Thread link, so PermalinkHandler will handle the navigation // Thread link, so PermalinkHandler will handle the navigation
return false return false

View file

@ -35,7 +35,7 @@ sealed class MessageComposerAction : VectorViewModelAction {
data class InitializeVoiceRecorder(val attachmentData: ContentAttachmentData) : MessageComposerAction() data class InitializeVoiceRecorder(val attachmentData: ContentAttachmentData) : MessageComposerAction()
data class OnVoiceRecordingUiStateChanged(val uiState: VoiceMessageRecorderView.RecordingUiState) : MessageComposerAction() data class OnVoiceRecordingUiStateChanged(val uiState: VoiceMessageRecorderView.RecordingUiState) : MessageComposerAction()
object StartRecordingVoiceMessage : MessageComposerAction() object StartRecordingVoiceMessage : MessageComposerAction()
data class EndRecordingVoiceMessage(val isCancelled: Boolean,val rootThreadEventId: String?) : MessageComposerAction() data class EndRecordingVoiceMessage(val isCancelled: Boolean, val rootThreadEventId: String?) : MessageComposerAction()
object PauseRecordingVoiceMessage : MessageComposerAction() object PauseRecordingVoiceMessage : MessageComposerAction()
data class PlayOrPauseVoicePlayback(val eventId: String, val messageAudioContent: MessageAudioContent) : MessageComposerAction() data class PlayOrPauseVoicePlayback(val eventId: String, val messageAudioContent: MessageAudioContent) : MessageComposerAction()
object PlayOrPauseRecordingPlayback : MessageComposerAction() object PlayOrPauseRecordingPlayback : MessageComposerAction()

View file

@ -30,7 +30,6 @@ import im.vector.app.features.attachments.toContentAttachmentData
import im.vector.app.features.command.CommandParser import im.vector.app.features.command.CommandParser
import im.vector.app.features.command.ParsedCommand import im.vector.app.features.command.ParsedCommand
import im.vector.app.features.home.room.detail.ChatEffect import im.vector.app.features.home.room.detail.ChatEffect
import im.vector.app.features.home.room.detail.TimelineFragment
import im.vector.app.features.home.room.detail.composer.rainbow.RainbowGenerator import im.vector.app.features.home.room.detail.composer.rainbow.RainbowGenerator
import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView import im.vector.app.features.home.room.detail.composer.voice.VoiceMessageRecorderView
import im.vector.app.features.home.room.detail.toMessageType import im.vector.app.features.home.room.detail.toMessageType
@ -167,13 +166,14 @@ class MessageComposerViewModel @AssistedInject constructor(
when (val slashCommandResult = CommandParser.parseSplashCommand(action.text, state.isInThreadTimeline())) { when (val slashCommandResult = CommandParser.parseSplashCommand(action.text, state.isInThreadTimeline())) {
is ParsedCommand.ErrorNotACommand -> { is ParsedCommand.ErrorNotACommand -> {
// Send the text message to the room // Send the text message to the room
if (state.rootThreadEventId != null) if (state.rootThreadEventId != null) {
room.replyInThread( room.replyInThread(
rootThreadEventId = state.rootThreadEventId, rootThreadEventId = state.rootThreadEventId,
replyInThreadText = action.text.toString(), replyInThreadText = action.text.toString(),
autoMarkdown = action.autoMarkdown) autoMarkdown = action.autoMarkdown)
else } else {
room.sendTextMessage(action.text, autoMarkdown = action.autoMarkdown) room.sendTextMessage(action.text, autoMarkdown = action.autoMarkdown)
}
_viewEvents.post(MessageComposerViewEvents.MessageSent) _viewEvents.post(MessageComposerViewEvents.MessageSent)
popDraft() popDraft()
@ -192,13 +192,14 @@ class MessageComposerViewModel @AssistedInject constructor(
} }
is ParsedCommand.SendPlainText -> { is ParsedCommand.SendPlainText -> {
// Send the text message to the room, without markdown // Send the text message to the room, without markdown
if (state.rootThreadEventId != null) if (state.rootThreadEventId != null) {
room.replyInThread( room.replyInThread(
rootThreadEventId = state.rootThreadEventId, rootThreadEventId = state.rootThreadEventId,
replyInThreadText = action.text.toString(), replyInThreadText = action.text.toString(),
autoMarkdown = false) autoMarkdown = false)
else } else {
room.sendTextMessage(slashCommandResult.message, autoMarkdown = false) room.sendTextMessage(slashCommandResult.message, autoMarkdown = false)
}
_viewEvents.post(MessageComposerViewEvents.MessageSent) _viewEvents.post(MessageComposerViewEvents.MessageSent)
popDraft() popDraft()
} }
@ -258,7 +259,6 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft() popDraft()
} }
is ParsedCommand.SendRainbow -> { is ParsedCommand.SendRainbow -> {
val message = slashCommandResult.message.toString() val message = slashCommandResult.message.toString()
state.rootThreadEventId?.let { state.rootThreadEventId?.let {
room.replyInThread( room.replyInThread(
@ -283,7 +283,6 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft() popDraft()
} }
is ParsedCommand.SendSpoiler -> { is ParsedCommand.SendSpoiler -> {
val text = "[${stringProvider.getString(R.string.spoiler)}](${slashCommandResult.message})" val text = "[${stringProvider.getString(R.string.spoiler)}](${slashCommandResult.message})"
val formattedText = "<span data-mx-spoiler>${slashCommandResult.message}</span>" val formattedText = "<span data-mx-spoiler>${slashCommandResult.message}</span>"
state.rootThreadEventId?.let { state.rootThreadEventId?.let {
@ -299,7 +298,6 @@ class MessageComposerViewModel @AssistedInject constructor(
popDraft() popDraft()
} }
is ParsedCommand.SendShrug -> { is ParsedCommand.SendShrug -> {
sendPrefixedMessage("¯\\_(ツ)_/¯", slashCommandResult.message, state.rootThreadEventId) sendPrefixedMessage("¯\\_(ツ)_/¯", slashCommandResult.message, state.rootThreadEventId)
_viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk()) _viewEvents.post(MessageComposerViewEvents.SlashCommandResultOk())
popDraft() popDraft()

View file

@ -105,7 +105,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
rootThreadEventId = state.rootThreadEventId rootThreadEventId = state.rootThreadEventId
) )
fun isFromThreadTimeline():Boolean = rootThreadEventId != null fun isFromThreadTimeline(): Boolean = rootThreadEventId != null
} }
interface Callback : interface Callback :
@ -200,7 +200,7 @@ class TimelineEventController @Inject constructor(private val dateFormatter: Vec
// it's sent by the same user so we are sure we have up to date information. // it's sent by the same user so we are sure we have up to date information.
val invalidatedSenderId: String? = currentSnapshot.getOrNull(position)?.senderInfo?.userId val invalidatedSenderId: String? = currentSnapshot.getOrNull(position)?.senderInfo?.userId
val prevDisplayableEventIndex = currentSnapshot.subList(0, position).indexOfLast { val prevDisplayableEventIndex = currentSnapshot.subList(0, position).indexOfLast {
timelineEventVisibilityHelper.shouldShowEvent(it, partialState.highlightedEventId, partialState.isFromThreadTimeline() ) timelineEventVisibilityHelper.shouldShowEvent(it, partialState.highlightedEventId, partialState.isFromThreadTimeline())
} }
if (prevDisplayableEventIndex != -1 && currentSnapshot[prevDisplayableEventIndex].senderInfo.userId == invalidatedSenderId) { if (prevDisplayableEventIndex != -1 && currentSnapshot[prevDisplayableEventIndex].senderInfo.userId == invalidatedSenderId) {
modelCache[prevDisplayableEventIndex] = null modelCache[prevDisplayableEventIndex] = null

View file

@ -128,7 +128,7 @@ class TimelineEventVisibilityHelper @Inject constructor(private val userPreferen
return true return true
} }
if(BuildConfig.THREADING_ENABLED && !isFromThreadTimeline && root.isThread() && root.getRootThreadEventId() != null){ if (BuildConfig.THREADING_ENABLED && !isFromThreadTimeline && root.isThread() && root.getRootThreadEventId() != null) {
return true return true
} }

View file

@ -127,6 +127,7 @@ abstract class AbsBaseMessageItem<H : AbsBaseMessageItem.Holder> : BaseEventItem
val messageColorProvider: MessageColorProvider val messageColorProvider: MessageColorProvider
val itemLongClickListener: View.OnLongClickListener? val itemLongClickListener: View.OnLongClickListener?
val itemClickListener: ClickListener? val itemClickListener: ClickListener?
// val memberClickListener: ClickListener? // val memberClickListener: ClickListener?
val reactionPillCallback: TimelineEventController.ReactionPillCallback? val reactionPillCallback: TimelineEventController.ReactionPillCallback?

View file

@ -124,10 +124,10 @@ abstract class AbsMessageItem<H : AbsMessageItem.Holder> : AbsBaseMessageItem<H>
val displayName = threadDetails.threadSummarySenderInfo?.displayName val displayName = threadDetails.threadSummarySenderInfo?.displayName
val avatarUrl = threadDetails.threadSummarySenderInfo?.avatarUrl val avatarUrl = threadDetails.threadSummarySenderInfo?.avatarUrl
attributes.avatarRenderer.render(MatrixItem.UserItem(userId, displayName, avatarUrl), holder.threadSummaryAvatarImageView) attributes.avatarRenderer.render(MatrixItem.UserItem(userId, displayName, avatarUrl), holder.threadSummaryAvatarImageView)
updateHighlightedMessageHeight(holder,true) updateHighlightedMessageHeight(holder, true)
} ?: run { } ?: run {
holder.threadSummaryConstraintLayout.isVisible = false holder.threadSummaryConstraintLayout.isVisible = false
updateHighlightedMessageHeight(holder,false) updateHighlightedMessageHeight(holder, false)
} }
} }
} }

View file

@ -29,8 +29,8 @@ import im.vector.app.core.platform.ToolbarConfigurable
import im.vector.app.core.platform.VectorBaseActivity import im.vector.app.core.platform.VectorBaseActivity
import im.vector.app.databinding.ActivityThreadsBinding import im.vector.app.databinding.ActivityThreadsBinding
import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.AvatarRenderer
import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.home.room.detail.TimelineFragment import im.vector.app.features.home.room.detail.TimelineFragment
import im.vector.app.features.home.room.detail.arguments.TimelineArgs
import im.vector.app.features.home.room.threads.arguments.ThreadListArgs import im.vector.app.features.home.room.threads.arguments.ThreadListArgs
import im.vector.app.features.home.room.threads.arguments.ThreadTimelineArgs import im.vector.app.features.home.room.threads.arguments.ThreadTimelineArgs
import im.vector.app.features.home.room.threads.list.views.ThreadListFragment import im.vector.app.features.home.room.threads.list.views.ThreadListFragment
@ -152,7 +152,6 @@ class ThreadsActivity : VectorBaseActivity<ActivityThreadsBinding>(), ToolbarCon
putExtra(THREAD_TIMELINE_ARGS, threadTimelineArgs) putExtra(THREAD_TIMELINE_ARGS, threadTimelineArgs)
putExtra(THREAD_EVENT_ID_TO_NAVIGATE, eventIdToNavigate) putExtra(THREAD_EVENT_ID_TO_NAVIGATE, eventIdToNavigate)
putExtra(THREAD_LIST_ARGS, threadListArgs) putExtra(THREAD_LIST_ARGS, threadListArgs)
} }
} }
} }

View file

@ -77,15 +77,14 @@ abstract class ThreadListModel : VectorEpoxyModel<ThreadListModel.Holder>() {
} }
private fun renderNotificationState(holder: Holder) { private fun renderNotificationState(holder: Holder) {
when (threadNotificationState) { when (threadNotificationState) {
ThreadNotificationState.NEW_MESSAGE -> { ThreadNotificationState.NEW_MESSAGE -> {
holder.unreadImageView.isVisible = true holder.unreadImageView.isVisible = true
holder.unreadImageView.setColorFilter(ContextCompat.getColor(holder.view.context, R.color.palette_gray_200)); holder.unreadImageView.setColorFilter(ContextCompat.getColor(holder.view.context, R.color.palette_gray_200))
} }
ThreadNotificationState.NEW_HIGHLIGHTED_MESSAGE -> { ThreadNotificationState.NEW_HIGHLIGHTED_MESSAGE -> {
holder.unreadImageView.isVisible = true holder.unreadImageView.isVisible = true
holder.unreadImageView.setColorFilter(ContextCompat.getColor(holder.view.context, R.color.palette_vermilion)); holder.unreadImageView.setColorFilter(ContextCompat.getColor(holder.view.context, R.color.palette_vermilion))
} }
else -> { else -> {
holder.unreadImageView.isVisible = false holder.unreadImageView.isVisible = false

View file

@ -26,7 +26,7 @@ data class ThreadListViewState(
val rootThreadEventList: Async<List<ThreadTimelineEvent>> = Uninitialized, val rootThreadEventList: Async<List<ThreadTimelineEvent>> = Uninitialized,
val shouldFilterThreads: Boolean = false, val shouldFilterThreads: Boolean = false,
val roomId: String val roomId: String
) : MavericksState{ ) : MavericksState {
constructor(args: ThreadListArgs) : this(roomId = args.roomId) constructor(args: ThreadListArgs) : this(roomId = args.roomId)
} }

View file

@ -154,5 +154,4 @@ interface Navigator {
fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null) fun openThread(context: Context, threadTimelineArgs: ThreadTimelineArgs, eventIdToNavigate: String? = null)
fun openThreadList(context: Context, threadTimelineArgs: ThreadTimelineArgs) fun openThreadList(context: Context, threadTimelineArgs: ThreadTimelineArgs)
} }