diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index 1f02872cc3..6a303e1dab 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -36,6 +36,7 @@ import org.signal.aesgcmprovider.AesGcmProvider; import org.signal.core.util.AppForegroundObserver; import org.signal.core.util.DiskUtil; import org.signal.core.util.MemoryTracker; +import org.signal.core.util.PartAuthorityUris; import org.signal.core.util.Util; import org.signal.core.util.concurrent.AnrDetector; import org.signal.core.util.concurrent.SignalExecutors; @@ -166,6 +167,8 @@ public class ApplicationContext extends Application implements AppForegroundObse @Override public void onCreate() { + PartAuthorityUris.init(BuildConfig.APPLICATION_ID); + Tracer.getInstance().start("Application#onCreate()"); AppStartup.getInstance().onApplicationCreate(); SignalLocalMetrics.ColdStart.start(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/attachments/LocalStickerAttachment.kt b/app/src/main/java/org/thoughtcrime/securesms/attachments/LocalStickerAttachment.kt index e1533618fb..9520f042c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/attachments/LocalStickerAttachment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/attachments/LocalStickerAttachment.kt @@ -8,8 +8,8 @@ package org.thoughtcrime.securesms.attachments import android.net.Uri import android.os.Parcel import androidx.core.os.ParcelCompat +import org.signal.core.models.database.StickerRecord import org.thoughtcrime.securesms.database.AttachmentTable -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.mms.StickerSlide import org.thoughtcrime.securesms.stickers.StickerLocator import java.security.SecureRandom diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java index ed7b8840a8..e6c4bc4206 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java @@ -38,6 +38,7 @@ import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.signal.core.models.database.StickerRecord; import org.signal.core.ui.view.Stub; import org.signal.core.util.ThreadUtil; import org.signal.core.util.concurrent.ListenableFuture; @@ -61,7 +62,6 @@ import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.database.model.MmsMessageRecord; import org.thoughtcrime.securesms.database.model.Quote; -import org.thoughtcrime.securesms.database.model.StickerRecord; import org.thoughtcrime.securesms.keyboard.KeyboardPage; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java index 0e84b96085..ae82657f7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java @@ -12,7 +12,7 @@ import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.database.model.StickerRecord; +import org.signal.core.models.database.StickerRecord; import org.signal.glide.decryptableuri.DecryptableUri; import java.util.ArrayList; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 2f076a53d0..026530ba20 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -109,6 +109,7 @@ import kotlinx.coroutines.withContext import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.signal.core.models.database.StickerRecord import org.signal.core.models.media.Media import org.signal.core.models.media.TransformProperties import org.signal.core.ui.BottomSheetUtil @@ -257,7 +258,6 @@ import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.Quote -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.databinding.V2ConversationFragmentBinding import org.thoughtcrime.securesms.dependencies.AppDependencies diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt index ecbafb9938..afa35a99a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt @@ -24,6 +24,7 @@ import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.core.SingleEmitter import io.reactivex.rxjava3.schedulers.Schedulers +import org.signal.core.models.database.StickerRecord import org.signal.core.util.DrawableUtil import org.signal.core.util.StreamUtil import org.signal.core.util.Util @@ -62,7 +63,6 @@ import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.ReactionRecord -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras import org.thoughtcrime.securesms.database.model.databaseprotos.PinnedMessage diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt index dc4bf690c5..508c5ceb9c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationViewModel.kt @@ -44,6 +44,7 @@ import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.rx3.asFlow import org.signal.core.models.ServiceId +import org.signal.core.models.database.StickerRecord import org.signal.core.util.concurrent.SignalDispatchers import org.signal.core.util.logging.Log import org.signal.core.util.orNull @@ -74,7 +75,6 @@ import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.ReactionRecord -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.database.model.StoryViewState import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.dependencies.AppDependencies diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel.kt index 55470a9281..179333cae6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel.kt @@ -8,7 +8,7 @@ package org.thoughtcrime.securesms.conversation.v2 import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.processors.BehaviorProcessor -import org.thoughtcrime.securesms.database.model.StickerRecord +import org.signal.core.models.database.StickerRecord import org.thoughtcrime.securesms.stickers.StickerSearchRepository class StickerSuggestionsViewModel( diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt index 912216b24e..969cfe203e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/StickerTables.kt @@ -4,6 +4,7 @@ import android.content.Context import android.database.Cursor import androidx.core.content.contentValuesOf import org.greenrobot.eventbus.EventBus +import org.signal.core.models.database.StickerRecord import org.signal.core.util.Base64 import org.signal.core.util.Hex import org.signal.core.util.SqlUtil @@ -40,7 +41,6 @@ import org.thoughtcrime.securesms.database.model.StickerPackId import org.thoughtcrime.securesms.database.model.StickerPackKey import org.thoughtcrime.securesms.database.model.StickerPackRecord import org.thoughtcrime.securesms.database.model.StickerPackSyncRecord -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.jobs.StickerPackDownloadJob import org.thoughtcrime.securesms.stickers.BlessedPacks diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.kt index c25187b9ca..bdd17d11a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerPackRecord.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.database.model import android.net.Uri +import org.signal.core.models.database.StickerRecord import org.signal.core.util.orNull import org.thoughtcrime.securesms.stickers.StickerUrl import org.whispersystems.signalservice.api.storage.StorageId diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java index cc0f367d09..64b38ce067 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StickerDownloadJob.java @@ -3,11 +3,11 @@ package org.thoughtcrime.securesms.jobs; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.signal.core.models.database.StickerRecord; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.StickerTables; import org.thoughtcrime.securesms.database.model.IncomingSticker; -import org.thoughtcrime.securesms.database.model.StickerRecord; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.Job; diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerListAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerListAdapter.kt index c494b8c5f7..09148ce585 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerListAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerListAdapter.kt @@ -6,10 +6,10 @@ import android.widget.ImageView import android.widget.TextView import com.bumptech.glide.RequestManager import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions +import org.signal.core.models.database.StickerRecord import org.signal.glide.apng.ApngOptions import org.signal.glide.decryptableuri.DecryptableUri import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardRepository.kt index 56b6f636af..6cb330f54e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardRepository.kt @@ -1,6 +1,7 @@ package org.thoughtcrime.securesms.keyboard.sticker import android.net.Uri +import org.signal.core.models.database.StickerRecord import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.nullIfBlank import org.thoughtcrime.securesms.R @@ -8,7 +9,6 @@ import org.thoughtcrime.securesms.database.StickerTables import org.thoughtcrime.securesms.database.StickerTables.StickerPackRecordReader import org.thoughtcrime.securesms.database.StickerTables.StickerRecordReader import org.thoughtcrime.securesms.database.model.StickerPackRecord -import org.thoughtcrime.securesms.database.model.StickerRecord import java.util.function.Consumer private const val RECENT_LIMIT = 24 diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchRepository.kt index a218a0130a..baeb6a21b6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchRepository.kt @@ -1,12 +1,12 @@ package org.thoughtcrime.securesms.keyboard.sticker import androidx.annotation.WorkerThread +import org.signal.core.models.database.StickerRecord import org.thoughtcrime.securesms.components.emoji.EmojiUtil import org.thoughtcrime.securesms.database.EmojiSearchTable import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.StickerTables import org.thoughtcrime.securesms.database.StickerTables.StickerRecordReader -import org.thoughtcrime.securesms.database.model.StickerRecord private const val RECENT_LIMIT = 24 private const val EMOJI_SEARCH_RESULTS_LIMIT = 20 diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt index 807de12990..ce416014d4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -6,6 +6,7 @@ import com.mobilecoin.lib.exceptions.SerializationException import okio.ByteString.Companion.toByteString import org.signal.core.models.ServiceId import org.signal.core.models.ServiceId.ACI +import org.signal.core.models.database.StickerRecord import org.signal.core.util.Base64 import org.signal.core.util.Hex import org.signal.core.util.UuidUtil @@ -40,7 +41,6 @@ import org.thoughtcrime.securesms.database.model.ParentStoryId import org.thoughtcrime.securesms.database.model.ParentStoryId.DirectReply import org.thoughtcrime.securesms.database.model.ParentStoryId.GroupReply import org.thoughtcrime.securesms.database.model.ReactionRecord -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java index c2a69fe44c..5e9fa06e5e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/PartAuthority.java @@ -14,7 +14,7 @@ import androidx.core.provider.DocumentsContractCompat; import org.signal.core.models.database.AttachmentId; import org.signal.core.models.media.TransformProperties; -import org.thoughtcrime.securesms.BuildConfig; +import org.signal.core.util.PartAuthorityUris; import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.avatar.AvatarPickerStorage; import org.thoughtcrime.securesms.database.SignalDatabase; @@ -28,18 +28,6 @@ import java.io.InputStream; public class PartAuthority { - private static final String AUTHORITY = BuildConfig.APPLICATION_ID; - private static final String PART_URI_STRING = "content://" + AUTHORITY + "/part"; - private static final String PART_THUMBNAIL_STRING = "content://" + AUTHORITY + "/thumbnail"; - private static final String STICKER_URI_STRING = "content://" + AUTHORITY + "/sticker"; - private static final String EMOJI_URI_STRING = "content://" + AUTHORITY + "/emoji"; - private static final String AVATAR_PICKER_URI_STRING = "content://" + AUTHORITY + "/avatar_picker"; - private static final Uri PART_CONTENT_URI = Uri.parse(PART_URI_STRING); - private static final Uri PART_THUMBNAIL_URI = Uri.parse(PART_THUMBNAIL_STRING); - private static final Uri STICKER_CONTENT_URI = Uri.parse(STICKER_URI_STRING); - private static final Uri EMOJI_CONTENT_URI = Uri.parse(EMOJI_URI_STRING); - private static final Uri AVATAR_PICKER_CONTENT_URI = Uri.parse(AVATAR_PICKER_URI_STRING); - private static final int PART_ROW = 1; private static final int BLOB_ROW = 3; private static final int STICKER_ROW = 4; @@ -51,13 +39,15 @@ public class PartAuthority { private static final UriMatcher uriMatcher; static { + String authority = PartAuthorityUris.getAuthority(); + uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); - uriMatcher.addURI(AUTHORITY, "part/#", PART_ROW); - uriMatcher.addURI(AUTHORITY, "thumbnail/#", THUMBNAIL_ROW); - uriMatcher.addURI(AUTHORITY, "sticker/#", STICKER_ROW); - uriMatcher.addURI(AUTHORITY, "wallpaper/*", WALLPAPER_ROW); - uriMatcher.addURI(AUTHORITY, "emoji/*", EMOJI_ROW); - uriMatcher.addURI(AUTHORITY, "avatar_picker/*", AVATAR_PICKER_ROW); + uriMatcher.addURI(authority, PartAuthorityUris.PATH_PART + "/#", PART_ROW); + uriMatcher.addURI(authority, PartAuthorityUris.PATH_THUMBNAIL + "/#", THUMBNAIL_ROW); + uriMatcher.addURI(authority, PartAuthorityUris.PATH_STICKER + "/#", STICKER_ROW); + uriMatcher.addURI(authority, PartAuthorityUris.PATH_WALLPAPER + "/*", WALLPAPER_ROW); + uriMatcher.addURI(authority, PartAuthorityUris.PATH_EMOJI + "/*", EMOJI_ROW); + uriMatcher.addURI(authority, PartAuthorityUris.PATH_AVATAR_PICKER + "/*", AVATAR_PICKER_ROW); uriMatcher.addURI(AppDependencies.getBlobs().getAuthority(), AppDependencies.getBlobs().PATH, BLOB_ROW); } @@ -164,35 +154,35 @@ public class PartAuthority { } public static Uri getAttachmentDataUri(AttachmentId attachmentId) { - return ContentUris.withAppendedId(PART_CONTENT_URI, attachmentId.id); + return PartAuthorityUris.getAttachmentDataUri(attachmentId); } public static Uri getAttachmentThumbnailUri(AttachmentId attachmentId) { - return ContentUris.withAppendedId(PART_THUMBNAIL_URI, attachmentId.id); + return PartAuthorityUris.getAttachmentThumbnailUri(attachmentId); } public static Uri getStickerUri(long id) { - return ContentUris.withAppendedId(STICKER_CONTENT_URI, id); + return PartAuthorityUris.getStickerUri(id); } public static Uri getAvatarPickerUri(String filename) { - return Uri.withAppendedPath(AVATAR_PICKER_CONTENT_URI, filename); + return PartAuthorityUris.getAvatarPickerUri(filename); } public static Uri getEmojiUri(String sprite) { - return Uri.withAppendedPath(EMOJI_CONTENT_URI, sprite); + return PartAuthorityUris.getEmojiUri(sprite); } public static String getWallpaperFilename(Uri uri) { - return uri.getPathSegments().get(1); + return PartAuthorityUris.getFilename(uri); } public static String getEmojiFilename(Uri uri) { - return uri.getPathSegments().get(1); + return PartAuthorityUris.getFilename(uri); } public static String getAvatarPickerFilename(Uri uri) { - return uri.getPathSegments().get(1); + return PartAuthorityUris.getFilename(uri); } public static boolean isLocalUri(final @NonNull Uri uri) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt b/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt index d455d8801a..1b10ee1f62 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/providers/AvatarProvider.kt @@ -14,6 +14,7 @@ import android.database.Cursor import android.graphics.Bitmap import android.net.Uri import android.os.ParcelFileDescriptor +import org.signal.core.util.PartAuthorityUris import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.contentproviders.BaseContentProvider import org.signal.core.util.crypto.AttachmentSecretProvider @@ -71,6 +72,8 @@ class AvatarProvider : BaseContentProvider() { private fun init(): Application? { val application = context as? ApplicationContext ?: return null + PartAuthorityUris.init(BuildConfig.APPLICATION_ID) + SqlCipherLibraryLoader.load() SignalDatabase.init( application, diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java index 3fd167207e..28f099e86e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorStickerSelectActivity.java @@ -14,11 +14,11 @@ import androidx.core.graphics.Insets; import androidx.core.view.ViewCompat; import androidx.core.view.WindowInsetsCompat; +import org.signal.core.models.database.StickerRecord; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.emoji.MediaKeyboard; import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.database.model.StickerRecord; import org.thoughtcrime.securesms.keyboard.KeyboardPage; import org.thoughtcrime.securesms.keyboard.sticker.StickerKeyboardPageFragment; import org.thoughtcrime.securesms.keyboard.sticker.StickerSearchDialogFragment; diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerEventListener.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerEventListener.java index 9761bdb12f..6ed489fcb6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerEventListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerEventListener.java @@ -2,7 +2,7 @@ package org.thoughtcrime.securesms.stickers; import androidx.annotation.NonNull; -import org.thoughtcrime.securesms.database.model.StickerRecord; +import org.signal.core.models.database.StickerRecord; public interface StickerEventListener { void onStickerSelected(@NonNull StickerRecord sticker); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewDataFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewDataFactory.kt index 4bc4b2a871..296766708a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewDataFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewDataFactory.kt @@ -5,8 +5,8 @@ package org.thoughtcrime.securesms.stickers +import org.signal.core.models.database.StickerRecord import org.thoughtcrime.securesms.database.model.StickerPackRecord -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.stickers.manage.AvailableStickerPack import org.thoughtcrime.securesms.stickers.manage.InstalledStickerPack import java.util.UUID diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java index b3fb92c0c0..3633468b4a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerSearchRepository.java @@ -5,13 +5,13 @@ import android.database.Cursor; import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; +import org.signal.core.models.database.StickerRecord; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.components.emoji.EmojiUtil; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.StickerTables; import org.thoughtcrime.securesms.database.StickerTables.StickerRecordReader; -import org.thoughtcrime.securesms.database.model.StickerRecord; import org.thoughtcrime.securesms.emoji.EmojiSource; import java.util.ArrayList; diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewRepository.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewRepository.java index ff943cd16d..300dd92568 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/preview/StickerPackPreviewRepository.java @@ -7,13 +7,13 @@ import androidx.annotation.WorkerThread; import java.util.stream.Collectors; +import org.signal.core.models.database.StickerRecord; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.InvalidMessageException; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.StickerTables; import org.thoughtcrime.securesms.database.model.StickerPackRecord; -import org.thoughtcrime.securesms.database.model.StickerRecord; import org.thoughtcrime.securesms.dependencies.AppDependencies; import org.signal.core.util.Hex; import org.thoughtcrime.securesms.stickers.StickerManifest; diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt b/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt index 4b9135d645..6a9e672285 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/database/StickerTablesTest.kt @@ -17,11 +17,11 @@ import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner import org.robolectric.annotation.Config +import org.signal.core.models.database.StickerRecord import org.signal.core.util.Hex import org.signal.core.util.deleteAll import org.thoughtcrime.securesms.database.model.IncomingSticker import org.thoughtcrime.securesms.database.model.StickerPackId -import org.thoughtcrime.securesms.database.model.StickerRecord import org.thoughtcrime.securesms.storage.StorageSyncHelper import org.thoughtcrime.securesms.testutil.RecipientTestRule import org.thoughtcrime.securesms.util.RemoteConfig diff --git a/app/src/test/java/org/thoughtcrime/securesms/testutil/MockAppDependenciesRule.kt b/app/src/test/java/org/thoughtcrime/securesms/testutil/MockAppDependenciesRule.kt index 386c16bf8d..fbbc4f970e 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/testutil/MockAppDependenciesRule.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/testutil/MockAppDependenciesRule.kt @@ -8,6 +8,8 @@ package org.thoughtcrime.securesms.testutil import androidx.test.core.app.ApplicationProvider import io.mockk.clearMocks import org.junit.rules.ExternalResource +import org.signal.core.util.PartAuthorityUris +import org.thoughtcrime.securesms.BuildConfig import org.thoughtcrime.securesms.dependencies.AppDependencies import org.thoughtcrime.securesms.dependencies.MockApplicationDependencyProvider import kotlin.reflect.KVisibility @@ -36,6 +38,8 @@ class MockAppDependenciesRule : ExternalResource() { .filterNot { skipList.contains(it.name) } override fun before() { + PartAuthorityUris.init(BuildConfig.APPLICATION_ID) + if (!AppDependencies.isInitialized) { AppDependencies.init(ApplicationProvider.getApplicationContext(), MockApplicationDependencyProvider()) } diff --git a/app/src/test/java/org/thoughtcrime/securesms/testutil/SignalDatabaseRule.kt b/app/src/test/java/org/thoughtcrime/securesms/testutil/SignalDatabaseRule.kt index cda620826e..76c832894b 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/testutil/SignalDatabaseRule.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/testutil/SignalDatabaseRule.kt @@ -11,6 +11,8 @@ import io.mockk.mockk import io.mockk.mockkObject import io.mockk.unmockkObject import org.junit.rules.ExternalResource +import org.signal.core.util.PartAuthorityUris +import org.thoughtcrime.securesms.BuildConfig import org.thoughtcrime.securesms.database.DatabaseTable import org.thoughtcrime.securesms.database.RemappedRecordsTestHelper import org.thoughtcrime.securesms.database.SQLiteDatabase @@ -32,6 +34,8 @@ class SignalDatabaseRule : ExternalResource() { get() = signalDatabase.signalWritableDatabase override fun before() { + PartAuthorityUris.init(BuildConfig.APPLICATION_ID) + RecipientId.clearCache() RemappedRecordsTestHelper.resetInstance() DatabaseTable.clearTableReferencesForTests() diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.kt b/core/util/src/main/java/org/signal/core/models/database/StickerRecord.kt similarity index 56% rename from app/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.kt rename to core/util/src/main/java/org/signal/core/models/database/StickerRecord.kt index 4a18cb3825..63c57822a5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/StickerRecord.kt +++ b/core/util/src/main/java/org/signal/core/models/database/StickerRecord.kt @@ -1,10 +1,10 @@ -package org.thoughtcrime.securesms.database.model +package org.signal.core.models.database import android.net.Uri -import org.thoughtcrime.securesms.mms.PartAuthority +import org.signal.core.util.PartAuthorityUris /** - * Represents a record for a sticker pack in the [org.thoughtcrime.securesms.database.StickerTables]. + * Represents a record for a sticker pack in the sticker tables. */ data class StickerRecord( @JvmField val rowId: Long, @@ -17,5 +17,5 @@ data class StickerRecord( @JvmField val isCover: Boolean ) { @JvmField - val uri: Uri = PartAuthority.getStickerUri(rowId) + val uri: Uri = PartAuthorityUris.getStickerUri(rowId) } diff --git a/core/util/src/main/java/org/signal/core/util/PartAuthorityUris.kt b/core/util/src/main/java/org/signal/core/util/PartAuthorityUris.kt new file mode 100644 index 0000000000..16387a3a59 --- /dev/null +++ b/core/util/src/main/java/org/signal/core/util/PartAuthorityUris.kt @@ -0,0 +1,83 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.signal.core.util + +import android.content.ContentUris +import android.net.Uri +import androidx.core.net.toUri +import org.signal.core.models.database.AttachmentId + +/** + * Builds and parses the content uris served by the application, so that models outside of the app + * module can reference them without depending on the app module's PartAuthority. + */ +object PartAuthorityUris { + + const val PATH_PART = "part" + const val PATH_THUMBNAIL = "thumbnail" + const val PATH_STICKER = "sticker" + const val PATH_WALLPAPER = "wallpaper" + const val PATH_EMOJI = "emoji" + const val PATH_AVATAR_PICKER = "avatar_picker" + + private lateinit var uris: Uris + + /** + * Must be called with the application id before any uri is built or parsed. Intentionally not tied + * to [CoreUtilDependencies] so that uris are available from the very start of [android.app.Application.onCreate]. + */ + @JvmStatic + fun init(authority: String) { + if (this::uris.isInitialized) { + return + } + + uris = Uris(authority) + } + + @JvmStatic + val authority: String + get() = uris.authority + + @JvmStatic + fun getAttachmentDataUri(attachmentId: AttachmentId): Uri { + return ContentUris.withAppendedId(uris.part, attachmentId.id) + } + + @JvmStatic + fun getAttachmentThumbnailUri(attachmentId: AttachmentId): Uri { + return ContentUris.withAppendedId(uris.partThumbnail, attachmentId.id) + } + + @JvmStatic + fun getStickerUri(id: Long): Uri { + return ContentUris.withAppendedId(uris.sticker, id) + } + + @JvmStatic + fun getEmojiUri(sprite: String): Uri { + return Uri.withAppendedPath(uris.emoji, sprite) + } + + @JvmStatic + fun getAvatarPickerUri(filename: String): Uri { + return Uri.withAppendedPath(uris.avatarPicker, filename) + } + + /** The filename component of a single-segment uri, e.g. the sprite name of an emoji uri. */ + @JvmStatic + fun getFilename(uri: Uri): String { + return uri.pathSegments[1] + } + + private class Uris(val authority: String) { + val part: Uri = "content://$authority/$PATH_PART".toUri() + val partThumbnail: Uri = "content://$authority/$PATH_THUMBNAIL".toUri() + val sticker: Uri = "content://$authority/$PATH_STICKER".toUri() + val emoji: Uri = "content://$authority/$PATH_EMOJI".toUri() + val avatarPicker: Uri = "content://$authority/$PATH_AVATAR_PICKER".toUri() + } +}