package org.thoughtcrime.securesms.database.loaders; import android.content.Context; import android.database.Cursor; import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.util.Pair; import org.session.libsession.messaging.sending_receiving.attachments.AttachmentId; import org.session.libsession.utilities.recipients.Recipient; import org.thoughtcrime.securesms.database.AttachmentDatabase; import org.thoughtcrime.securesms.dependencies.DatabaseComponent; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.util.AsyncLoader; public class PagingMediaLoader extends AsyncLoader> { @SuppressWarnings("unused") private static final String TAG = PagingMediaLoader.class.getSimpleName(); private final Recipient recipient; private final Uri uri; private final boolean leftIsRecent; public PagingMediaLoader(@NonNull Context context, @NonNull Recipient recipient, @NonNull Uri uri, boolean leftIsRecent) { super(context); this.recipient = recipient; this.uri = uri; this.leftIsRecent = leftIsRecent; } @Nullable @Override public Pair loadInBackground() { long threadId = DatabaseComponent.get(getContext()).threadDatabase().getOrCreateThreadIdFor(recipient); Cursor cursor = DatabaseComponent.get(getContext()).mediaDatabase().getGalleryMediaForThread(threadId); while (cursor != null && cursor.moveToNext()) { AttachmentId attachmentId = new AttachmentId(cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentDatabase.ROW_ID)), cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentDatabase.UNIQUE_ID))); Uri attachmentUri = PartAuthority.getAttachmentDataUri(attachmentId); if (attachmentUri.equals(uri)) { return new Pair<>(cursor, leftIsRecent ? cursor.getPosition() : cursor.getCount() - 1 - cursor.getPosition()); } } cursor.close(); return null; } }