diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt index 25c83262b1..3eacc7b459 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewRepository.kt @@ -28,21 +28,29 @@ class MediaPreviewRepository { * @param sorting the ordering of the results * @param limit the maximum quantity of the results */ - fun getAttachments(startingUri: Uri, threadId: Long, sorting: Sorting, limit: Int = 500): Flowable> { + fun getAttachments(startingUri: Uri, threadId: Long, sorting: Sorting, limit: Int = 500): Flowable { return Single.fromCallable { val cursor = media.getGalleryMediaForThread(threadId, sorting) val acc = mutableListOf() + var initialPosition = 0 var attachmentUri: Uri? = null while (cursor.moveToNext()) { val attachmentId = AttachmentId(cursor.requireLong(AttachmentDatabase.ROW_ID), cursor.requireLong(AttachmentDatabase.UNIQUE_ID)) attachmentUri = PartAuthority.getAttachmentDataUri(attachmentId) if (attachmentUri == startingUri) { + initialPosition = cursor.position break } } if (attachmentUri == startingUri) { + val frontLimit: Int = limit / 2 + if (initialPosition < frontLimit) { + cursor.moveToFirst() + } else { + cursor.move(-frontLimit) + } for (i in 0..limit) { val element = MediaDatabase.MediaRecord.from(cursor) if (element != null) { @@ -54,11 +62,11 @@ class MediaPreviewRepository { break } } - acc.toList() } else { Log.e(TAG, "Could not find $startingUri in thread $threadId") - emptyList() } + Result(initialPosition, acc.toList()) }.subscribeOn(Schedulers.io()).toFlowable() } + data class Result(val initialPosition: Int, val records: List) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 6de23e6eb9..ab92a9130f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -151,6 +151,9 @@ class MediaPreviewV2Fragment : Fragment(R.layout.fragment_media_preview_v2), Med private fun bindReadyState(currentState: MediaPreviewV2State) { (binding.mediaPager.adapter as MediaPreviewV2Adapter).updateBackingItems(currentState.mediaRecords.mapNotNull { it.attachment }) + if (binding.mediaPager.currentItem != currentState.position) { + binding.mediaPager.currentItem = currentState.position + } val currentItem: MediaDatabase.MediaRecord = currentState.mediaRecords[currentState.position] binding.toolbar.title = getTitleText(currentItem, currentState.showThread) binding.toolbar.subtitle = getSubTitleText(currentItem) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt index 9f6e776ea5..cf34ef1e03 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2ViewModel.kt @@ -26,10 +26,11 @@ class MediaPreviewV2ViewModel : ViewModel() { fun fetchAttachments(startingUri: Uri, threadId: Long, sorting: MediaDatabase.Sorting) { disposables += store.update(repository.getAttachments(startingUri, threadId, sorting)) { - mediaRecords: List, oldState: MediaPreviewV2State -> + result: MediaPreviewRepository.Result, oldState: MediaPreviewV2State -> oldState.copy( - mediaRecords = mediaRecords, - loadState = MediaPreviewV2State.LoadState.READY + position = result.initialPosition, + mediaRecords = result.records, + loadState = MediaPreviewV2State.LoadState.READY, ) } }