From e6918b592ed98de6175364a2b464493ae85892da Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Wed, 28 Jan 2026 10:37:01 -0400 Subject: [PATCH] Move MediaFolder to core-model. --- .../securesms/mediasend/MediaFolder.java | 49 ------------------- .../securesms/mediasend/MediaRepository.java | 18 ++++--- .../v2/gallery/MediaGalleryRepository.kt | 2 +- .../v2/gallery/MediaGallerySelectableItem.kt | 2 +- .../v2/gallery/MediaGalleryViewModel.kt | 2 +- .../signal/core/models/media/MediaFolder.kt | 23 +++++++++ 6 files changed, 36 insertions(+), 60 deletions(-) delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java create mode 100644 core/models/src/main/java/org/signal/core/models/media/MediaFolder.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java deleted file mode 100644 index 44ea0e387f..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaFolder.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.thoughtcrime.securesms.mediasend; - -import android.net.Uri; - -import androidx.annotation.NonNull; - -/** - * Represents a folder that's shown in {@link MediaPickerFolderFragment}. - */ -public class MediaFolder { - - private final Uri thumbnailUri; - private final String title; - private final int itemCount; - private final String bucketId; - private final FolderType folderType; - - MediaFolder(@NonNull Uri thumbnailUri, @NonNull String title, int itemCount, @NonNull String bucketId, @NonNull FolderType folderType) { - this.thumbnailUri = thumbnailUri; - this.title = title; - this.itemCount = itemCount; - this.bucketId = bucketId; - this.folderType = folderType; - } - - public Uri getThumbnailUri() { - return thumbnailUri; - } - - public String getTitle() { - return title; - } - - public int getItemCount() { - return itemCount; - } - - public String getBucketId() { - return bucketId; - } - - public FolderType getFolderType() { - return folderType; - } - - enum FolderType { - NORMAL, CAMERA - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java index 60f45d2b12..4521786118 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaRepository.java @@ -22,6 +22,7 @@ import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.signal.core.models.media.Media; +import org.signal.core.models.media.MediaFolder; import org.signal.core.models.media.TransformProperties; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.dependencies.AppDependencies; @@ -154,14 +155,15 @@ public class MediaRepository { String cameraBucketId = imageFolders.getCameraBucketId() != null ? imageFolders.getCameraBucketId() : videoFolders.getCameraBucketId(); FolderData cameraFolder = cameraBucketId != null ? folders.remove(cameraBucketId) : null; - List mediaFolders = Stream.of(folders.values()).map(folder -> new MediaFolder(folder.getThumbnail(), - folder.getTitle(), - folder.getCount(), - folder.getBucketId(), - MediaFolder.FolderType.NORMAL)) - .filter(folder -> folder.getTitle() != null) - .sorted((o1, o2) -> o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase())) - .toList(); + List mediaFolders = Stream.of(folders.values()) + .filter(folder -> folder.getTitle() != null) + .map(folder -> new MediaFolder(folder.getThumbnail(), + folder.getTitle(), + folder.getCount(), + folder.getBucketId(), + MediaFolder.FolderType.NORMAL)) + .sorted((o1, o2) -> o1.getTitle().toLowerCase().compareTo(o2.getTitle().toLowerCase())) + .toList(); Uri allMediaThumbnail = imageFolders.getThumbnailTimestamp() > videoFolders.getThumbnailTimestamp() ? imageFolders.getThumbnail() : videoFolders.getThumbnail(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt index f1acea9e7a..9e8c57762d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryRepository.kt @@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery import android.content.Context import org.signal.core.models.media.Media -import org.thoughtcrime.securesms.mediasend.MediaFolder +import org.signal.core.models.media.MediaFolder import org.thoughtcrime.securesms.mediasend.MediaRepository class MediaGalleryRepository(context: Context, private val mediaRepository: MediaRepository) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt index b13cb37e46..7c59dc06d6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt @@ -15,10 +15,10 @@ import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.google.android.material.imageview.ShapeableImageView import org.signal.core.models.media.Media +import org.signal.core.models.media.MediaFolder import org.signal.core.util.DimensionUnit import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mediasend.MediaFolder import org.thoughtcrime.securesms.mediasend.v2.review.MediaGalleryGridItemTouchListener import org.thoughtcrime.securesms.mms.DecryptableUri import org.thoughtcrime.securesms.mms.PartAuthority diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt index 7fb707e360..a6e58bb30a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGalleryViewModel.kt @@ -3,7 +3,7 @@ package org.thoughtcrime.securesms.mediasend.v2.gallery import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider -import org.thoughtcrime.securesms.mediasend.MediaFolder +import org.signal.core.models.media.MediaFolder import org.thoughtcrime.securesms.util.livedata.Store class MediaGalleryViewModel(bucketId: String?, bucketTitle: String?, private val repository: MediaGalleryRepository) : ViewModel() { diff --git a/core/models/src/main/java/org/signal/core/models/media/MediaFolder.kt b/core/models/src/main/java/org/signal/core/models/media/MediaFolder.kt new file mode 100644 index 0000000000..f760a066e5 --- /dev/null +++ b/core/models/src/main/java/org/signal/core/models/media/MediaFolder.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2025 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.models.media + +import android.net.Uri + +/** + * Represents a folder that's shown in a media selector, containing [Media] items. + */ +data class MediaFolder( + val thumbnailUri: Uri, + val title: String, + val itemCount: Int, + val bucketId: String, + val folderType: FolderType +) { + enum class FolderType { + NORMAL, CAMERA + } +}