Pass around fromPinnedEvents so we can use it to decide whether to forward the event from the main timeline or the pinned events one
This commit is contained in:
parent
4df7841452
commit
753322d50e
18 changed files with 38 additions and 29 deletions
|
|
@ -35,7 +35,7 @@ interface MessagesEntryPoint : FeatureEntryPoint {
|
|||
fun navigateToRoomDetails()
|
||||
fun navigateToRoomMemberDetails(userId: UserId)
|
||||
fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean)
|
||||
fun forwardEvent(eventId: EventId)
|
||||
fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean)
|
||||
fun navigateToRoom(roomId: RoomId)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ import io.element.android.features.messages.api.MessagesEntryPoint
|
|||
import io.element.android.features.messages.api.MessagesEntryPointNode
|
||||
import io.element.android.features.messages.impl.attachments.Attachment
|
||||
import io.element.android.features.messages.impl.attachments.preview.AttachmentsPreviewNode
|
||||
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.pinned.list.PinnedMessagesListNode
|
||||
import io.element.android.features.messages.impl.report.ReportMessageNode
|
||||
import io.element.android.features.messages.impl.threads.ThreadedMessagesNode
|
||||
|
|
@ -115,7 +115,7 @@ class MessagesFlowNode(
|
|||
private val roomNamesCache: RoomNamesCache,
|
||||
private val mentionSpanUpdater: MentionSpanUpdater,
|
||||
private val mentionSpanTheme: MentionSpanTheme,
|
||||
private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider,
|
||||
private val pinnedEventsTimelineProvider: DefaultPinnedEventsTimelineProvider,
|
||||
private val timelineController: TimelineController,
|
||||
private val knockRequestsListEntryPoint: KnockRequestsListEntryPoint,
|
||||
private val dateFormatter: DateFormatter,
|
||||
|
|
@ -315,9 +315,9 @@ class MessagesFlowNode(
|
|||
this@MessagesFlowNode.viewInTimeline(eventId)
|
||||
}
|
||||
|
||||
override fun forwardEvent(eventId: EventId) {
|
||||
override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
// Need to go to the parent because of the overlay
|
||||
callback.forwardEvent(eventId)
|
||||
callback.forwardEvent(eventId, fromPinnedEvents)
|
||||
}
|
||||
}
|
||||
mediaViewerEntryPoint.createNode(
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ import androidx.compose.runtime.rememberUpdatedState
|
|||
import androidx.compose.runtime.saveable.rememberSaveable
|
||||
import androidx.compose.runtime.setValue
|
||||
import dev.zacsweers.metro.Inject
|
||||
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider
|
||||
import io.element.android.libraries.architecture.AsyncData
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.matrix.api.room.BaseRoom
|
||||
|
|
@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.onEach
|
|||
class PinnedMessagesBannerPresenter(
|
||||
private val room: BaseRoom,
|
||||
private val itemFactory: PinnedMessagesBannerItemFactory,
|
||||
private val pinnedEventsTimelineProvider: PinnedEventsTimelineProvider,
|
||||
private val pinnedEventsTimelineProvider: DefaultPinnedEventsTimelineProvider,
|
||||
) : Presenter<PinnedMessagesBannerState> {
|
||||
private val pinnedItems = mutableStateOf<AsyncData<ImmutableList<PinnedMessagesBannerItem>>>(AsyncData.Uninitialized)
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ import io.element.android.features.messages.impl.UserEventPermissions
|
|||
import io.element.android.features.messages.impl.actionlist.ActionListState
|
||||
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
||||
import io.element.android.features.messages.impl.link.LinkState
|
||||
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.timeline.TimelineRoomInfo
|
||||
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactory
|
||||
import io.element.android.features.messages.impl.timeline.factories.TimelineItemsFactoryConfig
|
||||
|
|
@ -66,7 +66,7 @@ class PinnedMessagesListPresenter(
|
|||
@Assisted private val navigator: PinnedMessagesListNavigator,
|
||||
private val room: JoinedRoom,
|
||||
timelineItemsFactoryCreator: TimelineItemsFactory.Creator,
|
||||
private val timelineProvider: PinnedEventsTimelineProvider,
|
||||
private val timelineProvider: DefaultPinnedEventsTimelineProvider,
|
||||
private val timelineProtectionPresenter: Presenter<TimelineProtectionState>,
|
||||
private val linkPresenter: Presenter<LinkState>,
|
||||
private val snackbarDispatcher: SnackbarDispatcher,
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
package io.element.android.features.messages.impl.pinned.banner
|
||||
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider
|
||||
import io.element.android.libraries.eventformatter.test.FakePinnedMessagesBannerFormatter
|
||||
import io.element.android.libraries.matrix.api.room.JoinedRoom
|
||||
import io.element.android.libraries.matrix.api.sync.SyncService
|
||||
|
|
@ -195,7 +195,7 @@ class PinnedMessagesBannerPresenterTest {
|
|||
internal fun TestScope.createPinnedEventsTimelineProvider(
|
||||
room: JoinedRoom = FakeJoinedRoom(),
|
||||
syncService: SyncService = FakeSyncService(),
|
||||
) = PinnedEventsTimelineProvider(
|
||||
) = DefaultPinnedEventsTimelineProvider(
|
||||
room = room,
|
||||
syncService = syncService,
|
||||
dispatchers = testCoroutineDispatchers(),
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ import io.element.android.features.messages.impl.actionlist.anActionListState
|
|||
import io.element.android.features.messages.impl.actionlist.model.TimelineItemAction
|
||||
import io.element.android.features.messages.impl.fixtures.aTimelineItemsFactoryCreator
|
||||
import io.element.android.features.messages.impl.link.aLinkState
|
||||
import io.element.android.features.messages.impl.pinned.PinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.pinned.DefaultPinnedEventsTimelineProvider
|
||||
import io.element.android.features.messages.impl.timeline.model.TimelineItem
|
||||
import io.element.android.features.messages.impl.timeline.protection.aTimelineProtectionState
|
||||
import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher
|
||||
|
|
@ -300,7 +300,7 @@ class PinnedMessagesListPresenterTest {
|
|||
analyticsService: AnalyticsService = FakeAnalyticsService(),
|
||||
featureFlagService: FakeFeatureFlagService = FakeFeatureFlagService(),
|
||||
): PinnedMessagesListPresenter {
|
||||
val timelineProvider = PinnedEventsTimelineProvider(
|
||||
val timelineProvider = DefaultPinnedEventsTimelineProvider(
|
||||
room = room,
|
||||
syncService = syncService,
|
||||
dispatchers = testCoroutineDispatchers(),
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ interface RoomDetailsEntryPoint : FeatureEntryPoint {
|
|||
fun navigateToGlobalNotificationSettings()
|
||||
fun navigateToRoom(roomId: RoomId, serverNames: List<String>)
|
||||
fun handlePermalinkClick(data: PermalinkData, pushToBackstack: Boolean)
|
||||
fun startForwardEventFlow(eventId: EventId)
|
||||
fun startForwardEventFlow(eventId: EventId, fromPinnedEvents: Boolean)
|
||||
}
|
||||
|
||||
fun createNode(
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ class RoomDetailsFlowNode(
|
|||
// Cannot happen
|
||||
}
|
||||
|
||||
override fun forwardEvent(eventId: EventId) {
|
||||
override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
// Cannot happen
|
||||
}
|
||||
}
|
||||
|
|
@ -331,8 +331,8 @@ class RoomDetailsFlowNode(
|
|||
callback.handlePermalinkClick(permalinkData, pushToBackstack = false)
|
||||
}
|
||||
|
||||
override fun forward(eventId: EventId) {
|
||||
callback.startForwardEventFlow(eventId)
|
||||
override fun forward(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
callback.startForwardEventFlow(eventId, fromPinnedEvents)
|
||||
}
|
||||
}
|
||||
mediaGalleryEntryPoint.createNode(
|
||||
|
|
@ -358,8 +358,8 @@ class RoomDetailsFlowNode(
|
|||
callback.handlePermalinkClick(data, pushToBackstack)
|
||||
}
|
||||
|
||||
override fun forwardEvent(eventId: EventId) {
|
||||
callback.startForwardEventFlow(eventId)
|
||||
override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
callback.startForwardEventFlow(eventId, fromPinnedEvents)
|
||||
}
|
||||
|
||||
override fun navigateToRoom(roomId: RoomId) {
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ class UserProfileFlowNode(
|
|||
// Cannot happen
|
||||
}
|
||||
|
||||
override fun forwardEvent(eventId: EventId) {
|
||||
override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
// Cannot happen
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,6 +23,6 @@ interface MediaGalleryEntryPoint : FeatureEntryPoint {
|
|||
interface Callback : Plugin {
|
||||
fun onBackClick()
|
||||
fun viewInTimeline(eventId: EventId)
|
||||
fun forward(eventId: EventId)
|
||||
fun forward(eventId: EventId, fromPinnedEvents: Boolean)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ interface MediaViewerEntryPoint : FeatureEntryPoint {
|
|||
interface Callback : Plugin {
|
||||
fun onDone()
|
||||
fun viewInTimeline(eventId: EventId)
|
||||
fun forwardEvent(eventId: EventId)
|
||||
fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean)
|
||||
}
|
||||
|
||||
data class Params(
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ interface MediaGalleryDataSource {
|
|||
fun start()
|
||||
fun groupedMediaItemsFlow(): Flow<AsyncData<GroupedMediaItems>>
|
||||
fun getLastData(): AsyncData<GroupedMediaItems>
|
||||
fun fromPinnedEvents(): Boolean
|
||||
suspend fun loadMore(direction: Timeline.PaginationDirection)
|
||||
suspend fun deleteItem(eventId: EventId)
|
||||
}
|
||||
|
|
@ -46,6 +47,10 @@ class TimelineMediaGalleryDataSource(
|
|||
) : MediaGalleryDataSource {
|
||||
private var timeline: Timeline? = null
|
||||
|
||||
override fun fromPinnedEvents(): Boolean {
|
||||
return timeline?.mode == Timeline.Mode.PinnedEvents
|
||||
}
|
||||
|
||||
private val groupedMediaItemsFlow = MutableSharedFlow<AsyncData<GroupedMediaItems>>(replay = 1)
|
||||
|
||||
override fun groupedMediaItemsFlow(): Flow<AsyncData<GroupedMediaItems>> = groupedMediaItemsFlow
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ class MediaGalleryFlowNode(
|
|||
}
|
||||
|
||||
override fun forward(eventId: EventId) {
|
||||
callback.forward(eventId)
|
||||
callback.forward(eventId, fromPinnedEvents = false)
|
||||
}
|
||||
|
||||
override fun showItem(item: MediaItem.Event) {
|
||||
|
|
@ -119,9 +119,9 @@ class MediaGalleryFlowNode(
|
|||
callback.viewInTimeline(eventId)
|
||||
}
|
||||
|
||||
override fun forwardEvent(eventId: EventId) {
|
||||
override fun forwardEvent(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
// Need to go to the parent because of the overlay
|
||||
callback.forward(eventId)
|
||||
callback.forward(eventId, fromPinnedEvents)
|
||||
}
|
||||
}
|
||||
mediaViewerEntryPoint.createNode(
|
||||
|
|
|
|||
|
|
@ -61,6 +61,8 @@ class MediaViewerDataSource(
|
|||
private val localMediaStates: MutableMap<String, MutableState<AsyncData<LocalMedia>>> =
|
||||
mutableMapOf()
|
||||
|
||||
fun fromPinnedEvents(): Boolean = galleryDataSource.fromPinnedEvents()
|
||||
|
||||
fun setup() {
|
||||
galleryDataSource.start()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,6 @@ import io.element.android.libraries.matrix.api.core.EventId
|
|||
|
||||
interface MediaViewerNavigator {
|
||||
fun onViewInTimelineClick(eventId: EventId)
|
||||
fun onForwardClick(eventId: EventId)
|
||||
fun onForwardClick(eventId: EventId, fromPinnedEvents: Boolean)
|
||||
fun onItemDeleted()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,8 +64,8 @@ class MediaViewerNode(
|
|||
callback.viewInTimeline(eventId)
|
||||
}
|
||||
|
||||
override fun onForwardClick(eventId: EventId) {
|
||||
callback.forwardEvent(eventId)
|
||||
override fun onForwardClick(eventId: EventId, fromPinnedEvents: Boolean) {
|
||||
callback.forwardEvent(eventId, fromPinnedEvents)
|
||||
}
|
||||
|
||||
override fun onItemDeleted() {
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ class MediaViewerPresenter(
|
|||
}
|
||||
is MediaViewerEvents.Forward -> {
|
||||
mediaBottomSheetState = MediaBottomSheetState.Hidden
|
||||
navigator.onForwardClick(event.eventId)
|
||||
navigator.onForwardClick(event.eventId, fromPinnedEvents = dataSource.fromPinnedEvents())
|
||||
}
|
||||
is MediaViewerEvents.OpenInfo -> coroutineScope.launch {
|
||||
mediaBottomSheetState = MediaBottomSheetState.MediaDetailsBottomSheetState(
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@ class SingleMediaGalleryDataSource(
|
|||
override fun start() = Unit
|
||||
override fun groupedMediaItemsFlow() = flowOf(AsyncData.Success(data))
|
||||
override fun getLastData(): AsyncData<GroupedMediaItems> = AsyncData.Success(data)
|
||||
override fun fromPinnedEvents(): Boolean = false
|
||||
|
||||
override suspend fun loadMore(direction: Timeline.PaginationDirection) = Unit
|
||||
override suspend fun deleteItem(eventId: EventId) = Unit
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue