From 77ea2deadaa19cf043797e74aaa05bee3d5671f5 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 29 Mar 2022 16:48:39 -0400 Subject: [PATCH] Move more util classes to core-util. --- .../securesms/backup/FullBackupExporter.java | 2 +- .../securesms/components/ComposeText.java | 2 +- .../securesms/components/emoji/EmojiUtil.java | 2 +- .../settings/app/subscription/boost/Boost.kt | 2 +- .../app/subscription/boost/BoostViewModel.kt | 2 +- .../webrtc/CallParticipantListUpdate.java | 2 +- .../components/webrtc/WebRtcCallView.java | 2 +- .../contacts/ContactSelectionListAdapter.java | 2 +- .../contacts/ContactsSyncAdapter.java | 2 +- .../contacts/sync/ContactDiscoveryHsmV1.java | 2 +- .../contacts/sync/ContactDiscoveryV2.java | 2 +- .../contacts/sync/DirectoryHelper.java | 2 +- .../conversation/ConversationItem.java | 2 +- .../mutiselect/MultiselectItemDecoration.kt | 2 +- .../database/AttachmentDatabase.java | 2 +- .../securesms/database/GroupDatabase.java | 2 +- .../securesms/database/RecipientDatabase.kt | 80 ++----------------- .../model/GroupsV2UpdateMessageProducer.java | 4 +- .../database/model/MessageRecord.java | 2 +- .../securesms/jobs/PushGroupSendJob.java | 2 +- .../securesms/jobs/RemoteDeleteSendJob.java | 6 +- .../securesms/jobs/RetrieveProfileJob.java | 2 +- .../linkpreview/LinkPreviewUtil.java | 2 +- .../securesms/megaphone/Megaphones.java | 2 +- .../messages/IncomingMessageProcessor.java | 2 +- .../UserNotificationMigrationJob.java | 2 +- .../confirm/ConfirmPaymentFragment.java | 2 +- .../preferences/SetCurrencyViewModel.java | 2 +- .../addmoney/PaymentsAddMoneyViewModel.java | 2 +- .../details/PaymentDetailsFragment.java | 2 +- .../phonenumbers/PhoneNumberFormatter.java | 4 +- .../StoragePreferenceFragment.java | 2 +- .../securesms/profiles/ProfileName.java | 2 +- .../profiles/edit/EditProfileViewModel.java | 2 +- .../profiles/manage/EditAboutFragment.java | 2 +- .../manage/EditProfileNameFragment.java | 2 +- .../manage/EditProfileNameViewModel.java | 2 +- .../securesms/recipients/Recipient.java | 2 +- .../securesms/storage/StorageSyncHelper.java | 2 +- .../storage/StorageSyncValidations.java | 2 +- .../securesms/util/DiffHelper.java | 2 + .../securesms/util/FeatureFlags.java | 1 + .../securesms/util/GroupUtil.java | 1 + .../GroupsV2UpdateMessageProducerTest.java | 2 +- .../util/FeatureFlags_ConsistencyTest.java | 1 + .../signal/core}/util/CharacterIterable.java | 2 +- .../java/org/signal/core}/util/SetUtil.java | 11 +-- .../main/java/org/signal/core/util/SqlUtil.kt | 71 ++++++++++++++++ .../org/signal/core}/util/StringUtil.java | 13 ++- .../org/signal/core}/util/BitmaskTest.java | 3 +- .../StringUtilTest_abbreviateInMiddle.java | 3 +- .../StringUtilTest_hasMixedTextDirection.java | 3 +- .../core}/util/StringUtilTest_trim.java | 3 +- .../core}/util/StringUtilTest_trimToFit.java | 3 +- .../StringUtilTest_whitespace_handling.java | 3 +- 55 files changed, 147 insertions(+), 141 deletions(-) rename {app/src/main/java/org/thoughtcrime/securesms => core-util/src/main/java/org/signal/core}/util/CharacterIterable.java (98%) rename {app/src/main/java/org/thoughtcrime/securesms => core-util/src/main/java/org/signal/core}/util/SetUtil.java (79%) rename {app/src/main/java/org/thoughtcrime/securesms => core-util/src/main/java/org/signal/core}/util/StringUtil.java (97%) rename {app/src/test/java/org/thoughtcrime/securesms => core-util/src/test/java/org/signal/core}/util/BitmaskTest.java (98%) rename {app/src/test/java/org/thoughtcrime/securesms => core-util/src/test/java/org/signal/core}/util/StringUtilTest_abbreviateInMiddle.java (95%) rename {app/src/test/java/org/thoughtcrime/securesms => core-util/src/test/java/org/signal/core}/util/StringUtilTest_hasMixedTextDirection.java (95%) rename {app/src/test/java/org/thoughtcrime/securesms => core-util/src/test/java/org/signal/core}/util/StringUtilTest_trim.java (95%) rename {app/src/test/java/org/thoughtcrime/securesms => core-util/src/test/java/org/signal/core}/util/StringUtilTest_trimToFit.java (99%) rename {app/src/test/java/org/thoughtcrime/securesms => core-util/src/test/java/org/signal/core}/util/StringUtilTest_whitespace_handling.java (95%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java index dcbf23866..b5c5a3015 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -49,7 +49,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.recipients.RecipientId; import org.signal.core.util.CursorUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.Stopwatch; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java index d3a572dda..83bc5cc99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ComposeText.java @@ -37,7 +37,7 @@ import org.thoughtcrime.securesms.components.mention.MentionValidatorWatcher; import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.util.List; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java index 067f2392a..3c46d965d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiUtil.java @@ -9,7 +9,7 @@ import androidx.annotation.Nullable; import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser; import org.thoughtcrime.securesms.emoji.EmojiSource; import org.thoughtcrime.securesms.emoji.ObsoleteEmoji; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.Util; import java.util.HashSet; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt index 514e86403..79acb9e73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/Boost.kt @@ -13,13 +13,13 @@ import androidx.appcompat.widget.AppCompatEditText import androidx.core.animation.doOnEnd import androidx.core.text.isDigitsOnly import com.google.android.material.button.MaterialButton +import org.signal.core.util.StringUtil import org.signal.core.util.money.FiatMoney import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.BadgeImageView import org.thoughtcrime.securesms.badges.models.Badge import org.thoughtcrime.securesms.components.settings.PreferenceModel import org.thoughtcrime.securesms.payments.FiatMoneyUtil -import org.thoughtcrime.securesms.util.StringUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostViewModel.kt index 8c6823117..f89dc915f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/subscription/boost/BoostViewModel.kt @@ -12,6 +12,7 @@ import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.subjects.PublishSubject +import org.signal.core.util.StringUtil import org.signal.core.util.logging.Log import org.signal.core.util.money.FiatMoney import org.signal.donations.GooglePayApi @@ -24,7 +25,6 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.InternetConnectionObserver import org.thoughtcrime.securesms.util.PlatformCurrencyUtil -import org.thoughtcrime.securesms.util.StringUtil import org.thoughtcrime.securesms.util.livedata.Store import java.math.BigDecimal import java.text.DecimalFormat diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantListUpdate.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantListUpdate.java index f6b79f56f..1ef82a873 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantListUpdate.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantListUpdate.java @@ -8,7 +8,7 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.events.CallParticipant; import org.thoughtcrime.securesms.events.CallParticipantId; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import java.util.List; import java.util.Objects; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java index 5667052d3..92ac6ddae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java @@ -46,7 +46,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.ringrtc.CameraState; import org.thoughtcrime.securesms.util.BlurTransformation; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.ThrottledDebouncer; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.views.Stub; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java index 228203042..dee381b72 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java @@ -40,7 +40,7 @@ import org.thoughtcrime.securesms.contacts.ContactSelectionListAdapter.ViewHolde import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.CharacterIterable; +import org.signal.core.util.CharacterIterable; import org.signal.core.util.CursorUtil; import org.thoughtcrime.securesms.util.StickyHeaderDecoration.StickyHeaderAdapter; import org.thoughtcrime.securesms.util.Util; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java index 973335d03..732214422 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactsSyncAdapter.java @@ -18,7 +18,7 @@ import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import java.io.IOException; import java.util.List; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryHsmV1.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryHsmV1.java index c8e53db9b..bdb294bb6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryHsmV1.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryHsmV1.java @@ -7,7 +7,7 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper.DirectoryResult; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.push.ACI; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryV2.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryV2.java index b53a03ab0..59ce3d457 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryV2.java @@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.contacts.sync.DirectoryHelper.DirectoryResult; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.push.IasTrustStore; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.push.ACI; import org.whispersystems.signalservice.api.push.TrustStore; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java index 28edd801a..c1b653f43 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/DirectoryHelper.java @@ -40,7 +40,7 @@ import org.thoughtcrime.securesms.sms.IncomingJoinedMessage; import org.thoughtcrime.securesms.storage.StorageSyncHelper; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.ProfileUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.Stopwatch; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.profiles.ProfileAndCredential; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java index 7c7e5fe14..c87bfc173 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -128,7 +128,7 @@ import org.thoughtcrime.securesms.util.PlaceholderURLSpan; import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.ProjectionList; import org.thoughtcrime.securesms.util.SearchUtil; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.UrlClickHandler; import org.thoughtcrime.securesms.util.Util; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt index 0ef7c71e2..68f2f8639 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt @@ -21,9 +21,9 @@ import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner import androidx.recyclerview.widget.RecyclerView import com.airbnb.lottie.SimpleColorFilter +import org.signal.core.util.SetUtil import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.conversation.ConversationAdapter -import org.thoughtcrime.securesms.util.SetUtil import org.thoughtcrime.securesms.util.ThemeUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.wallpaper.ChatWallpaper diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java index a46248959..1a02e64b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentDatabase.java @@ -59,7 +59,7 @@ import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.FileUtils; import org.thoughtcrime.securesms.util.JsonUtils; import org.thoughtcrime.securesms.util.MediaUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.StorageUtil; import org.thoughtcrime.securesms.video.EncryptedMediaDataSource; import org.whispersystems.signalservice.internal.util.JsonUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java index 695ba7ea4..3e5fd6400 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupDatabase.java @@ -13,6 +13,7 @@ import androidx.annotation.WorkerThread; import com.annimon.stream.Stream; import com.google.protobuf.InvalidProtocolBufferException; +import org.signal.core.util.SetUtil; import org.signal.core.util.logging.Log; import org.signal.libsignal.zkgroup.InvalidInputException; import org.signal.libsignal.zkgroup.groups.GroupMasterKey; @@ -33,7 +34,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.signal.core.util.CursorUtil; -import org.thoughtcrime.securesms.util.SetUtil; import org.signal.core.util.SqlUtil; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt index b74bf93e2..dc12eb059 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientDatabase.kt @@ -86,7 +86,6 @@ import org.thoughtcrime.securesms.util.Base64 import org.thoughtcrime.securesms.util.GroupUtil import org.thoughtcrime.securesms.util.IdentityUtil import org.thoughtcrime.securesms.util.ProfileUtil -import org.thoughtcrime.securesms.util.StringUtil import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.wallpaper.ChatWallpaper import org.thoughtcrime.securesms.wallpaper.ChatWallpaperFactory @@ -2160,7 +2159,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : } fun querySignalContacts(inputQuery: String, includeSelf: Boolean): Cursor? { - val query = buildCaseInsensitiveGlobPattern(inputQuery) + val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery) val searchSelection = ContactSearchSelection.Builder() .withRegistered(true) @@ -2186,7 +2185,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : } fun queryNonSignalContacts(inputQuery: String): Cursor? { - val query = buildCaseInsensitiveGlobPattern(inputQuery) + val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery) val searchSelection = ContactSearchSelection.Builder() .withNonRegistered(true) .withGroups(false) @@ -2210,7 +2209,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : } fun queryNonGroupContacts(inputQuery: String, includeSelf: Boolean): Cursor? { - val query = buildCaseInsensitiveGlobPattern(inputQuery) + val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery) val searchSelection = ContactSearchSelection.Builder() .withRegistered(true) @@ -2227,7 +2226,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : } fun queryAllContacts(inputQuery: String): Cursor? { - val query = buildCaseInsensitiveGlobPattern(inputQuery) + val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery) val selection = """ $BLOCKED = ? AND @@ -2244,7 +2243,7 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : @JvmOverloads fun queryRecipientsForMentions(inputQuery: String, recipientIds: List? = null): List { - val query = buildCaseInsensitiveGlobPattern(inputQuery) + val query = SqlUtil.buildCaseInsensitiveGlobPattern(inputQuery) var ids: String? = null if (Util.hasItems(recipientIds)) { @@ -3012,75 +3011,6 @@ open class RecipientDatabase(context: Context, databaseHelper: SignalDatabase) : }.orElse(null) } - /** - * Builds a case-insensitive GLOB pattern for fuzzy text queries. Works with all unicode - * characters. - * - * Ex: - * cat -> [cC][aA][tT] - */ - private fun buildCaseInsensitiveGlobPattern(query: String): String { - if (TextUtils.isEmpty(query)) { - return "*" - } - - val pattern = StringBuilder() - var i = 0 - val len = query.codePointCount(0, query.length) - while (i < len) { - val point = StringUtil.codePointToString(query.codePointAt(i)) - pattern.append("[") - pattern.append(point.toLowerCase()) - pattern.append(point.toUpperCase()) - pattern.append(getAccentuatedCharRegex(point.toLowerCase())) - pattern.append("]") - i++ - } - - return "*$pattern*" - } - - private fun getAccentuatedCharRegex(query: String): String { - return when (query) { - "a" -> "À-Åà-åĀ-ąǍǎǞ-ǡǺ-ǻȀ-ȃȦȧȺɐ-ɒḀḁẚẠ-ặ" - "b" -> "ßƀ-ƅɃɓḂ-ḇ" - "c" -> "çÇĆ-čƆ-ƈȻȼɔḈḉ" - "d" -> "ÐðĎ-đƉ-ƍȡɖɗḊ-ḓ" - "e" -> "È-Ëè-ëĒ-ěƎ-ƐǝȄ-ȇȨȩɆɇɘ-ɞḔ-ḝẸ-ệ" - "f" -> "ƑƒḞḟ" - "g" -> "Ĝ-ģƓǤ-ǧǴǵḠḡ" - "h" -> "Ĥ-ħƕǶȞȟḢ-ḫẖ" - "i" -> "Ì-Ïì-ïĨ-ıƖƗǏǐȈ-ȋɨɪḬ-ḯỈ-ị" - "j" -> "ĴĵǰȷɈɉɟ" - "k" -> "Ķ-ĸƘƙǨǩḰ-ḵ" - "l" -> "Ĺ-łƚȴȽɫ-ɭḶ-ḽ" - "m" -> "Ɯɯ-ɱḾ-ṃ" - "n" -> "ÑñŃ-ŋƝƞǸǹȠȵɲ-ɴṄ-ṋ" - "o" -> "Ò-ÖØò-öøŌ-őƟ-ơǑǒǪ-ǭǾǿȌ-ȏȪ-ȱṌ-ṓỌ-ợ" - "p" -> "ƤƥṔ-ṗ" - "q" -> "" - "r" -> "Ŕ-řƦȐ-ȓɌɍṘ-ṟ" - "s" -> "Ś-šƧƨȘșȿṠ-ṩ" - "t" -> "Ţ-ŧƫ-ƮȚțȾṪ-ṱẗ" - "u" -> "Ù-Üù-üŨ-ųƯ-ƱǓ-ǜȔ-ȗɄṲ-ṻỤ-ự" - "v" -> "ƲɅṼ-ṿ" - "w" -> "ŴŵẀ-ẉẘ" - "x" -> "Ẋ-ẍ" - "y" -> "ÝýÿŶ-ŸƔƳƴȲȳɎɏẎẏỲ-ỹỾỿẙ" - "z" -> "Ź-žƵƶɀẐ-ẕ" - "α" -> "\u0386\u0391\u03AC\u03B1\u1F00-\u1F0F\u1F70\u1F71\u1F80-\u1F8F\u1FB0-\u1FB4\u1FB6-\u1FBC" - "ε" -> "\u0388\u0395\u03AD\u03B5\u1F10-\u1F15\u1F18-\u1F1D\u1F72\u1F73\u1FC8\u1FC9" - "η" -> "\u0389\u0397\u03AE\u03B7\u1F20-\u1F2F\u1F74\u1F75\u1F90-\u1F9F\u1F20-\u1F2F\u1F74\u1F75\u1F90-\u1F9F\u1fc2\u1fc3\u1fc4\u1fc6\u1FC7\u1FCA\u1FCB\u1FCC" - "ι" -> "\u038A\u0390\u0399\u03AA\u03AF\u03B9\u03CA\u1F30-\u1F3F\u1F76\u1F77\u1FD0-\u1FD3\u1FD6-\u1FDB" - "ο" -> "\u038C\u039F\u03BF\u03CC\u1F40-\u1F45\u1F48-\u1F4D\u1F78\u1F79\u1FF8\u1FF9" - "σ" -> "\u03A3\u03C2\u03C3" - "ς" -> "\u03A3\u03C2\u03C3" - "υ" -> "\u038E\u03A5\u03AB\u03C5\u03CB\u03CD\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F7A\u1F7B\u1FE0-\u1FE3\u1FE6-\u1FEB" - "ω" -> "\u038F\u03A9\u03C9\u03CE\u1F60-\u1F6F\u1F7C\u1F7D\u1FA0-\u1FAF\u1FF2-\u1FF4\u1FF6\u1FF7\u1FFA-\u1FFC" - else -> "" - } - } - private fun updateProfileValuesForMerge(values: ContentValues, record: RecipientRecord) { values.apply { put(PROFILE_KEY, if (record.profileKey != null) Base64.encodeBytes(record.profileKey) else null) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java index aca0e9d06..da0016e8c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducer.java @@ -3,10 +3,8 @@ package org.thoughtcrime.securesms.database.model; import android.content.Context; import androidx.annotation.DrawableRes; -import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.annotation.WorkerThread; import com.google.protobuf.ByteString; @@ -24,7 +22,7 @@ import org.signal.storageservice.protos.groups.local.EnabledState; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.groups.GV2AccessLevelUtil; import org.thoughtcrime.securesms.util.ExpirationUtil; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.util.UuidUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java index c0dd37d0a..e34e7a643 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java @@ -58,7 +58,7 @@ import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.ExpirationUtil; import org.thoughtcrime.securesms.util.GroupUtil; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; import org.whispersystems.signalservice.api.push.ServiceId; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index c8ecbe50a..45aac6d9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -45,7 +45,7 @@ import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.transport.UndeliverableMessageException; import org.thoughtcrime.securesms.util.GroupUtil; import org.thoughtcrime.securesms.util.RecipientAccessList; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.SignalLocalMetrics; import org.whispersystems.signalservice.api.crypto.ContentHint; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java index 49537eec7..877f833a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RemoteDeleteSendJob.java @@ -11,7 +11,6 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.MessageDatabase; import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.database.model.DistributionListId; import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.groups.GroupId; @@ -22,10 +21,9 @@ import org.thoughtcrime.securesms.net.NotPushRegisteredException; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; -import org.thoughtcrime.securesms.stories.Stories; import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.util.GroupUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.crypto.ContentHint; import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException; @@ -34,10 +32,8 @@ import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage; import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; public class RemoteDeleteSendJob extends BaseJob { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java index 13f534175..87c022987 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.java @@ -40,7 +40,7 @@ import org.thoughtcrime.securesms.transport.RetryLaterException; import org.thoughtcrime.securesms.util.Base64; import org.thoughtcrime.securesms.util.IdentityUtil; import org.thoughtcrime.securesms.util.ProfileUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.Stopwatch; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.crypto.InvalidCiphertextException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java index 067e90833..2e1045933 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewUtil.java @@ -17,7 +17,7 @@ import com.annimon.stream.Stream; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.stickers.StickerUrl; import org.thoughtcrime.securesms.util.DateUtils; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.util.OptionalUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index 63a3982dd..dd56d3604 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -31,7 +31,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.LocaleFeatureFlags; import org.thoughtcrime.securesms.util.PlayServicesUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.VersionTracker; import org.thoughtcrime.securesms.util.dynamiclanguage.DynamicLanguageContextWrapper; import org.thoughtcrime.securesms.wallpaper.ChatWallpaperActivity; diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java index 86871a1b7..7c99da483 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageProcessor.java @@ -24,7 +24,7 @@ import org.thoughtcrime.securesms.messages.MessageDecryptionUtil.DecryptionResul import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.GroupUtil; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.Stopwatch; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.api.SignalSessionLock; diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java index 8254d1cd3..bb314b470 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/UserNotificationMigrationJob.java @@ -21,7 +21,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.notifications.NotificationChannels; import org.thoughtcrime.securesms.notifications.NotificationIds; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import java.util.List; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java index 3490ad468..abaee435c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/confirm/ConfirmPaymentFragment.java @@ -33,7 +33,7 @@ import org.thoughtcrime.securesms.payments.Payee; import org.thoughtcrime.securesms.payments.preferences.RecipientHasNotEnabledPaymentsDialog; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.BottomSheetUtil; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList; import org.thoughtcrime.securesms.util.navigation.SafeNavigation; import org.whispersystems.signalservice.api.payments.FormatterOptions; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyViewModel.java index 4eb194d7c..b86e24997 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/SetCurrencyViewModel.java @@ -22,7 +22,7 @@ import org.thoughtcrime.securesms.payments.currency.CurrencyExchange; import org.thoughtcrime.securesms.payments.currency.CurrencyExchangeRepository; import org.thoughtcrime.securesms.payments.currency.CurrencyUtil; import org.thoughtcrime.securesms.util.AsynchronousCallback; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList; import org.thoughtcrime.securesms.util.livedata.Store; diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyViewModel.java index 653cfeb82..d83ac75a0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/addmoney/PaymentsAddMoneyViewModel.java @@ -11,7 +11,7 @@ import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; import org.thoughtcrime.securesms.util.AsynchronousCallback; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; final class PaymentsAddMoneyViewModel extends ViewModel { diff --git a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java index 52e7462d1..65cc38b22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/payments/preferences/details/PaymentDetailsFragment.java @@ -34,7 +34,7 @@ import org.thoughtcrime.securesms.payments.State; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.DateUtils; import org.thoughtcrime.securesms.util.SpanUtil; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.views.LearnMoreTextView; import org.whispersystems.signalservice.api.payments.Money; diff --git a/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter.java b/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter.java index 183268413..b71151384 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter.java @@ -15,8 +15,8 @@ import org.signal.libsignal.protocol.util.Pair; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.util.SetUtil; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.SetUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.Util; import java.util.Optional; diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/StoragePreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/StoragePreferenceFragment.java index 78b6545ba..c78c051e7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/StoragePreferenceFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/StoragePreferenceFragment.java @@ -36,7 +36,7 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity; import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.preferences.widgets.StoragePreferenceCategory; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.adapter.mapping.MappingModelList; import java.text.NumberFormat; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/ProfileName.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/ProfileName.java index dba8634f1..b3ab0515a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/ProfileName.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/ProfileName.java @@ -9,7 +9,7 @@ import androidx.annotation.VisibleForTesting; import com.annimon.stream.Stream; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.cjkv.CJKVUtil; import org.whispersystems.signalservice.api.crypto.ProfileCipher; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java index 5d3c71a6b..951a78cb7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java @@ -14,7 +14,7 @@ import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.profiles.edit.EditProfileRepository.UploadResult; import org.thoughtcrime.securesms.util.SingleLiveEvent; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import java.util.Arrays; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java index c971a469b..ec0574ec4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditAboutFragment.java @@ -30,7 +30,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.emoji.EmojiUtil; import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment; import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.adapter.AlwaysChangedDiffUtil; import org.thoughtcrime.securesms.util.text.AfterTextChanged; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java index 6c646b294..fbc4bfaa6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameFragment.java @@ -22,7 +22,7 @@ import org.signal.core.util.EditTextUtil; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.text.AfterTextChanged; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java index db82d521c..f944b54c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileNameViewModel.java @@ -10,7 +10,7 @@ import androidx.lifecycle.ViewModel; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.util.SingleLiveEvent; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; public final class EditProfileNameViewModel extends ViewModel { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java index 30c69fdd8..a2c907125 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java @@ -44,7 +44,7 @@ import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.util.AvatarUtil; import org.thoughtcrime.securesms.util.FeatureFlags; -import org.thoughtcrime.securesms.util.StringUtil; +import org.signal.core.util.StringUtil; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.wallpaper.ChatWallpaper; import org.whispersystems.signalservice.api.push.PNI; diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java index d928a3f76..fca775d28 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java @@ -22,7 +22,7 @@ import org.thoughtcrime.securesms.payments.Entropy; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.subscription.Subscriber; import org.thoughtcrime.securesms.util.Base64; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.storage.SignalAccountRecord; diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncValidations.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncValidations.java index 0e0e6439c..11cb806dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncValidations.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncValidations.java @@ -8,7 +8,7 @@ import com.annimon.stream.Stream; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.Base64; -import org.thoughtcrime.securesms.util.SetUtil; +import org.signal.core.util.SetUtil; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.storage.SignalStorageManifest; import org.whispersystems.signalservice.api.storage.SignalStorageRecord; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DiffHelper.java b/app/src/main/java/org/thoughtcrime/securesms/util/DiffHelper.java index ddde3b670..7b308ea52 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/DiffHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DiffHelper.java @@ -2,6 +2,8 @@ package org.thoughtcrime.securesms.util; import androidx.annotation.NonNull; +import org.signal.core.util.SetUtil; + import java.util.Collection; import java.util.Set; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index 41cba4652..26e313c3a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -10,6 +10,7 @@ import com.annimon.stream.Stream; import org.json.JSONException; import org.json.JSONObject; +import org.signal.core.util.SetUtil; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java index fddde2fe4..9eecc506f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/GroupUtil.java @@ -8,6 +8,7 @@ import androidx.annotation.WorkerThread; import com.google.protobuf.ByteString; +import org.signal.core.util.StringUtil; import org.signal.core.util.logging.Log; import org.signal.libsignal.protocol.InvalidMessageException; import org.signal.libsignal.zkgroup.InvalidInputException; diff --git a/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java b/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java index e1e522afe..e6a3533aa 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/database/model/GroupsV2UpdateMessageProducerTest.java @@ -42,7 +42,7 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.thoughtcrime.securesms.groups.v2.ChangeBuilder.changeBy; import static org.thoughtcrime.securesms.groups.v2.ChangeBuilder.changeByUnknown; -import static org.thoughtcrime.securesms.util.StringUtil.isolateBidi; +import static org.signal.core.util.StringUtil.isolateBidi; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_ConsistencyTest.java b/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_ConsistencyTest.java index e91c86596..50caa9e34 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_ConsistencyTest.java +++ b/app/src/test/java/org/thoughtcrime/securesms/util/FeatureFlags_ConsistencyTest.java @@ -4,6 +4,7 @@ import com.annimon.stream.Collectors; import com.annimon.stream.Stream; import org.junit.Test; +import org.signal.core.util.SetUtil; import java.util.Set; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/CharacterIterable.java b/core-util/src/main/java/org/signal/core/util/CharacterIterable.java similarity index 98% rename from app/src/main/java/org/thoughtcrime/securesms/util/CharacterIterable.java rename to core-util/src/main/java/org/signal/core/util/CharacterIterable.java index b0e8eaf72..56d175ff1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/CharacterIterable.java +++ b/core-util/src/main/java/org/signal/core/util/CharacterIterable.java @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import android.os.Build; diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SetUtil.java b/core-util/src/main/java/org/signal/core/util/SetUtil.java similarity index 79% rename from app/src/main/java/org/thoughtcrime/securesms/util/SetUtil.java rename to core-util/src/main/java/org/signal/core/util/SetUtil.java index b739b2650..6ec1ef04e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SetUtil.java +++ b/core-util/src/main/java/org/signal/core/util/SetUtil.java @@ -1,9 +1,6 @@ -package org.thoughtcrime.securesms.util; - -import android.annotation.SuppressLint; - -import com.google.android.collect.Sets; +package org.signal.core.util; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashSet; @@ -30,8 +27,8 @@ public final class SetUtil { return result; } - @SuppressLint("NewApi") + @SafeVarargs public static HashSet newHashSet(E... elements) { - return Sets.newHashSet(elements); + return new HashSet<>(Arrays.asList(elements)); } } diff --git a/core-util/src/main/java/org/signal/core/util/SqlUtil.kt b/core-util/src/main/java/org/signal/core/util/SqlUtil.kt index f457cfc9d..5c834e953 100644 --- a/core-util/src/main/java/org/signal/core/util/SqlUtil.kt +++ b/core-util/src/main/java/org/signal/core/util/SqlUtil.kt @@ -2,6 +2,7 @@ package org.signal.core.util import androidx.sqlite.db.SupportSQLiteDatabase import android.content.ContentValues +import android.text.TextUtils import androidx.annotation.VisibleForTesting import java.lang.NullPointerException import java.lang.StringBuilder @@ -73,6 +74,76 @@ object SqlUtil { return arrayOf(argument.toString()) } + /** + * Builds a case-insensitive GLOB pattern for fuzzy text queries. Works with all unicode + * characters. + * + * Ex: + * cat -> [cC][aA][tT] + */ + @JvmStatic + fun buildCaseInsensitiveGlobPattern(query: String): String { + if (TextUtils.isEmpty(query)) { + return "*" + } + + val pattern = StringBuilder() + var i = 0 + val len = query.codePointCount(0, query.length) + while (i < len) { + val point = StringUtil.codePointToString(query.codePointAt(i)) + pattern.append("[") + pattern.append(point.toLowerCase(Locale.getDefault())) + pattern.append(point.toUpperCase(Locale.getDefault())) + pattern.append(getAccentuatedCharRegex(point.toLowerCase(Locale.getDefault()))) + pattern.append("]") + i++ + } + + return "*$pattern*" + } + + private fun getAccentuatedCharRegex(query: String): String { + return when (query) { + "a" -> "À-Åà-åĀ-ąǍǎǞ-ǡǺ-ǻȀ-ȃȦȧȺɐ-ɒḀḁẚẠ-ặ" + "b" -> "ßƀ-ƅɃɓḂ-ḇ" + "c" -> "çÇĆ-čƆ-ƈȻȼɔḈḉ" + "d" -> "ÐðĎ-đƉ-ƍȡɖɗḊ-ḓ" + "e" -> "È-Ëè-ëĒ-ěƎ-ƐǝȄ-ȇȨȩɆɇɘ-ɞḔ-ḝẸ-ệ" + "f" -> "ƑƒḞḟ" + "g" -> "Ĝ-ģƓǤ-ǧǴǵḠḡ" + "h" -> "Ĥ-ħƕǶȞȟḢ-ḫẖ" + "i" -> "Ì-Ïì-ïĨ-ıƖƗǏǐȈ-ȋɨɪḬ-ḯỈ-ị" + "j" -> "ĴĵǰȷɈɉɟ" + "k" -> "Ķ-ĸƘƙǨǩḰ-ḵ" + "l" -> "Ĺ-łƚȴȽɫ-ɭḶ-ḽ" + "m" -> "Ɯɯ-ɱḾ-ṃ" + "n" -> "ÑñŃ-ŋƝƞǸǹȠȵɲ-ɴṄ-ṋ" + "o" -> "Ò-ÖØò-öøŌ-őƟ-ơǑǒǪ-ǭǾǿȌ-ȏȪ-ȱṌ-ṓỌ-ợ" + "p" -> "ƤƥṔ-ṗ" + "q" -> "" + "r" -> "Ŕ-řƦȐ-ȓɌɍṘ-ṟ" + "s" -> "Ś-šƧƨȘșȿṠ-ṩ" + "t" -> "Ţ-ŧƫ-ƮȚțȾṪ-ṱẗ" + "u" -> "Ù-Üù-üŨ-ųƯ-ƱǓ-ǜȔ-ȗɄṲ-ṻỤ-ự" + "v" -> "ƲɅṼ-ṿ" + "w" -> "ŴŵẀ-ẉẘ" + "x" -> "Ẋ-ẍ" + "y" -> "ÝýÿŶ-ŸƔƳƴȲȳɎɏẎẏỲ-ỹỾỿẙ" + "z" -> "Ź-žƵƶɀẐ-ẕ" + "α" -> "\u0386\u0391\u03AC\u03B1\u1F00-\u1F0F\u1F70\u1F71\u1F80-\u1F8F\u1FB0-\u1FB4\u1FB6-\u1FBC" + "ε" -> "\u0388\u0395\u03AD\u03B5\u1F10-\u1F15\u1F18-\u1F1D\u1F72\u1F73\u1FC8\u1FC9" + "η" -> "\u0389\u0397\u03AE\u03B7\u1F20-\u1F2F\u1F74\u1F75\u1F90-\u1F9F\u1F20-\u1F2F\u1F74\u1F75\u1F90-\u1F9F\u1fc2\u1fc3\u1fc4\u1fc6\u1FC7\u1FCA\u1FCB\u1FCC" + "ι" -> "\u038A\u0390\u0399\u03AA\u03AF\u03B9\u03CA\u1F30-\u1F3F\u1F76\u1F77\u1FD0-\u1FD3\u1FD6-\u1FDB" + "ο" -> "\u038C\u039F\u03BF\u03CC\u1F40-\u1F45\u1F48-\u1F4D\u1F78\u1F79\u1FF8\u1FF9" + "σ" -> "\u03A3\u03C2\u03C3" + "ς" -> "\u03A3\u03C2\u03C3" + "υ" -> "\u038E\u03A5\u03AB\u03C5\u03CB\u03CD\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F\u1F7A\u1F7B\u1FE0-\u1FE3\u1FE6-\u1FEB" + "ω" -> "\u038F\u03A9\u03C9\u03CE\u1F60-\u1F6F\u1F7C\u1F7D\u1FA0-\u1FAF\u1FF2-\u1FF4\u1FF6\u1FF7\u1FFA-\u1FFC" + else -> "" + } + } + /** * Returns an updated query and args pairing that will only update rows that would *actually* * change. In other words, if [SupportSQLiteDatabase.update] diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java b/core-util/src/main/java/org/signal/core/util/StringUtil.java similarity index 97% rename from app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java rename to core-util/src/main/java/org/signal/core/util/StringUtil.java index 9d9ca2aed..11eb91b22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/StringUtil.java +++ b/core-util/src/main/java/org/signal/core/util/StringUtil.java @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import android.text.TextUtils; @@ -6,8 +6,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.text.BidiFormatter; -import org.signal.core.util.BreakIteratorCompat; - import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -198,6 +196,13 @@ public final class StringUtil { return false; } + /** + * @return True if the text is null or has a length of 0, otherwise false. + */ + public static boolean isEmpty(@Nullable String text) { + return text == null || text.length() == 0; + } + /** * Isolates bi-directional text from influencing surrounding text. You should use this whenever * you're injecting user-generated text into a larger string. @@ -216,7 +221,7 @@ public final class StringUtil { return ""; } - if (Util.isEmpty(text)) { + if (isEmpty(text)) { return text; } diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/BitmaskTest.java b/core-util/src/test/java/org/signal/core/util/BitmaskTest.java similarity index 98% rename from app/src/test/java/org/thoughtcrime/securesms/util/BitmaskTest.java rename to core-util/src/test/java/org/signal/core/util/BitmaskTest.java index 629c32e43..4e4b2ee14 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/BitmaskTest.java +++ b/core-util/src/test/java/org/signal/core/util/BitmaskTest.java @@ -1,7 +1,6 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import org.junit.Test; -import org.signal.core.util.Bitmask; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_abbreviateInMiddle.java b/core-util/src/test/java/org/signal/core/util/StringUtilTest_abbreviateInMiddle.java similarity index 95% rename from app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_abbreviateInMiddle.java rename to core-util/src/test/java/org/signal/core/util/StringUtilTest_abbreviateInMiddle.java index a0a2ca81a..79cda8691 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_abbreviateInMiddle.java +++ b/core-util/src/test/java/org/signal/core/util/StringUtilTest_abbreviateInMiddle.java @@ -1,8 +1,9 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.signal.core.util.StringUtil; import java.util.Arrays; import java.util.Collection; diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_hasMixedTextDirection.java b/core-util/src/test/java/org/signal/core/util/StringUtilTest_hasMixedTextDirection.java similarity index 95% rename from app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_hasMixedTextDirection.java rename to core-util/src/test/java/org/signal/core/util/StringUtilTest_hasMixedTextDirection.java index 16e77a81e..971496497 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_hasMixedTextDirection.java +++ b/core-util/src/test/java/org/signal/core/util/StringUtilTest_hasMixedTextDirection.java @@ -1,8 +1,9 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.signal.core.util.StringUtil; import java.util.Arrays; import java.util.Collection; diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_trim.java b/core-util/src/test/java/org/signal/core/util/StringUtilTest_trim.java similarity index 95% rename from app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_trim.java rename to core-util/src/test/java/org/signal/core/util/StringUtilTest_trim.java index 9d0fb446c..f4e74e55d 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_trim.java +++ b/core-util/src/test/java/org/signal/core/util/StringUtilTest_trim.java @@ -1,8 +1,9 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.signal.core.util.StringUtil; import java.util.Arrays; import java.util.Collection; diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_trimToFit.java b/core-util/src/test/java/org/signal/core/util/StringUtilTest_trimToFit.java similarity index 99% rename from app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_trimToFit.java rename to core-util/src/test/java/org/signal/core/util/StringUtilTest_trimToFit.java index 7ae5bbc41..9bc06e23e 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_trimToFit.java +++ b/core-util/src/test/java/org/signal/core/util/StringUtilTest_trimToFit.java @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import android.app.Application; import android.os.Build; @@ -7,6 +7,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; +import org.signal.core.util.StringUtil; import static org.junit.Assert.assertEquals; import static org.junit.Assume.assumeTrue; diff --git a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_whitespace_handling.java b/core-util/src/test/java/org/signal/core/util/StringUtilTest_whitespace_handling.java similarity index 95% rename from app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_whitespace_handling.java rename to core-util/src/test/java/org/signal/core/util/StringUtilTest_whitespace_handling.java index 145067bae..4ea5de8db 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/util/StringUtilTest_whitespace_handling.java +++ b/core-util/src/test/java/org/signal/core/util/StringUtilTest_whitespace_handling.java @@ -1,8 +1,9 @@ -package org.thoughtcrime.securesms.util; +package org.signal.core.util; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.signal.core.util.StringUtil; import java.util.Arrays; import java.util.Collection;