Uploads: add the service and the task
This commit is contained in:
parent
d2598480c8
commit
8a9498bae4
@ -29,6 +29,7 @@ import im.vector.matrix.android.api.session.room.send.SendService
|
|||||||
import im.vector.matrix.android.api.session.room.state.StateService
|
import im.vector.matrix.android.api.session.room.state.StateService
|
||||||
import im.vector.matrix.android.api.session.room.timeline.TimelineService
|
import im.vector.matrix.android.api.session.room.timeline.TimelineService
|
||||||
import im.vector.matrix.android.api.session.room.typing.TypingService
|
import im.vector.matrix.android.api.session.room.typing.TypingService
|
||||||
|
import im.vector.matrix.android.api.session.room.uploads.UploadsService
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,6 +43,7 @@ interface Room :
|
|||||||
TypingService,
|
TypingService,
|
||||||
MembershipService,
|
MembershipService,
|
||||||
StateService,
|
StateService,
|
||||||
|
UploadsService,
|
||||||
ReportingService,
|
ReportingService,
|
||||||
RelationService,
|
RelationService,
|
||||||
RoomCryptoService,
|
RoomCryptoService,
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 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.matrix.android.api.session.room.uploads
|
||||||
|
|
||||||
|
import im.vector.matrix.android.api.session.events.model.Event
|
||||||
|
|
||||||
|
data class GetUploadsResult(
|
||||||
|
// List of fetched Events
|
||||||
|
val events: List<Event>,
|
||||||
|
// token to get more events, or null if there is no more event to fetch
|
||||||
|
val nextToken: String?
|
||||||
|
)
|
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 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.matrix.android.api.session.room.uploads
|
||||||
|
|
||||||
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This interface defines methods to get event with uploads (= attachments) sent to a room. It's implemented at the room level.
|
||||||
|
*/
|
||||||
|
interface UploadsService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of events containing URL sent to a room, from most recent to oldest one
|
||||||
|
* @param numberOfEvents the expected number of events to retrieve. The result can contain less events.
|
||||||
|
* @param since token to get next page, or null to get the first page
|
||||||
|
*/
|
||||||
|
fun getUploads(numberOfEvents: Int,
|
||||||
|
since: String?,
|
||||||
|
callback: MatrixCallback<GetUploadsResult>): Cancelable
|
||||||
|
}
|
@ -20,6 +20,15 @@ import im.vector.matrix.android.api.session.events.model.EventType
|
|||||||
|
|
||||||
internal object FilterFactory {
|
internal object FilterFactory {
|
||||||
|
|
||||||
|
fun createUploadsFilter(numberOfEvents: Int): RoomEventFilter {
|
||||||
|
return RoomEventFilter(
|
||||||
|
limit = numberOfEvents,
|
||||||
|
containsUrl = true,
|
||||||
|
types = listOf(EventType.MESSAGE),
|
||||||
|
lazyLoadMembers = true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
fun createDefaultFilter(): Filter {
|
fun createDefaultFilter(): Filter {
|
||||||
return FilterUtil.enableLazyLoading(Filter(), true)
|
return FilterUtil.enableLazyLoading(Filter(), true)
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ import im.vector.matrix.android.api.session.room.send.SendService
|
|||||||
import im.vector.matrix.android.api.session.room.state.StateService
|
import im.vector.matrix.android.api.session.room.state.StateService
|
||||||
import im.vector.matrix.android.api.session.room.timeline.TimelineService
|
import im.vector.matrix.android.api.session.room.timeline.TimelineService
|
||||||
import im.vector.matrix.android.api.session.room.typing.TypingService
|
import im.vector.matrix.android.api.session.room.typing.TypingService
|
||||||
|
import im.vector.matrix.android.api.session.room.uploads.UploadsService
|
||||||
import im.vector.matrix.android.api.util.Optional
|
import im.vector.matrix.android.api.util.Optional
|
||||||
import im.vector.matrix.android.api.util.toOptional
|
import im.vector.matrix.android.api.util.toOptional
|
||||||
import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
||||||
@ -54,6 +55,7 @@ internal class DefaultRoom @Inject constructor(override val roomId: String,
|
|||||||
private val sendService: SendService,
|
private val sendService: SendService,
|
||||||
private val draftService: DraftService,
|
private val draftService: DraftService,
|
||||||
private val stateService: StateService,
|
private val stateService: StateService,
|
||||||
|
private val uploadsService: UploadsService,
|
||||||
private val reportingService: ReportingService,
|
private val reportingService: ReportingService,
|
||||||
private val readService: ReadService,
|
private val readService: ReadService,
|
||||||
private val typingService: TypingService,
|
private val typingService: TypingService,
|
||||||
@ -68,6 +70,7 @@ internal class DefaultRoom @Inject constructor(override val roomId: String,
|
|||||||
SendService by sendService,
|
SendService by sendService,
|
||||||
DraftService by draftService,
|
DraftService by draftService,
|
||||||
StateService by stateService,
|
StateService by stateService,
|
||||||
|
UploadsService by uploadsService,
|
||||||
ReportingService by reportingService,
|
ReportingService by reportingService,
|
||||||
ReadService by readService,
|
ReadService by readService,
|
||||||
TypingService by typingService,
|
TypingService by typingService,
|
||||||
|
@ -32,6 +32,7 @@ import im.vector.matrix.android.internal.session.room.state.DefaultStateService
|
|||||||
import im.vector.matrix.android.internal.session.room.state.SendStateTask
|
import im.vector.matrix.android.internal.session.room.state.SendStateTask
|
||||||
import im.vector.matrix.android.internal.session.room.timeline.DefaultTimelineService
|
import im.vector.matrix.android.internal.session.room.timeline.DefaultTimelineService
|
||||||
import im.vector.matrix.android.internal.session.room.typing.DefaultTypingService
|
import im.vector.matrix.android.internal.session.room.typing.DefaultTypingService
|
||||||
|
import im.vector.matrix.android.internal.session.room.uploads.DefaultUploadsService
|
||||||
import im.vector.matrix.android.internal.task.TaskExecutor
|
import im.vector.matrix.android.internal.task.TaskExecutor
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@ -47,6 +48,7 @@ internal class DefaultRoomFactory @Inject constructor(private val monarchy: Mona
|
|||||||
private val sendServiceFactory: DefaultSendService.Factory,
|
private val sendServiceFactory: DefaultSendService.Factory,
|
||||||
private val draftServiceFactory: DefaultDraftService.Factory,
|
private val draftServiceFactory: DefaultDraftService.Factory,
|
||||||
private val stateServiceFactory: DefaultStateService.Factory,
|
private val stateServiceFactory: DefaultStateService.Factory,
|
||||||
|
private val uploadsServiceFactory: DefaultUploadsService.Factory,
|
||||||
private val reportingServiceFactory: DefaultReportingService.Factory,
|
private val reportingServiceFactory: DefaultReportingService.Factory,
|
||||||
private val readServiceFactory: DefaultReadService.Factory,
|
private val readServiceFactory: DefaultReadService.Factory,
|
||||||
private val typingServiceFactory: DefaultTypingService.Factory,
|
private val typingServiceFactory: DefaultTypingService.Factory,
|
||||||
@ -66,6 +68,7 @@ internal class DefaultRoomFactory @Inject constructor(private val monarchy: Mona
|
|||||||
sendService = sendServiceFactory.create(roomId),
|
sendService = sendServiceFactory.create(roomId),
|
||||||
draftService = draftServiceFactory.create(roomId),
|
draftService = draftServiceFactory.create(roomId),
|
||||||
stateService = stateServiceFactory.create(roomId),
|
stateService = stateServiceFactory.create(roomId),
|
||||||
|
uploadsService = uploadsServiceFactory.create(roomId),
|
||||||
reportingService = reportingServiceFactory.create(roomId),
|
reportingService = reportingServiceFactory.create(roomId),
|
||||||
readService = readServiceFactory.create(roomId),
|
readService = readServiceFactory.create(roomId),
|
||||||
typingService = typingServiceFactory.create(roomId),
|
typingService = typingServiceFactory.create(roomId),
|
||||||
|
@ -64,6 +64,8 @@ import im.vector.matrix.android.internal.session.room.timeline.GetContextOfEvent
|
|||||||
import im.vector.matrix.android.internal.session.room.timeline.PaginationTask
|
import im.vector.matrix.android.internal.session.room.timeline.PaginationTask
|
||||||
import im.vector.matrix.android.internal.session.room.typing.DefaultSendTypingTask
|
import im.vector.matrix.android.internal.session.room.typing.DefaultSendTypingTask
|
||||||
import im.vector.matrix.android.internal.session.room.typing.SendTypingTask
|
import im.vector.matrix.android.internal.session.room.typing.SendTypingTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.uploads.DefaultGetUploadsTask
|
||||||
|
import im.vector.matrix.android.internal.session.room.uploads.GetUploadsTask
|
||||||
import retrofit2.Retrofit
|
import retrofit2.Retrofit
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
@ -156,4 +158,7 @@ internal abstract class RoomModule {
|
|||||||
|
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindSendTypingTask(task: DefaultSendTypingTask): SendTypingTask
|
abstract fun bindSendTypingTask(task: DefaultSendTypingTask): SendTypingTask
|
||||||
|
|
||||||
|
@Binds
|
||||||
|
abstract fun bindGetUploadsTask(task: DefaultGetUploadsTask): GetUploadsTask
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 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.matrix.android.internal.session.room.uploads
|
||||||
|
|
||||||
|
import com.squareup.inject.assisted.Assisted
|
||||||
|
import com.squareup.inject.assisted.AssistedInject
|
||||||
|
import im.vector.matrix.android.api.MatrixCallback
|
||||||
|
import im.vector.matrix.android.api.session.room.uploads.GetUploadsResult
|
||||||
|
import im.vector.matrix.android.api.session.room.uploads.UploadsService
|
||||||
|
import im.vector.matrix.android.api.util.Cancelable
|
||||||
|
import im.vector.matrix.android.internal.task.TaskExecutor
|
||||||
|
import im.vector.matrix.android.internal.task.configureWith
|
||||||
|
|
||||||
|
internal class DefaultUploadsService @AssistedInject constructor(
|
||||||
|
@Assisted private val roomId: String,
|
||||||
|
private val taskExecutor: TaskExecutor,
|
||||||
|
private val getUploadsTask: GetUploadsTask
|
||||||
|
) : UploadsService {
|
||||||
|
|
||||||
|
@AssistedInject.Factory
|
||||||
|
interface Factory {
|
||||||
|
fun create(roomId: String): UploadsService
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getUploads(numberOfEvents: Int, since: String?, callback: MatrixCallback<GetUploadsResult>): Cancelable {
|
||||||
|
return getUploadsTask
|
||||||
|
.configureWith(GetUploadsTask.Params(roomId, numberOfEvents, since))
|
||||||
|
.executeBy(taskExecutor)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2020 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.matrix.android.internal.session.room.uploads
|
||||||
|
|
||||||
|
import im.vector.matrix.android.api.session.room.uploads.GetUploadsResult
|
||||||
|
import im.vector.matrix.android.internal.network.executeRequest
|
||||||
|
import im.vector.matrix.android.internal.session.filter.FilterFactory
|
||||||
|
import im.vector.matrix.android.internal.session.room.RoomAPI
|
||||||
|
import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection
|
||||||
|
import im.vector.matrix.android.internal.session.room.timeline.PaginationResponse
|
||||||
|
import im.vector.matrix.android.internal.session.sync.SyncTokenStore
|
||||||
|
import im.vector.matrix.android.internal.task.Task
|
||||||
|
import org.greenrobot.eventbus.EventBus
|
||||||
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
internal interface GetUploadsTask : Task<GetUploadsTask.Params, GetUploadsResult> {
|
||||||
|
|
||||||
|
data class Params(
|
||||||
|
val roomId: String,
|
||||||
|
val numberOfEvents: Int,
|
||||||
|
val since: String?
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class DefaultGetUploadsTask @Inject constructor(
|
||||||
|
private val roomAPI: RoomAPI,
|
||||||
|
private val tokenStore: SyncTokenStore,
|
||||||
|
private val eventBus: EventBus)
|
||||||
|
: GetUploadsTask {
|
||||||
|
|
||||||
|
override suspend fun execute(params: GetUploadsTask.Params): GetUploadsResult {
|
||||||
|
val since = params.since ?: tokenStore.getLastToken() ?: throw IllegalStateException("No token available")
|
||||||
|
|
||||||
|
val filter = FilterFactory.createUploadsFilter(params.numberOfEvents).toJSONString()
|
||||||
|
val chunk = executeRequest<PaginationResponse>(eventBus) {
|
||||||
|
apiCall = roomAPI.getRoomMessagesFrom(params.roomId, since, PaginationDirection.BACKWARDS.value, params.numberOfEvents, filter)
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetUploadsResult(
|
||||||
|
events = chunk.events, // reverse?
|
||||||
|
nextToken = chunk.end?.takeIf { it != chunk.start }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user