diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 62825970d3..adfefa75a7 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ apply { from("fix-profm.gradle") } -val canonicalVersionCode = 1380 -val canonicalVersionName = "6.45.2" +val canonicalVersionCode = 1393 +val canonicalVersionName = "6.47.4" val mollyRevision = 1 val postFixSize = 100 @@ -86,7 +86,6 @@ android { kotlinOptions { jvmTarget = signalKotlinJvmTarget - freeCompilerArgs = listOf("-Xallow-result-return-type") } signingConfigs { @@ -153,8 +152,8 @@ android { versionCode = canonicalVersionCode * postFixSize + mollyRevision versionName = if (ciEnabled) getCommitTag() else canonicalVersionName - minSdkVersion(signalMinSdkVersion) - targetSdkVersion(signalTargetSdkVersion) + minSdk = signalMinSdkVersion + targetSdk = signalTargetSdkVersion applicationId = basePackageId @@ -375,23 +374,22 @@ android { } } - android.buildTypes.forEach { - val path: String = if (it.name == "release") { - "$projectDir/src/release/java" - } else { - "$projectDir/src/debug/java" + androidComponents { + beforeVariants { variant -> + val selected = variant.name in selectableVariants + if (!(selected && buildVariants.toRegex().containsMatchIn(variant.name))) { + variant.enable = false + } } - - sourceSets.findByName(it.name)!!.java.srcDir(path) } -} -androidComponents { - beforeVariants { variantBuilder -> - val name = variantBuilder.name - val selected = selectableVariants.contains(name) - if (!(selected && buildVariants.toRegex().containsMatchIn(name))) { - variantBuilder.enable = false + val releaseDir = "$projectDir/src/release/java" + val debugDir = "$projectDir/src/debug/java" + + android.buildTypes.configureEach { + val path = if (name == "release") releaseDir else debugDir + sourceSets.named(name) { + java.srcDir(path) } } } @@ -430,16 +428,19 @@ dependencies { implementation(libs.androidx.exifinterface) implementation(libs.androidx.compose.rxjava3) implementation(libs.androidx.compose.runtime.livedata) + implementation(libs.androidx.activity.compose) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.multidex) implementation(libs.androidx.navigation.fragment.ktx) implementation(libs.androidx.navigation.ui.ktx) + implementation(libs.androidx.navigation.compose) implementation(libs.androidx.lifecycle.viewmodel.ktx) implementation(libs.androidx.lifecycle.livedata.ktx) implementation(libs.androidx.lifecycle.process) implementation(libs.androidx.lifecycle.viewmodel.savedstate) implementation(libs.androidx.lifecycle.common.java8) implementation(libs.androidx.lifecycle.reactivestreams.ktx) + implementation(libs.androidx.activity.compose) implementation(libs.androidx.camera.core) implementation(libs.androidx.camera.camera2) implementation(libs.androidx.camera.lifecycle) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt index c55eeef56a..8e3937b20f 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt @@ -8,6 +8,7 @@ package org.thoughtcrime.securesms.conversation.v2.items import android.net.Uri import android.view.View import androidx.lifecycle.Observer +import com.bumptech.glide.RequestManager import io.mockk.mockk import org.junit.Assert.assertEquals import org.junit.Rule @@ -29,7 +30,6 @@ import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stickers.StickerLocator @@ -209,7 +209,7 @@ class V2ConversationItemShapeTest { override val selectedItems: Set = emptySet() override val isMessageRequestAccepted: Boolean = true override val searchQuery: String? = null - override val glideRequests: GlideRequests = mockk() + override val requestManager: RequestManager = mockk() override val isParentInScroll: Boolean = false override fun getChatColorsData(): ChatColorsDrawable.ChatColorsData = ChatColorsDrawable.ChatColorsData(null, null) @@ -318,5 +318,11 @@ class V2ConversationItemShapeTest { override fun onItemClick(item: MultiselectPart?) = Unit override fun onItemLongClick(itemView: View?, item: MultiselectPart?) = Unit + + override fun onShowSafetyTips(forGroup: Boolean) = Unit + + override fun onReportSpamLearnMoreClicked() = Unit + + override fun onMessageRequestAcceptOptionsClicked() = Unit } } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt index 0b456cc899..3b2ce69942 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt @@ -190,7 +190,7 @@ class RecipientTableTest { val mainId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) val mainRecord = SignalDatabase.recipients.getRecord(mainId) - SignalDatabase.recipients.splitForStorageSync(mainRecord.storageId!!) + SignalDatabase.recipients.splitForStorageSyncIfNecessary(mainRecord.aci!!) val byAci: RecipientId = SignalDatabase.recipients.getByAci(ACI_A).get() diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index dbf277b89a..9bf07f21e5 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -18,6 +18,7 @@ import org.signal.core.util.Base64 import org.signal.core.util.SqlUtil import org.signal.core.util.exists import org.signal.core.util.orNull +import org.signal.core.util.readToSingleBoolean import org.signal.core.util.requireLong import org.signal.core.util.requireNonNullString import org.signal.core.util.select @@ -109,6 +110,18 @@ class RecipientTableTest_getAndPossiblyMerge { val record = SignalDatabase.recipients.getRecord(id) assertEquals(RecipientTable.RegisteredState.REGISTERED, record.registered) } + + test("e164+pni+aci insert, pni verified") { + val id = process(E164_A, PNI_A, ACI_A, pniVerified = true) + expect(E164_A, PNI_A, ACI_A) + expectPniVerified() + + val record = SignalDatabase.recipients.getRecord(id) + assertEquals(RecipientTable.RegisteredState.REGISTERED, record.registered) + + process(E164_A, PNI_A, ACI_A, pniVerified = false) + expectPniVerified() + } } @Test @@ -164,6 +177,7 @@ class RecipientTableTest_getAndPossiblyMerge { expect(E164_A, PNI_A, ACI_A) expectNoSessionSwitchoverEvent() + expectPniVerified() } test("no match, all fields") { @@ -225,6 +239,8 @@ class RecipientTableTest_getAndPossiblyMerge { given(E164_A, PNI_A, null, pniSession = true) process(E164_A, PNI_A, ACI_A, pniVerified = true) expect(E164_A, PNI_A, ACI_A) + + expectPniVerified() } test("e164 and aci matches, all provided, new pni") { @@ -694,6 +710,8 @@ class RecipientTableTest_getAndPossiblyMerge { expectDeleted() expect(E164_A, PNI_A, ACI_A) + + expectPniVerified() } test("merge, e164+pni & aci, pni session, pni verified") { @@ -706,6 +724,7 @@ class RecipientTableTest_getAndPossiblyMerge { expect(E164_A, PNI_A, ACI_A) expectThreadMergeEvent(E164_A) + expectPniVerified() } test("merge, e164+pni & e164+pni+aci, change number") { @@ -874,8 +893,8 @@ class RecipientTableTest_getAndPossiblyMerge { // Thread validation assertEquals(threadIdAci, retrievedThreadId) - Assert.assertNull(SignalDatabase.threads.getThreadIdFor(recipientIdE164)) - Assert.assertNull(SignalDatabase.threads.getThreadRecord(threadIdE164)) + assertNull(SignalDatabase.threads.getThreadIdFor(recipientIdE164)) + assertNull(SignalDatabase.threads.getThreadRecord(threadIdE164)) // SMS validation val sms1: MessageRecord = SignalDatabase.messages.getMessageRecord(smsId1)!! @@ -919,10 +938,10 @@ class RecipientTableTest_getAndPossiblyMerge { // Identity validation assertEquals(identityKeyAci, SignalDatabase.identities.getIdentityStoreRecord(ACI_A.toString())!!.identityKey) - Assert.assertNull(SignalDatabase.identities.getIdentityStoreRecord(E164_A)) + assertNull(SignalDatabase.identities.getIdentityStoreRecord(E164_A)) // Session validation - Assert.assertNotNull(SignalDatabase.sessions.load(ACI_SELF, SignalProtocolAddress(ACI_A.toString(), 1))) + assertNotNull(SignalDatabase.sessions.load(ACI_SELF, SignalProtocolAddress(ACI_A.toString(), 1))) // Reaction validation val reactionsSms: List = SignalDatabase.reactions.getReactions(MessageId(smsId1)) @@ -1037,6 +1056,10 @@ class RecipientTableTest_getAndPossiblyMerge { if (!test.sessionSwitchoverExpected) { test.expectNoSessionSwitchoverEvent() } + + if (!test.pniVerifiedExpected) { + test.expectPniNotVerified() + } } catch (e: Throwable) { if (e.javaClass != exception) { val error = java.lang.AssertionError("[$name] ${e.message}") @@ -1056,6 +1079,7 @@ class RecipientTableTest_getAndPossiblyMerge { var changeNumberExpected = false var threadMergeExpected = false var sessionSwitchoverExpected = false + var pniVerifiedExpected = false init { // Need to delete these first to prevent foreign key crash @@ -1207,6 +1231,24 @@ class RecipientTableTest_getAndPossiblyMerge { assertNull("Unexpected thread merge event!", getLatestThreadMergeEvent(outputRecipientId)) } + fun expectPniVerified() { + assertTrue("Expected PNI to be verified!", isPniVerified(outputRecipientId)) + pniVerifiedExpected = true + } + + fun expectPniNotVerified() { + assertFalse("Expected PNI to be not be verified!", isPniVerified(outputRecipientId)) + } + + private fun isPniVerified(recipientId: RecipientId): Boolean { + return SignalDatabase.rawDatabase + .select(RecipientTable.PNI_SIGNATURE_VERIFIED) + .from(RecipientTable.TABLE_NAME) + .where("${RecipientTable.ID} = ?", recipientId) + .run() + .readToSingleBoolean(false) + } + private fun insert(e164: String?, pni: PNI?, aci: ACI?): RecipientId { val id: Long = SignalDatabase.rawDatabase.insert( RecipientTable.TABLE_NAME, diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt index 6ea77484b5..b00aba7111 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/SmsDatabaseTest_collapseJoinRequestEventsIfPossible.kt @@ -290,7 +290,8 @@ class SmsDatabaseTest_collapseJoinRequestEventsIfPossible { from = sender, timestamp = wallClock, groupId = groupId, - groupContext = groupContext + groupContext = groupContext, + serverGuid = null ) } diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt index f63fd8c667..782c75b419 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt @@ -33,7 +33,7 @@ class ContactRecordProcessorTest { } @Test - fun process_splitContact_normalSplit() { + fun process_splitContact_normalSplit_twoRecords() { // GIVEN val originalId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) setStorageId(originalId, STORAGE_ID_A) @@ -69,6 +69,35 @@ class ContactRecordProcessorTest { assertNotEquals(byAci, byE164) } + @Test + fun process_splitContact_normalSplit_oneRecord() { + // GIVEN + val originalId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) + setStorageId(originalId, STORAGE_ID_A) + + val remote = buildRecord( + STORAGE_ID_B, + ContactRecord( + aci = ACI_A.toString(), + unregisteredAtTimestamp = 100 + ) + ) + + // WHEN + val subject = ContactRecordProcessor() + subject.process(listOf(remote), StorageSyncHelper.KEY_GENERATOR) + + // THEN + val byAci: RecipientId = SignalDatabase.recipients.getByAci(ACI_A).get() + + val byE164: RecipientId = SignalDatabase.recipients.getByE164(E164_A).get() + val byPni: RecipientId = SignalDatabase.recipients.getByPni(PNI_A).get() + + assertEquals(originalId, byAci) + assertEquals(byE164, byPni) + assertNotEquals(byAci, byE164) + } + @Test fun process_splitContact_doNotSplitIfAciRecordIsRegistered() { // GIVEN diff --git a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt index 2a0b90f4ce..1b358b84cd 100644 --- a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt +++ b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/ConversationElementGenerator.kt @@ -118,7 +118,8 @@ class ConversationElementGenerator { null, null, 0, - false + false, + null ) val conversationMessage = ConversationMessageFactory.createWithUnresolvedData( diff --git a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt index f10389ac4c..a6abeae8b9 100644 --- a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt +++ b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt @@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.lifecycle.Observer import androidx.navigation.navGraphViewModels +import com.bumptech.glide.Glide import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.concurrent.LifecycleDisposable @@ -42,7 +43,6 @@ import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.stickers.StickerLocator @@ -62,7 +62,7 @@ class InternalConversationTestFragment : Fragment(R.layout.conversation_test_fra override fun onViewCreated(view: View, savedInstanceState: Bundle?) { val adapter = ConversationAdapterV2( lifecycleOwner = viewLifecycleOwner, - glideRequests = GlideApp.with(this), + requestManager = Glide.with(this), clickListener = ClickListener(), hasWallpaper = springboardViewModel.hasWallpaper.value, colorizer = Colorizer(), @@ -290,5 +290,17 @@ class InternalConversationTestFragment : Fragment(R.layout.conversation_test_fra override fun onItemLongClick(itemView: View?, item: MultiselectPart?) { Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show() } + + override fun onShowSafetyTips(forGroup: Boolean) { + Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show() + } + + override fun onReportSpamLearnMoreClicked() { + Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show() + } + + override fun onMessageRequestAcceptOptionsClicked() { + Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show() + } } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5e808672b0..2026662254 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -649,7 +649,12 @@ + + @@ -719,6 +724,13 @@ android:windowSoftInputMode="stateAlwaysHidden" android:exported="false"/> + + (Landroid/content/Context;Landroid/util/AttributeSet;I)V +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->setTitle(Ljava/lang/CharSequence;)V +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z +HPLandroidx/appcompat/view/menu/ActionMenuItemView;->updateTextButtonVisibility()V +HPLandroidx/appcompat/view/menu/BaseMenuPresenter;->createItemView(Landroid/view/ViewGroup;)Landroidx/appcompat/view/menu/MenuView$ItemView; +HPLandroidx/appcompat/view/menu/BaseMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getSupportActionProvider()Landroidx/core/view/ActionProvider; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleForItemView(Landroidx/appcompat/view/menu/MenuView$ItemView;)Ljava/lang/CharSequence; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z +HPLandroidx/appcompat/view/menu/MenuItemImpl;->setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem; +HPLandroidx/appcompat/view/menu/MenuItemImpl;->showsTextAsAction()Z +HPLandroidx/appcompat/widget/ActionMenuPresenter;->bindItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroidx/appcompat/view/menu/MenuView$ItemView;)V +HPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; +HPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; HPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HPLandroidx/core/view/ViewGroupKt$descendants$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; -HPLandroidx/core/view/ViewGroupKt;->getDescendants(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; +HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Landroid/view/View; +HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Ljava/lang/Object; HPLandroidx/customview/poolingcontainer/PoolingContainer;->callPoolingContainerOnRelease(Landroid/view/View;)V HPLandroidx/customview/poolingcontainer/PoolingContainer;->getPoolingContainerListenerHolder(Landroid/view/View;)Landroidx/customview/poolingcontainer/PoolingContainerListenerHolder; -HPLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V HPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Bundle; HPLandroidx/fragment/app/FragmentStateManager;->saveState()Landroid/os/Bundle; -HPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getChangePayload(II)Ljava/lang/Object; +HPLandroidx/lifecycle/MediatorLiveData;->onInactive()V +HPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areItemsTheSame(II)Z HPLandroidx/recyclerview/widget/BatchingListUpdateCallback;->onChanged(IILjava/lang/Object;)V +HPLandroidx/recyclerview/widget/DiffUtil;->backward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; +HPLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->buildAdapterChangeFlagsForAnimations(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I HPLandroidx/recyclerview/widget/RecyclerView;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;ZZ)V HPLandroidx/recyclerview/widget/RecyclerView;->viewRangeUpdate(IILjava/lang/Object;)V HPLandroidx/recyclerview/widget/ViewInfoStore;->addToPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V HPLandroidx/recyclerview/widget/ViewInfoStore;->popFromLayoutStep(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; HPLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V -HPLio/reactivex/rxjava3/subjects/BehaviorSubject;->onNext(Ljava/lang/Object;)V -HPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z -HPLkotlin/sequences/SequenceBuilderIterator;->yieldAll(Ljava/util/Iterator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HPLkotlin/sequences/SequenceScope;->yieldAll(Lkotlin/sequences/Sequence;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -HPLkotlin/sequences/SequencesKt__SequenceBuilderKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; -HPLorg/signal/core/util/concurrent/DeadlockDetector;->hasPotentialLock([Ljava/lang/StackTraceElement;)Z +HPLcom/google/android/material/animation/ArgbEvaluatorCompat;->evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer; +HPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->chooseFormattingPatternForNumber(Ljava/util/List;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; +HPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;Ljava/lang/Object;)V +HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onNext(Ljava/lang/Object;)V +HPLj$/util/Optional;->of(Ljava/lang/Object;)Lj$/util/Optional; +HPLkotlin/collections/ArraysKt___ArraysJvmKt;->asList([Ljava/lang/Object;)Ljava/util/List; +HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; +HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bind(ILjava/lang/Object;)V HPLorg/signal/libsignal/protocol/ecc/ECPublicKey;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->dispatchDraw(Landroid/graphics/Canvas;)V +HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showThumbnailView()V +HPLorg/thoughtcrime/securesms/components/CornerMask;->mask(Landroid/graphics/Canvas;)V +HPLorg/thoughtcrime/securesms/components/Outliner;->draw(Landroid/graphics/Canvas;IIII)V +HPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->isListCommitted()Z +HPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->prependIcon(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence; +HPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->updateOutlineVisibility()V +HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getOpenableGiftProjection(Z)Lorg/thoughtcrime/securesms/util/Projection; +HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getSnapshotProjections(Landroid/view/ViewGroup;ZZ)Lorg/thoughtcrime/securesms/util/ProjectionList; +HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->showProjectionArea()V +HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onDrawForeground(Landroid/graphics/Canvas;)V +HPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->getLatestTimestamp(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;Landroidx/recyclerview/widget/LinearLayoutManager;)Lj$/util/Optional; HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateChange(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animatePersistence(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z +HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateSlide(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z +HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)V +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getChatColorsData()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->get()Ljava/lang/Object; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Boolean; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke()Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->invoke(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->doAfterFirstRender()V +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHeader(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder$lambda$10(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState$lambda$15(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)Lio/reactivex/rxjava3/core/Single; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Lj$/util/Optional;)Lio/reactivex/rxjava3/core/MaybeSource; HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)Lio/reactivex/rxjava3/core/SingleSource; +HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getChatColorsSnapshot()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->draw(Landroid/graphics/Canvas;)V +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOutline(Landroid/graphics/Outline;)V +HPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->isSolidColor()Z +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->onMeasure(II)V +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$footerDrawable$1;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateBodyBubbleDrawable(Landroid/view/ViewGroup;)V +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateChatColorsDrawable(Landroid/view/ViewGroup;)V +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateFooterDrawable(Landroid/view/ViewGroup;)V +HPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPostMeasure()Z +HPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onUpdate(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)V HPLorg/thoughtcrime/securesms/database/EmojiSearchTable$setSearchIndex$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V HPLorg/thoughtcrime/securesms/database/model/IdentityRecord;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I +HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->getCurrentHolder(I)Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder; +HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->updateVideoDisplayPositionAndSize(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable;)V HPLorg/thoughtcrime/securesms/mms/Slide;->equals(Ljava/lang/Object;)Z -HPLorg/thoughtcrime/securesms/recipients/RecipientId;->equals(Ljava/lang/Object;)Z +HPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrintFormat(Ljava/lang/String;)Ljava/lang/String; HPLorg/thoughtcrime/securesms/util/BubbleUtil;->canBubble(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Long;)Z +HPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState$lambda$7$lambda$6(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V +HPLorg/thoughtcrime/securesms/util/ProjectionList;->close()V +HPLorg/thoughtcrime/securesms/util/ProjectionList;->getSize()I +HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->drawAsTopItemDecoration(Landroid/view/View;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;I)V HSPLandroid/support/v4/media/MediaBrowserCompat$MediaBrowserImplApi21$$ExternalSyntheticThrowCCEIfNotNull0;->m(Ljava/lang/Object;)V HSPLandroid/support/v4/media/session/IMediaSession$Stub;->()V HSPLandroid/support/v4/media/session/MediaControllerCompat$MediaControllerImplApi21;->(Landroid/content/Context;Landroid/support/v4/media/session/MediaSessionCompat$Token;)V @@ -110,12 +202,14 @@ HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;->(Landr HSPLandroidx/activity/ComponentActivity$$ExternalSyntheticLambda3;->onContextAvailable(Landroid/content/Context;)V HSPLandroidx/activity/ComponentActivity$1;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$2;->(Landroidx/activity/ComponentActivity;)V +HSPLandroidx/activity/ComponentActivity$2;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/activity/ComponentActivity$3;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$3;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/activity/ComponentActivity$4;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$4;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/activity/ComponentActivity$5;->(Landroidx/activity/ComponentActivity;)V -HSPLandroidx/activity/ComponentActivity$5;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +HSPLandroidx/activity/ComponentActivity$6;->(Landroidx/activity/ComponentActivity;)V +HSPLandroidx/activity/ComponentActivity$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/activity/ComponentActivity$Api19Impl;->cancelPendingInputEvents(Landroid/view/View;)V HSPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->(Landroidx/activity/ComponentActivity;)V HSPLandroidx/activity/ComponentActivity$ReportFullyDrawnExecutorApi16Impl;->activityDestroyed()V @@ -153,18 +247,31 @@ HSPLandroidx/activity/FullyDrawnReporter$$ExternalSyntheticLambda0;->(Land HSPLandroidx/activity/FullyDrawnReporter;->(Ljava/util/concurrent/Executor;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/activity/OnBackPressedCallback;->(Z)V HSPLandroidx/activity/OnBackPressedCallback;->addCancellable(Landroidx/activity/Cancellable;)V +HSPLandroidx/activity/OnBackPressedCallback;->getEnabledChangedCallback$activity_release()Lkotlin/jvm/functions/Function0; +HSPLandroidx/activity/OnBackPressedCallback;->isEnabled()Z HSPLandroidx/activity/OnBackPressedCallback;->remove()V HSPLandroidx/activity/OnBackPressedCallback;->removeCancellable(Landroidx/activity/Cancellable;)V HSPLandroidx/activity/OnBackPressedCallback;->setEnabled(Z)V +HSPLandroidx/activity/OnBackPressedCallback;->setEnabledChangedCallback$activity_release(Lkotlin/jvm/functions/Function0;)V HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/lifecycle/Lifecycle;Landroidx/activity/OnBackPressedCallback;)V HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->cancel()V HSPLandroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->(Landroidx/activity/OnBackPressedDispatcher;Landroidx/activity/OnBackPressedCallback;)V HSPLandroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable;->cancel()V +HSPLandroidx/activity/OnBackPressedDispatcher$addCallback$1;->(Ljava/lang/Object;)V +HSPLandroidx/activity/OnBackPressedDispatcher$addCallback$1;->invoke()Ljava/lang/Object; +HSPLandroidx/activity/OnBackPressedDispatcher$addCallback$1;->invoke()V +HSPLandroidx/activity/OnBackPressedDispatcher$addCancellableCallback$1;->(Ljava/lang/Object;)V +HSPLandroidx/activity/OnBackPressedDispatcher$addCancellableCallback$1;->invoke()Ljava/lang/Object; +HSPLandroidx/activity/OnBackPressedDispatcher$addCancellableCallback$1;->invoke()V HSPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;)V +HSPLandroidx/activity/OnBackPressedDispatcher;->(Ljava/lang/Runnable;Landroidx/core/util/Consumer;)V +HSPLandroidx/activity/OnBackPressedDispatcher;->access$getInProgressCallback$p(Landroidx/activity/OnBackPressedDispatcher;)Landroidx/activity/OnBackPressedCallback; HSPLandroidx/activity/OnBackPressedDispatcher;->access$getOnBackPressedCallbacks$p(Landroidx/activity/OnBackPressedDispatcher;)Lkotlin/collections/ArrayDeque; +HSPLandroidx/activity/OnBackPressedDispatcher;->access$updateEnabledCallbacks(Landroidx/activity/OnBackPressedDispatcher;)V HSPLandroidx/activity/OnBackPressedDispatcher;->addCallback(Landroidx/lifecycle/LifecycleOwner;Landroidx/activity/OnBackPressedCallback;)V HSPLandroidx/activity/OnBackPressedDispatcher;->addCancellableCallback$activity_release(Landroidx/activity/OnBackPressedCallback;)Landroidx/activity/Cancellable; +HSPLandroidx/activity/OnBackPressedDispatcher;->updateEnabledCallbacks()V HSPLandroidx/activity/ViewTreeOnBackPressedDispatcherOwner;->set(Landroid/view/View;Landroidx/activity/OnBackPressedDispatcherOwner;)V HSPLandroidx/activity/contextaware/ContextAwareHelper;->()V HSPLandroidx/activity/contextaware/ContextAwareHelper;->addOnContextAvailableListener(Landroidx/activity/contextaware/OnContextAvailableListener;)V @@ -372,25 +479,7 @@ HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onPreparePanel(ILandroid/vie HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V HSPLandroidx/appcompat/view/WindowCallbackWrapper;->onWindowFocusChanged(Z)V HSPLandroidx/appcompat/view/menu/ActionMenuItem;->(Landroid/content/Context;IIIILjava/lang/CharSequence;)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;->()V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->initialize(Landroidx/appcompat/view/menu/MenuItemImpl;I)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->onMeasure(II)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->prefersCondensedTitle()Z -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setIcon(Landroid/graphics/drawable/Drawable;)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setItemInvoker(Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker;)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setPopupCallback(Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->setTitle(Ljava/lang/CharSequence;)V -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z -HSPLandroidx/appcompat/view/menu/ActionMenuItemView;->updateTextButtonVisibility()V HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->(Landroid/content/Context;II)V -HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->addItemView(Landroid/view/View;I)V -HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->createItemView(Landroid/view/ViewGroup;)Landroidx/appcompat/view/menu/MenuView$ItemView; -HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z -HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->setCallback(Landroidx/appcompat/view/menu/MenuPresenter$Callback;)V HSPLandroidx/appcompat/view/menu/BaseMenuPresenter;->updateMenuView(Z)V @@ -404,20 +493,14 @@ HSPLandroidx/appcompat/view/menu/MenuBuilder;->createNewMenuItem(IIIILjava/lang/ HSPLandroidx/appcompat/view/menu/MenuBuilder;->dispatchPresenterUpdate(Z)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->findInsertIndex(Ljava/util/ArrayList;I)I HSPLandroidx/appcompat/view/menu/MenuBuilder;->findItem(I)Landroid/view/MenuItem; -HSPLandroidx/appcompat/view/menu/MenuBuilder;->findItemIndex(I)I HSPLandroidx/appcompat/view/menu/MenuBuilder;->flagActionItems()V HSPLandroidx/appcompat/view/menu/MenuBuilder;->getActionItems()Ljava/util/ArrayList; -HSPLandroidx/appcompat/view/menu/MenuBuilder;->getContext()Landroid/content/Context; -HSPLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuBuilder;->getNonActionItems()Ljava/util/ArrayList; HSPLandroidx/appcompat/view/menu/MenuBuilder;->getOrdering(I)I HSPLandroidx/appcompat/view/menu/MenuBuilder;->getVisibleItems()Ljava/util/ArrayList; HSPLandroidx/appcompat/view/menu/MenuBuilder;->hasVisibleItems()Z -HSPLandroidx/appcompat/view/menu/MenuBuilder;->onItemActionRequestChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->onItemVisibleChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->onItemsChanged(Z)V -HSPLandroidx/appcompat/view/menu/MenuBuilder;->removeItem(I)V -HSPLandroidx/appcompat/view/menu/MenuBuilder;->removeItemAtInt(IZ)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->setCallback(Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->setOverrideVisibleItems(Z)V HSPLandroidx/appcompat/view/menu/MenuBuilder;->setShortcutsVisibleInner(Z)V @@ -425,22 +508,11 @@ HSPLandroidx/appcompat/view/menu/MenuBuilder;->size()I HSPLandroidx/appcompat/view/menu/MenuBuilder;->startDispatchingItemsChanged()V HSPLandroidx/appcompat/view/menu/MenuBuilder;->stopDispatchingItemsChanged()V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->(Landroidx/appcompat/view/menu/MenuBuilder;IIIILjava/lang/CharSequence;I)V -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->applyIconTintIfNecessary(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getActionView()Landroid/view/View; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getIcon()Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getItemId()I HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getOrdering()I -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getSupportActionProvider()Landroidx/core/view/ActionProvider; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitle()Ljava/lang/CharSequence; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleCondensed()Ljava/lang/CharSequence; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTitleForItemView(Landroidx/appcompat/view/menu/MenuView$ItemView;)Ljava/lang/CharSequence; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->getTooltipText()Ljava/lang/CharSequence; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->hasSubMenu()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionButton()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isActionViewExpanded()Z -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isEnabled()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->isVisible()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->requestsActionButton()Z HSPLandroidx/appcompat/view/menu/MenuItemImpl;->requiresActionButton()Z @@ -451,25 +523,18 @@ HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setCheckedInt(Z)V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setContentDescription(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setEnabled(Z)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setIcon(I)Landroid/view/MenuItem; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setIconTintList(Landroid/content/res/ColorStateList;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setIsActionButton(Z)V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setNumericShortcut(CI)Landroid/view/MenuItem; -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setTitleCondensed(Ljava/lang/CharSequence;)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setTooltipText(Ljava/lang/CharSequence;)Landroidx/core/internal/view/SupportMenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisible(Z)Landroid/view/MenuItem; HSPLandroidx/appcompat/view/menu/MenuItemImpl;->setVisibleInt(Z)Z -HSPLandroidx/appcompat/view/menu/MenuItemImpl;->showsTextAsAction()Z -HSPLandroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton$1;->(Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;Landroid/view/View;Landroidx/appcompat/widget/ActionMenuPresenter;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->(Landroidx/appcompat/widget/ActionMenuPresenter;Landroid/content/Context;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton;->setFrame(IIII)Z HSPLandroidx/appcompat/widget/ActionMenuPresenter$PopupPresenterCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter;->(Landroid/content/Context;)V -HSPLandroidx/appcompat/widget/ActionMenuPresenter;->bindItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroidx/appcompat/view/menu/MenuView$ItemView;)V -HSPLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z HSPLandroidx/appcompat/widget/ActionMenuPresenter;->flagActionItems()Z -HSPLandroidx/appcompat/widget/ActionMenuPresenter;->getItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroid/view/View;Landroid/view/ViewGroup;)Landroid/view/View; HSPLandroidx/appcompat/widget/ActionMenuPresenter;->getOverflowIcon()Landroid/graphics/drawable/Drawable; HSPLandroidx/appcompat/widget/ActionMenuPresenter;->initForMenu(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;)V HSPLandroidx/appcompat/widget/ActionMenuPresenter;->setExpandedActionViewsExclusive(Z)V @@ -479,14 +544,11 @@ HSPLandroidx/appcompat/widget/ActionMenuPresenter;->shouldIncludeItem(ILandroidx HSPLandroidx/appcompat/widget/ActionMenuPresenter;->updateMenuView(Z)V HSPLandroidx/appcompat/widget/ActionMenuView$ActionMenuPresenterCallback;->()V HSPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(II)V -HSPLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/ActionMenuView$MenuBuilderCallback;->(Landroidx/appcompat/widget/ActionMenuView;)V HSPLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;)V HSPLandroidx/appcompat/widget/ActionMenuView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/ActionMenuView;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroidx/appcompat/widget/ActionMenuView;->generateDefaultLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; -HSPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; -HSPLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/ActionMenuView$LayoutParams; HSPLandroidx/appcompat/widget/ActionMenuView;->generateOverflowButtonLayoutParams()Landroidx/appcompat/widget/ActionMenuView$LayoutParams; HSPLandroidx/appcompat/widget/ActionMenuView;->getMenu()Landroid/view/Menu; HSPLandroidx/appcompat/widget/ActionMenuView;->getOverflowIcon()Landroid/graphics/drawable/Drawable; @@ -501,6 +563,7 @@ HSPLandroidx/appcompat/widget/ActionMenuView;->setOverflowReserved(Z)V HSPLandroidx/appcompat/widget/ActionMenuView;->setPopupTheme(I)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->(Landroid/view/View;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->applySupportBackgroundTint()V +HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->onSetBackgroundResource(I)V HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setInternalBackgroundTint(Landroid/content/res/ColorStateList;)V @@ -544,7 +607,6 @@ HSPLandroidx/appcompat/widget/AppCompatEditText;->drawableStateChanged()V HSPLandroidx/appcompat/widget/AppCompatEditText;->getText()Landroid/text/Editable; HSPLandroidx/appcompat/widget/AppCompatEditText;->getText()Ljava/lang/CharSequence; HSPLandroidx/appcompat/widget/AppCompatEditText;->initEmojiKeyListener(Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;)V -HSPLandroidx/appcompat/widget/AppCompatEditText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/appcompat/widget/AppCompatEditText;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatEditText;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatEditText;->setCustomSelectionActionModeCallback(Landroid/view/ActionMode$Callback;)V @@ -553,13 +615,11 @@ HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->(Landroid/wid HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->isEmojiCapableKeyListener(Landroid/text/method/KeyListener;)Z HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V -HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->setEnabled(Z)V HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->(Landroid/widget/TextView;)V HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->getFilters([Landroid/text/InputFilter;)[Landroid/text/InputFilter; HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatEmojiTextHelper;->setEnabled(Z)V -HSPLandroidx/appcompat/widget/AppCompatHintHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroid/view/View;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/appcompat/widget/AppCompatImageButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/appcompat/widget/AppCompatImageButton;->drawableStateChanged()V @@ -604,11 +664,9 @@ HSPLandroidx/appcompat/widget/AppCompatTextHelper$Api17Impl;->getCompoundDrawabl HSPLandroidx/appcompat/widget/AppCompatTextHelper$Api17Impl;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/widget/TextView;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->(Landroid/widget/TextView;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints()V -HSPLandroidx/appcompat/widget/AppCompatTextHelper;->createTintInfo(Landroid/content/Context;Landroidx/appcompat/widget/AppCompatDrawableManager;I)Landroidx/appcompat/widget/TintInfo; HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onLayout(ZIIII)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetCompoundDrawables()V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->onSetTextAppearance(Landroid/content/Context;I)V -HSPLandroidx/appcompat/widget/AppCompatTextHelper;->populateSurroundingTextIfNeeded(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLandroidx/appcompat/widget/AppCompatTextHelper;->updateTypefaceAndStyle(Landroid/content/Context;Landroidx/appcompat/widget/TintTypedArray;)V HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;)V @@ -671,6 +729,7 @@ HSPLandroidx/appcompat/widget/LinearLayoutCompat;->checkLayoutParams(Landroid/vi HSPLandroidx/appcompat/widget/LinearLayoutCompat;->drawDividersHorizontal(Landroid/graphics/Canvas;)V HSPLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; HSPLandroidx/appcompat/widget/LinearLayoutCompat;->generateLayoutParams(Landroid/util/AttributeSet;)Landroidx/appcompat/widget/LinearLayoutCompat$LayoutParams; +HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getBaseline()I HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getChildrenSkipCount(Landroid/view/View;I)I HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getLocationOffset(Landroid/view/View;)I HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getNextLocationOffset(Landroid/view/View;)I @@ -921,6 +980,40 @@ HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;->inflateInternal(ILan HSPLandroidx/asynclayoutinflater/view/AsyncLayoutInflater;->triggerCallbacks(Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateRequest;Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$InflateThread;)V HSPLandroidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl$OutputConfigurationParamsApi24$$ExternalSyntheticBackport1;->m(J)I HSPLandroidx/camera/view/PreviewView$1$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReference;Ljava/lang/Object;Ljava/lang/Object;)Z +HSPLandroidx/cardview/R$styleable;->()V +HSPLandroidx/cardview/widget/CardView$1;->(Landroidx/cardview/widget/CardView;)V +HSPLandroidx/cardview/widget/CardView$1;->getCardBackground()Landroid/graphics/drawable/Drawable; +HSPLandroidx/cardview/widget/CardView$1;->getCardView()Landroid/view/View; +HSPLandroidx/cardview/widget/CardView$1;->getPreventCornerOverlap()Z +HSPLandroidx/cardview/widget/CardView$1;->getUseCompatPadding()Z +HSPLandroidx/cardview/widget/CardView$1;->setCardBackground(Landroid/graphics/drawable/Drawable;)V +HSPLandroidx/cardview/widget/CardView$1;->setShadowPadding(IIII)V +HSPLandroidx/cardview/widget/CardView;->()V +HSPLandroidx/cardview/widget/CardView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLandroidx/cardview/widget/CardView;->access$001(Landroidx/cardview/widget/CardView;IIII)V +HSPLandroidx/cardview/widget/CardView;->getCardBackgroundColor()Landroid/content/res/ColorStateList; +HSPLandroidx/cardview/widget/CardView;->getCardElevation()F +HSPLandroidx/cardview/widget/CardView;->getContentPaddingBottom()I +HSPLandroidx/cardview/widget/CardView;->getContentPaddingLeft()I +HSPLandroidx/cardview/widget/CardView;->getContentPaddingRight()I +HSPLandroidx/cardview/widget/CardView;->getContentPaddingTop()I +HSPLandroidx/cardview/widget/CardView;->getPreventCornerOverlap()Z +HSPLandroidx/cardview/widget/CardView;->getUseCompatPadding()Z +HSPLandroidx/cardview/widget/CardView;->onMeasure(II)V +HSPLandroidx/cardview/widget/CardView;->setContentPadding(IIII)V +HSPLandroidx/cardview/widget/CardViewApi21Impl;->()V +HSPLandroidx/cardview/widget/CardViewApi21Impl;->getBackgroundColor(Landroidx/cardview/widget/CardViewDelegate;)Landroid/content/res/ColorStateList; +HSPLandroidx/cardview/widget/CardViewApi21Impl;->getCardBackground(Landroidx/cardview/widget/CardViewDelegate;)Landroidx/cardview/widget/RoundRectDrawable; +HSPLandroidx/cardview/widget/CardViewApi21Impl;->getElevation(Landroidx/cardview/widget/CardViewDelegate;)F +HSPLandroidx/cardview/widget/CardViewApi21Impl;->initStatic()V +HSPLandroidx/cardview/widget/CardViewApi21Impl;->initialize(Landroidx/cardview/widget/CardViewDelegate;Landroid/content/Context;Landroid/content/res/ColorStateList;FFF)V +HSPLandroidx/cardview/widget/CardViewApi21Impl;->setMaxElevation(Landroidx/cardview/widget/CardViewDelegate;F)V +HSPLandroidx/cardview/widget/CardViewApi21Impl;->updatePadding(Landroidx/cardview/widget/CardViewDelegate;)V +HSPLandroidx/cardview/widget/RoundRectDrawable;->(Landroid/content/res/ColorStateList;F)V +HSPLandroidx/cardview/widget/RoundRectDrawable;->getColor()Landroid/content/res/ColorStateList; +HSPLandroidx/cardview/widget/RoundRectDrawable;->setBackground(Landroid/content/res/ColorStateList;)V +HSPLandroidx/cardview/widget/RoundRectDrawable;->setPadding(FZZ)V +HSPLandroidx/cardview/widget/RoundRectDrawable;->updateBounds(Landroid/graphics/Rect;)V HSPLandroidx/collection/ArrayMap$EntrySet;->(Landroidx/collection/ArrayMap;)V HSPLandroidx/collection/ArrayMap$EntrySet;->iterator()Ljava/util/Iterator; HSPLandroidx/collection/ArrayMap$MapIterator;->(Landroidx/collection/ArrayMap;)V @@ -1006,10 +1099,8 @@ HSPLandroidx/collection/SimpleArrayMap;->valueAt(I)Ljava/lang/Object; HSPLandroidx/collection/SparseArrayCompat;->()V HSPLandroidx/collection/SparseArrayCompat;->()V HSPLandroidx/collection/SparseArrayCompat;->(I)V -HSPLandroidx/collection/SparseArrayCompat;->containsValue(Ljava/lang/Object;)Z HSPLandroidx/collection/SparseArrayCompat;->get(I)Ljava/lang/Object; HSPLandroidx/collection/SparseArrayCompat;->get(ILjava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/collection/SparseArrayCompat;->indexOfValue(Ljava/lang/Object;)I HSPLandroidx/collection/SparseArrayCompat;->keyAt(I)I HSPLandroidx/collection/SparseArrayCompat;->put(ILjava/lang/Object;)V HSPLandroidx/collection/SparseArrayCompat;->size()I @@ -1040,6 +1131,7 @@ HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getVariable(I)Landroid HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getVariableValue(I)F HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->invert()V HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->remove(Landroidx/constraintlayout/core/SolverVariable;Z)F +HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->use(Landroidx/constraintlayout/core/ArrayRow;Z)F HSPLandroidx/constraintlayout/core/ArrayRow;->(Landroidx/constraintlayout/core/Cache;)V HSPLandroidx/constraintlayout/core/ArrayRow;->addError(Landroidx/constraintlayout/core/LinearSystem;I)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/ArrayRow;->addSingleError(Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow; @@ -1057,15 +1149,15 @@ HSPLandroidx/constraintlayout/core/ArrayRow;->hasKeyVariable()Z HSPLandroidx/constraintlayout/core/ArrayRow;->hasVariable(Landroidx/constraintlayout/core/SolverVariable;)Z HSPLandroidx/constraintlayout/core/ArrayRow;->isEmpty()Z HSPLandroidx/constraintlayout/core/ArrayRow;->isNew(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/LinearSystem;)Z +HSPLandroidx/constraintlayout/core/ArrayRow;->pivot(Landroidx/constraintlayout/core/SolverVariable;)V HSPLandroidx/constraintlayout/core/ArrayRow;->reset()V HSPLandroidx/constraintlayout/core/ArrayRow;->updateFromFinalVariable(Landroidx/constraintlayout/core/LinearSystem;Landroidx/constraintlayout/core/SolverVariable;Z)V -HSPLandroidx/constraintlayout/core/ArrayRow;->updateFromRow(Landroidx/constraintlayout/core/LinearSystem;Landroidx/constraintlayout/core/ArrayRow;Z)V HSPLandroidx/constraintlayout/core/Cache;->()V HSPLandroidx/constraintlayout/core/LinearSystem;->()V HSPLandroidx/constraintlayout/core/LinearSystem;->()V HSPLandroidx/constraintlayout/core/LinearSystem;->acquireSolverVariable(Landroidx/constraintlayout/core/SolverVariable$Type;Ljava/lang/String;)Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/LinearSystem;->addCentering(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IFLandroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)V -HSPLandroidx/constraintlayout/core/LinearSystem;->addEquality(Landroidx/constraintlayout/core/SolverVariable;I)V +HSPLandroidx/constraintlayout/core/LinearSystem;->addConstraint(Landroidx/constraintlayout/core/ArrayRow;)V HSPLandroidx/constraintlayout/core/LinearSystem;->addEquality(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/LinearSystem;->addGreaterBarrier(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IZ)V HSPLandroidx/constraintlayout/core/LinearSystem;->addGreaterThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)V @@ -1075,6 +1167,7 @@ HSPLandroidx/constraintlayout/core/LinearSystem;->addRow(Landroidx/constraintlay HSPLandroidx/constraintlayout/core/LinearSystem;->addSingleError(Landroidx/constraintlayout/core/ArrayRow;II)V HSPLandroidx/constraintlayout/core/LinearSystem;->computeValues()V HSPLandroidx/constraintlayout/core/LinearSystem;->createObjectVariable(Ljava/lang/Object;)Landroidx/constraintlayout/core/SolverVariable; +HSPLandroidx/constraintlayout/core/LinearSystem;->createRow()Landroidx/constraintlayout/core/ArrayRow; HSPLandroidx/constraintlayout/core/LinearSystem;->createSlackVariable()Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/LinearSystem;->enforceBFS(Landroidx/constraintlayout/core/LinearSystem$Row;)I HSPLandroidx/constraintlayout/core/LinearSystem;->getCache()Landroidx/constraintlayout/core/Cache; @@ -1101,6 +1194,7 @@ HSPLandroidx/constraintlayout/core/PriorityGoalRow;->access$000(Landroidx/constr HSPLandroidx/constraintlayout/core/PriorityGoalRow;->addError(Landroidx/constraintlayout/core/SolverVariable;)V HSPLandroidx/constraintlayout/core/PriorityGoalRow;->addToGoal(Landroidx/constraintlayout/core/SolverVariable;)V HSPLandroidx/constraintlayout/core/PriorityGoalRow;->clear()V +HSPLandroidx/constraintlayout/core/PriorityGoalRow;->getPivotCandidate(Landroidx/constraintlayout/core/LinearSystem;[Z)Landroidx/constraintlayout/core/SolverVariable; HSPLandroidx/constraintlayout/core/PriorityGoalRow;->isEmpty()Z HSPLandroidx/constraintlayout/core/PriorityGoalRow;->removeGoal(Landroidx/constraintlayout/core/SolverVariable;)V HSPLandroidx/constraintlayout/core/PriorityGoalRow;->updateFromRow(Landroidx/constraintlayout/core/LinearSystem;Landroidx/constraintlayout/core/ArrayRow;Z)V @@ -1258,6 +1352,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->invalidat HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isHeightMeasuredTooSmall()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isRtl()Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->isWidthMeasuredTooSmall()Z +HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->layout()V HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->measure(IIIIIIIII)J HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->measure(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;I)Z HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->optimizeFor(I)Z @@ -1297,6 +1392,7 @@ HSPLandroidx/constraintlayout/core/widgets/WidgetContainer;->resetSolverVariable HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;)V +HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->measure(Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)Z HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->measureChildren(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->solveLinearSystem(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;Ljava/lang/String;III)V HSPLandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure;->solverMeasure(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;IIIIIIIII)J @@ -1307,12 +1403,14 @@ HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->invalidate HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->setMeasurer(Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->()V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->canMeasure(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;)Z +HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->horizontalSolvingPass(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Z)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveBarrier(ILandroidx/constraintlayout/core/widgets/Barrier;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;IZ)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveHorizontalCenterConstraints(ILandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;Z)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveHorizontalMatchConstraint(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;Z)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveVerticalCenterConstraints(ILandroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solveVerticalMatchConstraint(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->solvingPass(Landroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V +HSPLandroidx/constraintlayout/core/widgets/analyzer/Direct;->verticalSolvingPass(ILandroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measurer;)V HSPLandroidx/constraintlayout/widget/Barrier;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/constraintlayout/widget/Barrier;->init(Landroid/util/AttributeSet;)V HSPLandroidx/constraintlayout/widget/Barrier;->resolveRtl(Landroidx/constraintlayout/core/widgets/ConstraintWidget;Z)V @@ -1341,7 +1439,6 @@ HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->(Landroid HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->captureLayoutInfo(IIIIII)V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->didMeasures()V HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->isSimilarSpec(III)Z -HSPLandroidx/constraintlayout/widget/ConstraintLayout$Measurer;->measure(Landroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/analyzer/BasicMeasure$Measure;)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->()V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/constraintlayout/widget/ConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -1489,9 +1586,7 @@ HSPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantMatrix(La HSPLandroidx/coordinatorlayout/widget/ViewGroupUtils;->offsetDescendantRect(Landroid/view/ViewGroup;Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroidx/core/R$styleable;->()V HSPLandroidx/core/app/ActivityCompat$Api21Impl;->postponeEnterTransition(Landroid/app/Activity;)V -HSPLandroidx/core/app/ActivityCompat$Api21Impl;->startPostponedEnterTransition(Landroid/app/Activity;)V HSPLandroidx/core/app/ActivityCompat;->postponeEnterTransition(Landroid/app/Activity;)V -HSPLandroidx/core/app/ActivityCompat;->startPostponedEnterTransition(Landroid/app/Activity;)V HSPLandroidx/core/app/AppOpsManagerCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/core/app/AppOpsManagerCompat$Api23Impl;->permissionToOp(Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/core/app/AppOpsManagerCompat;->permissionToOp(Ljava/lang/String;)Ljava/lang/String; @@ -1601,22 +1696,12 @@ HSPLandroidx/core/graphics/drawable/DrawableCompat;->unwrap(Landroid/graphics/dr HSPLandroidx/core/graphics/drawable/DrawableCompat;->wrap(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; HSPLandroidx/core/math/MathUtils;->clamp(FFF)F HSPLandroidx/core/math/MathUtils;->clamp(III)I -HSPLandroidx/core/os/BuildCompat$Api30Impl$$ExternalSyntheticApiModelOutline0;->m(I)I -HSPLandroidx/core/os/BuildCompat$Api30Impl;->()V -HSPLandroidx/core/os/BuildCompat$Api30Impl;->()V -HSPLandroidx/core/os/BuildCompat$Api30Impl;->getExtensionVersion(I)I -HSPLandroidx/core/os/BuildCompat;->()V -HSPLandroidx/core/os/BuildCompat;->()V -HSPLandroidx/core/os/BuildCompat;->isAtLeastT()Z HSPLandroidx/core/os/CancellationSignal;->()V HSPLandroidx/core/os/CancellationSignal;->setOnCancelListener(Landroidx/core/os/CancellationSignal$OnCancelListener;)V HSPLandroidx/core/os/CancellationSignal;->waitForCancelFinishedLocked()V HSPLandroidx/core/os/ConfigurationCompat$Api24Impl$$ExternalSyntheticApiModelOutline0;->m(Ljava/lang/Object;)Landroid/os/LocaleList; HSPLandroidx/core/os/ConfigurationCompat$Api24Impl;->getLocales(Landroid/content/res/Configuration;)Landroid/os/LocaleList; HSPLandroidx/core/os/ConfigurationCompat;->getLocales(Landroid/content/res/Configuration;)Landroidx/core/os/LocaleListCompat; -HSPLandroidx/core/os/HandlerCompat$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z -HSPLandroidx/core/os/HandlerCompat$Api28Impl;->postDelayed(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z -HSPLandroidx/core/os/HandlerCompat;->postDelayed(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z HSPLandroidx/core/os/LocaleListCompat$Api21Impl;->()V HSPLandroidx/core/os/LocaleListCompat$Api21Impl;->forLanguageTag(Ljava/lang/String;)Ljava/util/Locale; HSPLandroidx/core/os/LocaleListCompat$Api24Impl;->createLocaleList([Ljava/util/Locale;)Landroid/os/LocaleList; @@ -1706,7 +1791,6 @@ HSPLandroidx/core/view/MenuHostHelper;->onPrepareMenu(Landroid/view/Menu;)V HSPLandroidx/core/view/MenuHostHelper;->removeMenuProvider(Landroidx/core/view/MenuProvider;)V HSPLandroidx/core/view/MenuItemCompat;->setAlphabeticShortcut(Landroid/view/MenuItem;CI)V HSPLandroidx/core/view/MenuItemCompat;->setContentDescription(Landroid/view/MenuItem;Ljava/lang/CharSequence;)V -HSPLandroidx/core/view/MenuItemCompat;->setIconTintList(Landroid/view/MenuItem;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/view/MenuItemCompat;->setNumericShortcut(Landroid/view/MenuItem;CI)V HSPLandroidx/core/view/MenuItemCompat;->setTooltipText(Landroid/view/MenuItem;Ljava/lang/CharSequence;)V HSPLandroidx/core/view/NestedScrollingChildHelper;->(Landroid/view/View;)V @@ -1716,7 +1800,6 @@ HSPLandroidx/core/view/NestedScrollingChildHelper;->isNestedScrollingEnabled()Z HSPLandroidx/core/view/NestedScrollingChildHelper;->setNestedScrollingEnabled(Z)V HSPLandroidx/core/view/NestedScrollingChildHelper;->setNestedScrollingParentForType(ILandroid/view/ViewParent;)V HSPLandroidx/core/view/NestedScrollingChildHelper;->startNestedScroll(II)Z -HSPLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll()V HSPLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll(I)V HSPLandroidx/core/view/NestedScrollingParentHelper;->(Landroid/view/ViewGroup;)V HSPLandroidx/core/view/NestedScrollingParentHelper;->onNestedScrollAccepted(Landroid/view/View;Landroid/view/View;II)V @@ -1846,15 +1929,16 @@ HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiMo HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/ViewConfiguration;)F HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;)F HSPLandroidx/core/view/ViewConfigurationCompat$Api26Impl;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;)F +HSPLandroidx/core/view/ViewConfigurationCompat$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/ViewConfiguration;)Z +HSPLandroidx/core/view/ViewConfigurationCompat$Api28Impl;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;)Z HSPLandroidx/core/view/ViewConfigurationCompat;->()V HSPLandroidx/core/view/ViewConfigurationCompat;->getScaledHorizontalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F HSPLandroidx/core/view/ViewConfigurationCompat;->getScaledVerticalScrollFactor(Landroid/view/ViewConfiguration;Landroid/content/Context;)F +HSPLandroidx/core/view/ViewConfigurationCompat;->shouldShowMenuShortcutsWhenKeyboardPresent(Landroid/view/ViewConfiguration;Landroid/content/Context;)Z HSPLandroidx/core/view/ViewGroupKt$children$1;->(Landroid/view/ViewGroup;)V HSPLandroidx/core/view/ViewGroupKt$children$1;->iterator()Ljava/util/Iterator; HSPLandroidx/core/view/ViewGroupKt$iterator$1;->(Landroid/view/ViewGroup;)V HSPLandroidx/core/view/ViewGroupKt$iterator$1;->hasNext()Z -HSPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Landroid/view/View; -HSPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Ljava/lang/Object; HSPLandroidx/core/view/ViewGroupKt;->getChildren(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; HSPLandroidx/core/view/ViewGroupKt;->iterator(Landroid/view/ViewGroup;)Ljava/util/Iterator; HSPLandroidx/core/view/ViewKt$doOnPreDraw$1;->(Lkotlin/jvm/functions/Function1;Landroid/view/View;)V @@ -1971,11 +2055,6 @@ HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->unwrap()Landr HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat;->wrap(Landroid/view/accessibility/AccessibilityNodeInfo;)Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat; HSPLandroidx/core/view/animation/PathInterpolatorCompat$Api21Impl;->createPathInterpolator(FFFF)Landroid/view/animation/Interpolator; HSPLandroidx/core/view/animation/PathInterpolatorCompat;->create(FFFF)Landroid/view/animation/Interpolator; -HSPLandroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V -HSPLandroidx/core/view/inputmethod/EditorInfoCompat;->()V -HSPLandroidx/core/view/inputmethod/EditorInfoCompat;->setContentMimeTypes(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V -HSPLandroidx/core/view/inputmethod/InputConnectionCompat$1;->(Landroid/view/inputmethod/InputConnection;ZLandroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)V -HSPLandroidx/core/view/inputmethod/InputConnectionCompat;->createWrapper(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/core/widget/ImageViewCompat$Api21Impl;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/widget/ImageViewCompat;->setImageTintList(Landroid/widget/ImageView;Landroid/content/res/ColorStateList;)V HSPLandroidx/core/widget/TextViewCompat$Api16Impl;->getMaxLines(Landroid/widget/TextView;)I @@ -1991,7 +2070,6 @@ HSPLandroidx/core/widget/TextViewCompat;->setLineHeight(Landroid/widget/TextView HSPLandroidx/core/widget/TextViewCompat;->wrapCustomSelectionActionModeCallback(Landroid/widget/TextView;Landroid/view/ActionMode$Callback;)Landroid/view/ActionMode$Callback; HSPLandroidx/core/widget/TextViewOnReceiveContentListener;->()V HSPLandroidx/customview/poolingcontainer/PoolingContainer;->()V -HSPLandroidx/customview/poolingcontainer/PoolingContainer;->callPoolingContainerOnReleaseForChildren(Landroid/view/ViewGroup;)V HSPLandroidx/customview/poolingcontainer/PoolingContainer;->setPoolingContainer(Landroid/view/View;Z)V HSPLandroidx/customview/widget/ExploreByTouchHelper$1;->()V HSPLandroidx/customview/widget/ExploreByTouchHelper$2;->()V @@ -2038,7 +2116,6 @@ HSPLandroidx/emoji2/text/EmojiCompat;->isInitialized()Z HSPLandroidx/emoji2/text/EmojiCompat;->load()V HSPLandroidx/emoji2/text/EmojiCompat;->loadMetadata()V HSPLandroidx/emoji2/text/EmojiCompat;->onMetadataLoadFailed(Ljava/lang/Throwable;)V -HSPLandroidx/emoji2/text/EmojiCompat;->updateEditorInfo(Landroid/view/inputmethod/EditorInfo;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->(Landroidx/emoji2/text/EmojiCompatInitializer;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/emoji2/text/EmojiCompatInitializer$1;->onResume(Landroidx/lifecycle/LifecycleOwner;)V @@ -2074,21 +2151,15 @@ HSPLandroidx/emoji2/text/SpannableBuilder;->removeSpan(Ljava/lang/Object;)V HSPLandroidx/emoji2/text/SpannableBuilder;->setSpan(Ljava/lang/Object;III)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->(Landroid/widget/EditText;Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; -HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->setEnabled(Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal;->()V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->(Landroid/widget/EditText;Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->getKeyListener(Landroid/text/method/KeyListener;)Landroid/text/method/KeyListener; -HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->setEnabled(Z)V HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->()V HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->()V HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->getInstance()Landroid/text/Editable$Factory; HSPLandroidx/emoji2/viewsintegration/EmojiEditableFactory;->newEditable(Ljava/lang/CharSequence;)Landroid/text/Editable; -HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->()V -HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->updateEditorInfoAttrs(Landroid/view/inputmethod/EditorInfo;)V -HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V -HSPLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;)V HSPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->(Landroid/widget/TextView;)V HSPLandroidx/emoji2/viewsintegration/EmojiInputFilter;->filter(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Ljava/lang/CharSequence; HSPLandroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper;->()V @@ -2201,6 +2272,7 @@ HSPLandroidx/fragment/app/Fragment;->onAttachFragment(Landroidx/fragment/app/Fra HSPLandroidx/fragment/app/Fragment;->onCreate(Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; HSPLandroidx/fragment/app/Fragment;->onGetLayoutInflater(Landroid/os/Bundle;)Landroid/view/LayoutInflater; +HSPLandroidx/fragment/app/Fragment;->onInflate(Landroid/app/Activity;Landroid/util/AttributeSet;Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;Landroid/os/Bundle;)V HSPLandroidx/fragment/app/Fragment;->onPause()V HSPLandroidx/fragment/app/Fragment;->onPrimaryNavigationFragmentChanged(Z)V @@ -2286,7 +2358,6 @@ HSPLandroidx/fragment/app/FragmentActivity;->onStart()V HSPLandroidx/fragment/app/FragmentActivity;->onStateNotSaved()V HSPLandroidx/fragment/app/FragmentActivity;->onStop()V HSPLandroidx/fragment/app/FragmentActivity;->supportPostponeEnterTransition()V -HSPLandroidx/fragment/app/FragmentActivity;->supportStartPostponedEnterTransition()V HSPLandroidx/fragment/app/FragmentContainer;->()V HSPLandroidx/fragment/app/FragmentContainer;->instantiate(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/fragment/app/Fragment; HSPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;)V @@ -2347,17 +2418,13 @@ HSPLandroidx/fragment/app/FragmentManager$3;->instantiate(Ljava/lang/ClassLoader HSPLandroidx/fragment/app/FragmentManager$4;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$4;->createController(Landroid/view/ViewGroup;)Landroidx/fragment/app/SpecialEffectsController; HSPLandroidx/fragment/app/FragmentManager$5;->(Landroidx/fragment/app/FragmentManager;)V -HSPLandroidx/fragment/app/FragmentManager$6;->(Landroidx/fragment/app/FragmentManager;Ljava/lang/String;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/Lifecycle;)V -HSPLandroidx/fragment/app/FragmentManager$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/fragment/app/FragmentManager$7;->(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager$7;->onAttachFragment(Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager$8;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$9;->(Landroidx/fragment/app/FragmentManager;)V HSPLandroidx/fragment/app/FragmentManager$FragmentIntentSenderContract;->()V -HSPLandroidx/fragment/app/FragmentManager$LifecycleAwareResultListener;->(Landroidx/lifecycle/Lifecycle;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/LifecycleEventObserver;)V HSPLandroidx/fragment/app/FragmentManager;->()V HSPLandroidx/fragment/app/FragmentManager;->()V -HSPLandroidx/fragment/app/FragmentManager;->access$000(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; HSPLandroidx/fragment/app/FragmentManager;->addFragment(Landroidx/fragment/app/Fragment;)Landroidx/fragment/app/FragmentStateManager; HSPLandroidx/fragment/app/FragmentManager;->addFragmentOnAttachListener(Landroidx/fragment/app/FragmentOnAttachListener;)V HSPLandroidx/fragment/app/FragmentManager;->addOnBackStackChangedListener(Landroidx/fragment/app/FragmentManager$OnBackStackChangedListener;)V @@ -2426,7 +2493,6 @@ HSPLandroidx/fragment/app/FragmentManager;->performPendingDeferredStart(Landroid HSPLandroidx/fragment/app/FragmentManager;->removeRedundantOperationsAndExecute(Ljava/util/ArrayList;Ljava/util/ArrayList;)V HSPLandroidx/fragment/app/FragmentManager;->scheduleCommit()V HSPLandroidx/fragment/app/FragmentManager;->setExitAnimationOrder(Landroidx/fragment/app/Fragment;Z)V -HSPLandroidx/fragment/app/FragmentManager;->setFragmentResultListener(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/fragment/app/FragmentResultListener;)V HSPLandroidx/fragment/app/FragmentManager;->setPrimaryNavigationFragment(Landroidx/fragment/app/Fragment;)V HSPLandroidx/fragment/app/FragmentManager;->startPendingDeferredFragments()V HSPLandroidx/fragment/app/FragmentManager;->updateOnBackPressedCallbackEnabled()V @@ -2449,6 +2515,7 @@ HSPLandroidx/fragment/app/FragmentStateManager;->(Landroidx/fragment/app/F HSPLandroidx/fragment/app/FragmentStateManager;->activityCreated()V HSPLandroidx/fragment/app/FragmentStateManager;->addViewToContainer()V HSPLandroidx/fragment/app/FragmentStateManager;->attach()V +HSPLandroidx/fragment/app/FragmentStateManager;->computeExpectedState()I HSPLandroidx/fragment/app/FragmentStateManager;->create()V HSPLandroidx/fragment/app/FragmentStateManager;->createView()V HSPLandroidx/fragment/app/FragmentStateManager;->ensureInflatedView()V @@ -2567,9 +2634,6 @@ HSPLandroidx/interpolator/view/animation/LookupTableInterpolator;->getInterpolat HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory$Companion;->()V HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->()V -HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V -HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; -HSPLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/AndroidViewModel;->(Landroid/app/Application;)V HSPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->(Ljava/util/Map;)V HSPLandroidx/lifecycle/ClassesInfoCache$CallbackInfo;->invokeCallbacks(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;Ljava/lang/Object;)V @@ -2588,7 +2652,6 @@ HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onCreate(Landroid HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onPause(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onResume(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onStart(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V -HSPLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onStop(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings;->()V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleEventObserver;)V HSPLandroidx/lifecycle/DefaultLifecycleObserverAdapter;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V @@ -2602,8 +2665,6 @@ HSPLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivityStopped(Landr HSPLandroidx/lifecycle/LegacySavedStateHandleController;->()V HSPLandroidx/lifecycle/LegacySavedStateHandleController;->()V HSPLandroidx/lifecycle/LegacySavedStateHandleController;->attachHandleIfNeeded(Landroidx/lifecycle/ViewModel;Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V -HSPLandroidx/lifecycle/LegacySavedStateHandleController;->create(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandleController; -HSPLandroidx/lifecycle/LegacySavedStateHandleController;->tryToAddRecreator(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/lifecycle/Lifecycle$Event$Companion$WhenMappings;->()V HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->()V HSPLandroidx/lifecycle/Lifecycle$Event$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -2639,6 +2700,7 @@ HSPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/Lifec HSPLandroidx/lifecycle/LifecycleRegistry;->backwardPass(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/LifecycleRegistry;->calculateTargetState(Landroidx/lifecycle/LifecycleObserver;)Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/LifecycleRegistry;->enforceMainThreadIfNeeded(Ljava/lang/String;)V +HSPLandroidx/lifecycle/LifecycleRegistry;->forwardPass(Landroidx/lifecycle/LifecycleOwner;)V HSPLandroidx/lifecycle/LifecycleRegistry;->getCurrentState()Landroidx/lifecycle/Lifecycle$State; HSPLandroidx/lifecycle/LifecycleRegistry;->handleLifecycleEvent(Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/LifecycleRegistry;->isSynced()Z @@ -2675,6 +2737,7 @@ HSPLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ HSPLandroidx/lifecycle/LiveData;->getValue()Ljava/lang/Object; HSPLandroidx/lifecycle/LiveData;->getVersion()I HSPLandroidx/lifecycle/LiveData;->hasActiveObservers()Z +HSPLandroidx/lifecycle/LiveData;->isInitialized()Z HSPLandroidx/lifecycle/LiveData;->observe(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Observer;)V HSPLandroidx/lifecycle/LiveData;->observeForever(Landroidx/lifecycle/Observer;)V HSPLandroidx/lifecycle/LiveData;->onActive()V @@ -2763,27 +2826,13 @@ HSPLandroidx/lifecycle/ReportFragment;->onPause()V HSPLandroidx/lifecycle/ReportFragment;->onResume()V HSPLandroidx/lifecycle/ReportFragment;->onStart()V HSPLandroidx/lifecycle/ReportFragment;->onStop()V -HSPLandroidx/lifecycle/SavedStateHandle$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/SavedStateHandle;)V -HSPLandroidx/lifecycle/SavedStateHandle$Companion;->()V -HSPLandroidx/lifecycle/SavedStateHandle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLandroidx/lifecycle/SavedStateHandle$Companion;->createHandle(Landroid/os/Bundle;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; -HSPLandroidx/lifecycle/SavedStateHandle;->()V -HSPLandroidx/lifecycle/SavedStateHandle;->()V -HSPLandroidx/lifecycle/SavedStateHandle;->get(Ljava/lang/String;)Ljava/lang/Object; -HSPLandroidx/lifecycle/SavedStateHandle;->savedStateProvider()Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; HSPLandroidx/lifecycle/SavedStateHandleAttacher;->(Landroidx/lifecycle/SavedStateHandlesProvider;)V HSPLandroidx/lifecycle/SavedStateHandleAttacher;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V -HSPLandroidx/lifecycle/SavedStateHandleController;->(Ljava/lang/String;Landroidx/lifecycle/SavedStateHandle;)V -HSPLandroidx/lifecycle/SavedStateHandleController;->attachToLifecycle(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V -HSPLandroidx/lifecycle/SavedStateHandleController;->getHandle()Landroidx/lifecycle/SavedStateHandle; -HSPLandroidx/lifecycle/SavedStateHandleController;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport$SAVED_STATE_REGISTRY_OWNER_KEY$1;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport$VIEW_MODEL_STORE_OWNER_KEY$1;->()V -HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->()V -HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->()V -HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/SavedStateHandlesVM; -HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1;->()V +HSPLandroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/SavedStateHandleSupport;->()V HSPLandroidx/lifecycle/SavedStateHandleSupport;->enableSavedStateHandles(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/lifecycle/SavedStateHandleSupport;->getSavedStateHandlesVM(Landroidx/lifecycle/ViewModelStoreOwner;)Landroidx/lifecycle/SavedStateHandlesVM; @@ -2806,18 +2855,18 @@ HSPLandroidx/lifecycle/Transformations$map$1;->invoke(Ljava/lang/Object;)Ljava/l HSPLandroidx/lifecycle/Transformations$map$1;->invoke(Ljava/lang/Object;)V HSPLandroidx/lifecycle/Transformations$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/lifecycle/Transformations$sam$androidx_lifecycle_Observer$0;->onChanged(Ljava/lang/Object;)V -HSPLandroidx/lifecycle/Transformations$switchMap$1$onChanged$1;->(Landroidx/lifecycle/MediatorLiveData;)V -HSPLandroidx/lifecycle/Transformations$switchMap$1$onChanged$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroidx/lifecycle/Transformations$switchMap$1$onChanged$1;->invoke(Ljava/lang/Object;)V -HSPLandroidx/lifecycle/Transformations$switchMap$1;->(Lkotlin/jvm/functions/Function1;Landroidx/lifecycle/MediatorLiveData;)V -HSPLandroidx/lifecycle/Transformations$switchMap$1;->onChanged(Ljava/lang/Object;)V +HSPLandroidx/lifecycle/Transformations$switchMap$1$1;->(Landroidx/lifecycle/MediatorLiveData;)V +HSPLandroidx/lifecycle/Transformations$switchMap$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/lifecycle/Transformations$switchMap$1$1;->invoke(Ljava/lang/Object;)V +HSPLandroidx/lifecycle/Transformations$switchMap$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/internal/Ref$ObjectRef;Landroidx/lifecycle/MediatorLiveData;)V +HSPLandroidx/lifecycle/Transformations$switchMap$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/lifecycle/Transformations$switchMap$1;->invoke(Ljava/lang/Object;)V HSPLandroidx/lifecycle/Transformations;->map(Landroidx/lifecycle/LiveData;Lkotlin/jvm/functions/Function1;)Landroidx/lifecycle/LiveData; HSPLandroidx/lifecycle/Transformations;->switchMap(Landroidx/lifecycle/LiveData;Lkotlin/jvm/functions/Function1;)Landroidx/lifecycle/LiveData; HSPLandroidx/lifecycle/ViewModel;->()V HSPLandroidx/lifecycle/ViewModel;->clear()V HSPLandroidx/lifecycle/ViewModel;->getTag(Ljava/lang/String;)Ljava/lang/Object; HSPLandroidx/lifecycle/ViewModel;->onCleared()V -HSPLandroidx/lifecycle/ViewModel;->setTagIfAbsent(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/lifecycle/ViewModelLazy;->(Lkotlin/reflect/KClass;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Landroidx/lifecycle/ViewModel; HSPLandroidx/lifecycle/ViewModelLazy;->getValue()Ljava/lang/Object; @@ -3261,7 +3310,6 @@ HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->(Ljava/lang/O HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->equals(Ljava/lang/Object;)Z HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->invoke(ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->iterationFinished(Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V -HSPLandroidx/media3/common/util/ListenerSet$ListenerHolder;->release(Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V HSPLandroidx/media3/common/util/ListenerSet;->$r8$lambda$AlaP-gu7Lfe4GahLPmVnd_l2pLA(Ljava/util/concurrent/CopyOnWriteArraySet;ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet;->$r8$lambda$bio3pd12v5B_9b5UeFaPn9XBQ90(Landroidx/media3/common/util/ListenerSet;Landroid/os/Message;)Z HSPLandroidx/media3/common/util/ListenerSet;->(Landroid/os/Looper;Landroidx/media3/common/util/Clock;Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V @@ -3273,7 +3321,6 @@ HSPLandroidx/media3/common/util/ListenerSet;->flushEvents()V HSPLandroidx/media3/common/util/ListenerSet;->handleMessage(Landroid/os/Message;)Z HSPLandroidx/media3/common/util/ListenerSet;->lambda$queueEvent$0(Ljava/util/concurrent/CopyOnWriteArraySet;ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet;->queueEvent(ILandroidx/media3/common/util/ListenerSet$Event;)V -HSPLandroidx/media3/common/util/ListenerSet;->release()V HSPLandroidx/media3/common/util/ListenerSet;->sendEvent(ILandroidx/media3/common/util/ListenerSet$Event;)V HSPLandroidx/media3/common/util/ListenerSet;->verifyCurrentThread()V HSPLandroidx/media3/common/util/Log$Logger$1;->()V @@ -3332,8 +3379,6 @@ HSPLandroidx/media3/common/util/Util$$ExternalSyntheticApiModelOutline4;->m(Land HSPLandroidx/media3/common/util/Util;->()V HSPLandroidx/media3/common/util/Util;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroidx/media3/common/util/Util;->createHandler(Landroid/os/Looper;Landroid/os/Handler$Callback;)Landroid/os/Handler; -HSPLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper()Landroid/os/Handler; -HSPLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper(Landroid/os/Handler$Callback;)Landroid/os/Handler; HSPLandroidx/media3/common/util/Util;->generateAudioSessionIdV21(Landroid/content/Context;)I HSPLandroidx/media3/common/util/Util;->getCountryCode(Landroid/content/Context;)Ljava/lang/String; HSPLandroidx/media3/common/util/Util;->getCurrentDisplayModeSize(Landroid/content/Context;)Landroid/graphics/Point; @@ -3375,11 +3420,6 @@ HSPLandroidx/media3/decoder/DecoderInputBuffer;->newNoDataInstance()Landroidx/me HSPLandroidx/media3/exoplayer/AudioBecomingNoisyManager$AudioBecomingNoisyReceiver;->(Landroidx/media3/exoplayer/AudioBecomingNoisyManager;Landroid/os/Handler;Landroidx/media3/exoplayer/AudioBecomingNoisyManager$EventListener;)V HSPLandroidx/media3/exoplayer/AudioBecomingNoisyManager;->(Landroid/content/Context;Landroid/os/Handler;Landroidx/media3/exoplayer/AudioBecomingNoisyManager$EventListener;)V HSPLandroidx/media3/exoplayer/AudioBecomingNoisyManager;->setEnabled(Z)V -HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline1;->m(I)Landroid/media/AudioFocusRequest$Builder; -HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline2;->m()V -HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline3;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder; -HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline5;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder; -HSPLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline6;->m(Landroid/media/AudioFocusRequest$Builder;)Landroid/media/AudioFocusRequest; HSPLandroidx/media3/exoplayer/AudioFocusManager$AudioFocusListener;->(Landroidx/media3/exoplayer/AudioFocusManager;Landroid/os/Handler;)V HSPLandroidx/media3/exoplayer/AudioFocusManager;->(Landroid/content/Context;Landroid/os/Handler;Landroidx/media3/exoplayer/AudioFocusManager$PlayerControl;)V HSPLandroidx/media3/exoplayer/AudioFocusManager;->abandonAudioFocusIfHeld()V @@ -3914,10 +3954,7 @@ HSPLandroidx/media3/session/CommandButton;->fromBundle(Landroid/os/Bundle;)Landr HSPLandroidx/media3/session/CommandButton;->getEnabledCommandButtons(Ljava/util/List;Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)Lcom/google/common/collect/ImmutableList; HSPLandroidx/media3/session/CommandButton;->isEnabled(Landroidx/media3/session/CommandButton;Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)Z HSPLandroidx/media3/session/CommandButton;->toBundle()Landroid/os/Bundle; -HSPLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V -HSPLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->run()V HSPLandroidx/media3/session/ConnectedControllersManager$ConnectedControllerRecord;->(Ljava/lang/Object;Landroidx/media3/session/SequencedFutureManager;Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)V -HSPLandroidx/media3/session/ConnectedControllersManager;->$r8$lambda$Vom81RksdvuIVXyQfAu6pd1M7BY(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/ConnectedControllersManager;->(Landroidx/media3/session/MediaSessionImpl;)V HSPLandroidx/media3/session/ConnectedControllersManager;->addController(Ljava/lang/Object;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommands;Landroidx/media3/common/Player$Commands;)V HSPLandroidx/media3/session/ConnectedControllersManager;->getAvailablePlayerCommands(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/common/Player$Commands; @@ -3927,9 +3964,6 @@ HSPLandroidx/media3/session/ConnectedControllersManager;->getSequencedFutureMana HSPLandroidx/media3/session/ConnectedControllersManager;->getSequencedFutureManager(Ljava/lang/Object;)Landroidx/media3/session/SequencedFutureManager; HSPLandroidx/media3/session/ConnectedControllersManager;->isConnected(Landroidx/media3/session/MediaSession$ControllerInfo;)Z HSPLandroidx/media3/session/ConnectedControllersManager;->isSessionCommandAvailable(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;)Z -HSPLandroidx/media3/session/ConnectedControllersManager;->lambda$removeController$0(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V -HSPLandroidx/media3/session/ConnectedControllersManager;->removeController(Landroidx/media3/session/MediaSession$ControllerInfo;)V -HSPLandroidx/media3/session/ConnectedControllersManager;->removeController(Ljava/lang/Object;)V HSPLandroidx/media3/session/ConnectionRequest$$ExternalSyntheticLambda0;->()V HSPLandroidx/media3/session/ConnectionRequest$$ExternalSyntheticLambda0;->fromBundle(Landroid/os/Bundle;)Landroidx/media3/common/Bundleable; HSPLandroidx/media3/session/ConnectionRequest;->$r8$lambda$2A3KvllqTYxjJdHPpYs14G1Hda8(Landroid/os/Bundle;)Landroidx/media3/session/ConnectionRequest; @@ -3968,13 +4002,10 @@ HSPLandroidx/media3/session/LegacyConversions;->convertToPlaybackStateCompatShuf HSPLandroidx/media3/session/LegacyConversions;->convertToPlaybackStateCompatState(Landroidx/media3/common/Player;Z)I HSPLandroidx/media3/session/LegacyConversions;->convertToQueueItemId(I)J HSPLandroidx/media3/session/LegacyConversions;->getLegacyStreamType(Landroidx/media3/common/AudioAttributes;)I -HSPLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaController;)V -HSPLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V HSPLandroidx/media3/session/MediaController$Builder$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaControllerHolder;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder$$ExternalSyntheticLambda0;->run()V HSPLandroidx/media3/session/MediaController$Builder$1;->(Landroidx/media3/session/MediaController$Builder;)V HSPLandroidx/media3/session/MediaController$Builder$1;->onCustomLayoutChanged(Landroidx/media3/session/MediaController;Ljava/util/List;)V -HSPLandroidx/media3/session/MediaController$Builder$1;->onDisconnected(Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder$1;->onSetCustomLayout(Landroidx/media3/session/MediaController;Ljava/util/List;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaController$Builder;->$r8$lambda$zyVzcB3Sb8jhbB9a-kIcWAaXt7s(Landroidx/media3/session/MediaControllerHolder;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Builder;->(Landroid/content/Context;Landroidx/media3/session/SessionToken;)V @@ -3984,9 +4015,7 @@ HSPLandroidx/media3/session/MediaController$Builder;->setApplicationLooper(Landr HSPLandroidx/media3/session/MediaController$Builder;->setConnectionHints(Landroid/os/Bundle;)Landroidx/media3/session/MediaController$Builder; HSPLandroidx/media3/session/MediaController$Builder;->setListener(Landroidx/media3/session/MediaController$Listener;)Landroidx/media3/session/MediaController$Builder; HSPLandroidx/media3/session/MediaController$Listener$-CC;->$default$onCustomLayoutChanged(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;Ljava/util/List;)V -HSPLandroidx/media3/session/MediaController$Listener$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;)V HSPLandroidx/media3/session/MediaController$Listener$-CC;->$default$onSetCustomLayout(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;Ljava/util/List;)Lcom/google/common/util/concurrent/ListenableFuture; -HSPLandroidx/media3/session/MediaController;->$r8$lambda$7Poy_IVrU20FjlOzoqG4RzKma48(Landroidx/media3/session/MediaController;Landroidx/media3/session/MediaController$Listener;)V HSPLandroidx/media3/session/MediaController;->(Landroid/content/Context;Landroidx/media3/session/SessionToken;Landroid/os/Bundle;Landroidx/media3/session/MediaController$Listener;Landroid/os/Looper;Landroidx/media3/session/MediaController$ConnectionCallback;Landroidx/media3/common/util/BitmapLoader;)V HSPLandroidx/media3/session/MediaController;->addListener(Landroidx/media3/common/Player$Listener;)V HSPLandroidx/media3/session/MediaController;->createImpl(Landroid/content/Context;Landroidx/media3/session/SessionToken;Landroid/os/Bundle;Landroid/os/Looper;Landroidx/media3/common/util/BitmapLoader;)Landroidx/media3/session/MediaController$MediaControllerImpl; @@ -3996,10 +4025,8 @@ HSPLandroidx/media3/session/MediaController;->getCurrentTimeline()Landroidx/medi HSPLandroidx/media3/session/MediaController;->getPlaybackState()I HSPLandroidx/media3/session/MediaController;->isConnected()Z HSPLandroidx/media3/session/MediaController;->isPlaying()Z -HSPLandroidx/media3/session/MediaController;->lambda$release$0(Landroidx/media3/session/MediaController$Listener;)V HSPLandroidx/media3/session/MediaController;->notifyAccepted()V HSPLandroidx/media3/session/MediaController;->notifyControllerListener(Landroidx/media3/common/util/Consumer;)V -HSPLandroidx/media3/session/MediaController;->release()V HSPLandroidx/media3/session/MediaController;->runOnApplicationLooper(Ljava/lang/Runnable;)V HSPLandroidx/media3/session/MediaController;->sendCustomCommand(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaController;->verifyApplicationThread()V @@ -4015,7 +4042,6 @@ HSPLandroidx/media3/session/MediaControllerHolder;->lambda$setController$1(Ljava HSPLandroidx/media3/session/MediaControllerHolder;->maybeSetFutureResult()V HSPLandroidx/media3/session/MediaControllerHolder;->onAccepted()V HSPLandroidx/media3/session/MediaControllerHolder;->setController(Landroidx/media3/session/MediaController;)V -HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda103;->(Landroidx/media3/session/MediaControllerImplBase;)V HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda104;->(Landroidx/media3/session/MediaControllerImplBase;I)V HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda104;->run()V HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda108;->(Landroidx/media3/session/MediaControllerImplBase;ZI)V @@ -4028,7 +4054,6 @@ HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41;- HSPLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda41;->run(Landroidx/media3/session/IMediaSession;I)V HSPLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;)V HSPLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;->(Landroidx/media3/session/MediaControllerImplBase;Landroid/os/Looper;)V -HSPLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;->release()V HSPLandroidx/media3/session/MediaControllerImplBase$SessionServiceConnection;->(Landroidx/media3/session/MediaControllerImplBase;Landroid/os/Bundle;)V HSPLandroidx/media3/session/MediaControllerImplBase$SessionServiceConnection;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V HSPLandroidx/media3/session/MediaControllerImplBase$SurfaceCallback;->(Landroidx/media3/session/MediaControllerImplBase;)V @@ -4061,7 +4086,6 @@ HSPLandroidx/media3/session/MediaControllerImplBase;->notifyPlayerInfoListenersW HSPLandroidx/media3/session/MediaControllerImplBase;->onConnected(Landroidx/media3/session/ConnectionState;)V HSPLandroidx/media3/session/MediaControllerImplBase;->onPlayerInfoChanged(Landroidx/media3/session/PlayerInfo;Landroidx/media3/session/PlayerInfo$BundlingExclusions;)V HSPLandroidx/media3/session/MediaControllerImplBase;->onSetCustomLayout(ILjava/util/List;)V -HSPLandroidx/media3/session/MediaControllerImplBase;->release()V HSPLandroidx/media3/session/MediaControllerImplBase;->requestConnectToService()Z HSPLandroidx/media3/session/MediaControllerImplBase;->requestConnectToSession(Landroid/os/Bundle;)Z HSPLandroidx/media3/session/MediaControllerImplBase;->sendControllerResult(ILandroidx/media3/session/SessionResult;)V @@ -4120,7 +4144,6 @@ HSPLandroidx/media3/session/MediaSession$Builder;->setId(Ljava/lang/String;)Land HSPLandroidx/media3/session/MediaSession$BuilderBase;->(Landroid/content/Context;Landroidx/media3/common/Player;Landroidx/media3/session/MediaSession$Callback;)V HSPLandroidx/media3/session/MediaSession$BuilderBase;->setCallback(Landroidx/media3/session/MediaSession$Callback;)Landroidx/media3/session/MediaSession$BuilderBase; HSPLandroidx/media3/session/MediaSession$BuilderBase;->setId(Ljava/lang/String;)Landroidx/media3/session/MediaSession$BuilderBase; -HSPLandroidx/media3/session/MediaSession$Callback$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaSession$Callback;Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/MediaSession$ConnectionResult$AcceptedResultBuilder;->(Landroidx/media3/session/MediaSession;)V HSPLandroidx/media3/session/MediaSession$ConnectionResult$AcceptedResultBuilder;->build()Landroidx/media3/session/MediaSession$ConnectionResult; HSPLandroidx/media3/session/MediaSession$ConnectionResult;->()V @@ -4198,7 +4221,6 @@ HSPLandroidx/media3/session/MediaSessionImpl;->lambda$setCustomLayout$4(Lcom/goo HSPLandroidx/media3/session/MediaSessionImpl;->lambda$setPlayerInternal$1(Landroidx/media3/session/PlayerWrapper;Landroidx/media3/session/PlayerWrapper;Landroidx/media3/session/MediaSession$ControllerCb;I)V HSPLandroidx/media3/session/MediaSessionImpl;->onConnectOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/MediaSession$ConnectionResult; HSPLandroidx/media3/session/MediaSessionImpl;->onCustomCommandOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -HSPLandroidx/media3/session/MediaSessionImpl;->onDisconnectedOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/MediaSessionImpl;->onPostConnectOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLandroidx/media3/session/MediaSessionImpl;->resolveControllerInfoForCallback(Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/MediaSession$ControllerInfo; HSPLandroidx/media3/session/MediaSessionImpl;->schedulePeriodicSessionPositionInfoChanges()V @@ -4267,8 +4289,6 @@ HSPLandroidx/media3/session/MediaSessionService;->onUpdateNotification(Landroidx HSPLandroidx/media3/session/MediaSessionService;->onUpdateNotificationInternal(Landroidx/media3/session/MediaSession;Z)Z HSPLandroidx/media3/session/MediaSessionService;->setListener(Landroidx/media3/session/MediaSessionService$Listener;)V HSPLandroidx/media3/session/MediaSessionService;->setMediaNotificationProvider(Landroidx/media3/session/MediaNotification$Provider;)V -HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V -HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->run()V HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda24;->(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)V HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda24;->run(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Ljava/lang/Object; HSPLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda56;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/IMediaController;)V @@ -4287,7 +4307,6 @@ HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->hashCode()I HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->onPlayerInfoChanged(ILandroidx/media3/session/PlayerInfo;Landroidx/media3/common/Player$Commands;ZZI)V HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->onSessionResult(ILandroidx/media3/session/SessionResult;)V HSPLandroidx/media3/session/MediaSessionStub$Controller2Cb;->setCustomLayout(ILjava/util/List;)V -HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$-z-kXYeUiIo9LEMOQQqDz14Ng0c(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$5u7ZOZu1E3qtXLejtiVCfQspblM(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/IMediaController;)V HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$KndwrP4QTMahDsglk9eR6NWxXtA(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaSessionStub;->$r8$lambda$RagmTrsP9kOCYea3J9OJn28bc5c(Landroidx/media3/session/MediaSession$ControllerInfo;ILcom/google/common/util/concurrent/ListenableFuture;)V @@ -4306,12 +4325,10 @@ HSPLandroidx/media3/session/MediaSessionStub;->lambda$connect$17(Landroidx/media HSPLandroidx/media3/session/MediaSessionStub;->lambda$dispatchSessionTaskWithSessionCommand$15(Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;IILandroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;)V HSPLandroidx/media3/session/MediaSessionStub;->lambda$handleSessionTaskWhenReady$16(Landroidx/media3/session/MediaSessionImpl;Lcom/google/common/util/concurrent/SettableFuture;Landroidx/media3/common/util/Consumer;Lcom/google/common/util/concurrent/ListenableFuture;)V HSPLandroidx/media3/session/MediaSessionStub;->lambda$onCustomCommand$24(Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; -HSPLandroidx/media3/session/MediaSessionStub;->lambda$release$18(Landroidx/media3/session/IMediaController;)V HSPLandroidx/media3/session/MediaSessionStub;->lambda$sendSessionResultWhenReady$2(Landroidx/media3/session/MediaSession$ControllerInfo;ILcom/google/common/util/concurrent/ListenableFuture;)V HSPLandroidx/media3/session/MediaSessionStub;->lambda$sendSessionResultWhenReady$3(Landroidx/media3/session/MediaSessionStub$SessionTask;Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;I)Lcom/google/common/util/concurrent/ListenableFuture; HSPLandroidx/media3/session/MediaSessionStub;->onControllerResult(Landroidx/media3/session/IMediaController;ILandroid/os/Bundle;)V HSPLandroidx/media3/session/MediaSessionStub;->onCustomCommand(Landroidx/media3/session/IMediaController;ILandroid/os/Bundle;Landroid/os/Bundle;)V -HSPLandroidx/media3/session/MediaSessionStub;->release(Landroidx/media3/session/IMediaController;I)V HSPLandroidx/media3/session/MediaSessionStub;->sendSessionResult(Landroidx/media3/session/MediaSession$ControllerInfo;ILandroidx/media3/session/SessionResult;)V HSPLandroidx/media3/session/MediaSessionStub;->sendSessionResultWhenReady(Landroidx/media3/session/MediaSessionStub$SessionTask;)Landroidx/media3/session/MediaSessionStub$SessionTask; HSPLandroidx/media3/session/MediaUtils;->()V @@ -4418,9 +4435,7 @@ HSPLandroidx/media3/session/SequencedFutureManager$SequencedFuture;->getSequence HSPLandroidx/media3/session/SequencedFutureManager$SequencedFuture;->set(Ljava/lang/Object;)Z HSPLandroidx/media3/session/SequencedFutureManager;->()V HSPLandroidx/media3/session/SequencedFutureManager;->createSequencedFuture(Ljava/lang/Object;)Landroidx/media3/session/SequencedFutureManager$SequencedFuture; -HSPLandroidx/media3/session/SequencedFutureManager;->lazyRelease(JLjava/lang/Runnable;)V HSPLandroidx/media3/session/SequencedFutureManager;->obtainNextSequenceNumber()I -HSPLandroidx/media3/session/SequencedFutureManager;->release()V HSPLandroidx/media3/session/SequencedFutureManager;->setFutureResult(ILjava/lang/Object;)V HSPLandroidx/media3/session/SessionCommand$$ExternalSyntheticLambda0;->()V HSPLandroidx/media3/session/SessionCommand$$ExternalSyntheticLambda0;->fromBundle(Landroid/os/Bundle;)Landroidx/media3/common/Bundleable; @@ -4515,7 +4530,6 @@ HSPLandroidx/navigation/NavArgument$Builder;->build()Landroidx/navigation/NavArg HSPLandroidx/navigation/NavArgument$Builder;->setIsNullable(Z)Landroidx/navigation/NavArgument$Builder; HSPLandroidx/navigation/NavArgument$Builder;->setType(Landroidx/navigation/NavType;)Landroidx/navigation/NavArgument$Builder; HSPLandroidx/navigation/NavArgument;->(Landroidx/navigation/NavType;ZLjava/lang/Object;Z)V -HSPLandroidx/navigation/NavArgument;->equals(Ljava/lang/Object;)Z HSPLandroidx/navigation/NavArgument;->hashCode()I HSPLandroidx/navigation/NavBackStackEntry$Companion;->()V HSPLandroidx/navigation/NavBackStackEntry$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -4557,9 +4571,9 @@ HSPLandroidx/navigation/NavController$activity$1;->()V HSPLandroidx/navigation/NavController$navInflater$2;->(Landroidx/navigation/NavController;)V HSPLandroidx/navigation/NavController$navInflater$2;->invoke()Landroidx/navigation/NavInflater; HSPLandroidx/navigation/NavController$navInflater$2;->invoke()Ljava/lang/Object; -HSPLandroidx/navigation/NavController$navigate$4;->(Lkotlin/jvm/internal/Ref$BooleanRef;Landroidx/navigation/NavController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V -HSPLandroidx/navigation/NavController$navigate$4;->invoke(Landroidx/navigation/NavBackStackEntry;)V -HSPLandroidx/navigation/NavController$navigate$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroidx/navigation/NavController$navigate$5;->(Lkotlin/jvm/internal/Ref$BooleanRef;Landroidx/navigation/NavController;Landroidx/navigation/NavDestination;Landroid/os/Bundle;)V +HSPLandroidx/navigation/NavController$navigate$5;->invoke(Landroidx/navigation/NavBackStackEntry;)V +HSPLandroidx/navigation/NavController$navigate$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroidx/navigation/NavController$onBackPressedCallback$1;->(Landroidx/navigation/NavController;)V HSPLandroidx/navigation/NavController;->$r8$lambda$bZL_fnLbLD5ZZthGK_6aY8AQ2pA(Landroidx/navigation/NavController;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/navigation/NavController;->()V @@ -4619,8 +4633,6 @@ HSPLandroidx/navigation/NavDestination;->(Landroidx/navigation/Navigator;) HSPLandroidx/navigation/NavDestination;->(Ljava/lang/String;)V HSPLandroidx/navigation/NavDestination;->addArgument(Ljava/lang/String;Landroidx/navigation/NavArgument;)V HSPLandroidx/navigation/NavDestination;->addInDefaultArgs(Landroid/os/Bundle;)Landroid/os/Bundle; -HSPLandroidx/navigation/NavDestination;->equals(Ljava/lang/Object;)Z -HSPLandroidx/navigation/NavDestination;->getArguments()Ljava/util/Map; HSPLandroidx/navigation/NavDestination;->getId()I HSPLandroidx/navigation/NavDestination;->getNavigatorName()Ljava/lang/String; HSPLandroidx/navigation/NavDestination;->getParent()Landroidx/navigation/NavGraph; @@ -4752,7 +4764,6 @@ HSPLandroidx/navigation/fragment/DialogFragmentNavigator$$ExternalSyntheticLambd HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Companion;->()V HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Destination;->(Landroidx/navigation/Navigator;)V -HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Destination;->equals(Ljava/lang/Object;)Z HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Destination;->hashCode()I HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Destination;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/navigation/fragment/DialogFragmentNavigator$Destination;->setClassName(Ljava/lang/String;)Landroidx/navigation/fragment/DialogFragmentNavigator$Destination; @@ -4778,7 +4789,7 @@ HSPLandroidx/navigation/fragment/FragmentNavigator$Destination;->getClassName()L HSPLandroidx/navigation/fragment/FragmentNavigator$Destination;->hashCode()I HSPLandroidx/navigation/fragment/FragmentNavigator$Destination;->onInflate(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroidx/navigation/fragment/FragmentNavigator$Destination;->setClassName(Ljava/lang/String;)Landroidx/navigation/fragment/FragmentNavigator$Destination; -HSPLandroidx/navigation/fragment/FragmentNavigator$attachClearViewModel$1;->(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavigatorState;)V +HSPLandroidx/navigation/fragment/FragmentNavigator$attachClearViewModel$1;->(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavigatorState;Landroidx/fragment/app/Fragment;)V HSPLandroidx/navigation/fragment/FragmentNavigator$attachClearViewModel$viewModel$1$1;->()V HSPLandroidx/navigation/fragment/FragmentNavigator$attachClearViewModel$viewModel$1$1;->()V HSPLandroidx/navigation/fragment/FragmentNavigator$attachClearViewModel$viewModel$1$1;->invoke(Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/navigation/fragment/FragmentNavigator$ClearEntryStateViewModel; @@ -4796,8 +4807,8 @@ HSPLandroidx/navigation/fragment/FragmentNavigator$fragmentViewObserver$1;->invo HSPLandroidx/navigation/fragment/FragmentNavigator$onAttach$2;->(Landroidx/navigation/NavigatorState;Landroidx/navigation/fragment/FragmentNavigator;)V HSPLandroidx/navigation/fragment/FragmentNavigator$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V HSPLandroidx/navigation/fragment/FragmentNavigator$sam$androidx_lifecycle_Observer$0;->onChanged(Ljava/lang/Object;)V -HSPLandroidx/navigation/fragment/FragmentNavigator;->$r8$lambda$ZTQok9KDpXTagzeByclo4DN6v_M(Landroidx/navigation/NavigatorState;Landroidx/navigation/fragment/FragmentNavigator;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V -HSPLandroidx/navigation/fragment/FragmentNavigator;->$r8$lambda$l6g2TQ9_Y2DuL3r-DYP3Exi4RF8(Landroidx/navigation/fragment/FragmentNavigator;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +HSPLandroidx/navigation/fragment/FragmentNavigator;->$r8$lambda$57AG1ONdZyfSFri9zMhNMaEoS04(Landroidx/navigation/NavigatorState;Landroidx/navigation/fragment/FragmentNavigator;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V +HSPLandroidx/navigation/fragment/FragmentNavigator;->$r8$lambda$UGHviOGo1Bg3DZy7AltD2gCe0Ns(Landroidx/navigation/fragment/FragmentNavigator;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V HSPLandroidx/navigation/fragment/FragmentNavigator;->()V HSPLandroidx/navigation/fragment/FragmentNavigator;->(Landroid/content/Context;Landroidx/fragment/app/FragmentManager;I)V HSPLandroidx/navigation/fragment/FragmentNavigator;->access$getFragmentViewObserver$p(Landroidx/navigation/fragment/FragmentNavigator;)Lkotlin/jvm/functions/Function1; @@ -4807,11 +4818,11 @@ HSPLandroidx/navigation/fragment/FragmentNavigator;->attachObservers(Landroidx/n HSPLandroidx/navigation/fragment/FragmentNavigator;->createDestination()Landroidx/navigation/NavDestination; HSPLandroidx/navigation/fragment/FragmentNavigator;->createDestination()Landroidx/navigation/fragment/FragmentNavigator$Destination; HSPLandroidx/navigation/fragment/FragmentNavigator;->createFragmentTransaction(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavOptions;)Landroidx/fragment/app/FragmentTransaction; -HSPLandroidx/navigation/fragment/FragmentNavigator;->fragmentObserver$lambda$2(Landroidx/navigation/fragment/FragmentNavigator;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V -HSPLandroidx/navigation/fragment/FragmentNavigator;->getEntriesToPop$navigation_fragment_release()Ljava/util/Set; +HSPLandroidx/navigation/fragment/FragmentNavigator;->fragmentObserver$lambda$1(Landroidx/navigation/fragment/FragmentNavigator;Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +HSPLandroidx/navigation/fragment/FragmentNavigator;->getPendingOps$navigation_fragment_release()Ljava/util/List; HSPLandroidx/navigation/fragment/FragmentNavigator;->navigate(Landroidx/navigation/NavBackStackEntry;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V HSPLandroidx/navigation/fragment/FragmentNavigator;->navigate(Ljava/util/List;Landroidx/navigation/NavOptions;Landroidx/navigation/Navigator$Extras;)V -HSPLandroidx/navigation/fragment/FragmentNavigator;->onAttach$lambda$4(Landroidx/navigation/NavigatorState;Landroidx/navigation/fragment/FragmentNavigator;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V +HSPLandroidx/navigation/fragment/FragmentNavigator;->onAttach$lambda$3(Landroidx/navigation/NavigatorState;Landroidx/navigation/fragment/FragmentNavigator;Landroidx/fragment/app/FragmentManager;Landroidx/fragment/app/Fragment;)V HSPLandroidx/navigation/fragment/FragmentNavigator;->onAttach(Landroidx/navigation/NavigatorState;)V HSPLandroidx/navigation/fragment/NavHostFragment$Companion;->()V HSPLandroidx/navigation/fragment/NavHostFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -4882,11 +4893,8 @@ HSPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->(Landroidx/re HSPLandroidx/recyclerview/widget/AsyncDifferConfig$Builder;->build()Landroidx/recyclerview/widget/AsyncDifferConfig; HSPLandroidx/recyclerview/widget/AsyncDifferConfig;->(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Landroidx/recyclerview/widget/DiffUtil$ItemCallback;)V HSPLandroidx/recyclerview/widget/AsyncDifferConfig;->getBackgroundThreadExecutor()Ljava/util/concurrent/Executor; -HSPLandroidx/recyclerview/widget/AsyncDifferConfig;->getDiffCallback()Landroidx/recyclerview/widget/DiffUtil$ItemCallback; HSPLandroidx/recyclerview/widget/AsyncDifferConfig;->getMainThreadExecutor()Ljava/util/concurrent/Executor; HSPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->(Landroidx/recyclerview/widget/AsyncListDiffer$1;)V -HSPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areContentsTheSame(II)Z -HSPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areItemsTheSame(II)Z HSPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getNewListSize()I HSPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getOldListSize()I HSPLandroidx/recyclerview/widget/AsyncListDiffer$1$2;->(Landroidx/recyclerview/widget/AsyncListDiffer$1;Landroidx/recyclerview/widget/DiffUtil$DiffResult;)V @@ -4991,8 +4999,6 @@ HSPLandroidx/recyclerview/widget/DiffUtil$1;->()V HSPLandroidx/recyclerview/widget/DiffUtil$Callback;->()V HSPLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->(I)V HSPLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->backingData()[I -HSPLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->get(I)I -HSPLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->set(II)V HSPLandroidx/recyclerview/widget/DiffUtil$Diagonal;->(III)V HSPLandroidx/recyclerview/widget/DiffUtil$Diagonal;->endX()I HSPLandroidx/recyclerview/widget/DiffUtil$Diagonal;->endY()I @@ -5002,19 +5008,11 @@ HSPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->dispatchUpdatesTo(Landroi HSPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->findMatchingItems()V HSPLandroidx/recyclerview/widget/DiffUtil$DiffResult;->findMoveMatches()V HSPLandroidx/recyclerview/widget/DiffUtil$ItemCallback;->()V -HSPLandroidx/recyclerview/widget/DiffUtil$Range;->()V HSPLandroidx/recyclerview/widget/DiffUtil$Range;->(IIII)V -HSPLandroidx/recyclerview/widget/DiffUtil$Range;->newSize()I HSPLandroidx/recyclerview/widget/DiffUtil$Range;->oldSize()I -HSPLandroidx/recyclerview/widget/DiffUtil$Snake;->()V -HSPLandroidx/recyclerview/widget/DiffUtil$Snake;->diagonalSize()I -HSPLandroidx/recyclerview/widget/DiffUtil$Snake;->hasAdditionOrRemoval()Z -HSPLandroidx/recyclerview/widget/DiffUtil$Snake;->toDiagonal()Landroidx/recyclerview/widget/DiffUtil$Diagonal; HSPLandroidx/recyclerview/widget/DiffUtil;->()V -HSPLandroidx/recyclerview/widget/DiffUtil;->backward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; HSPLandroidx/recyclerview/widget/DiffUtil;->calculateDiff(Landroidx/recyclerview/widget/DiffUtil$Callback;)Landroidx/recyclerview/widget/DiffUtil$DiffResult; HSPLandroidx/recyclerview/widget/DiffUtil;->calculateDiff(Landroidx/recyclerview/widget/DiffUtil$Callback;Z)Landroidx/recyclerview/widget/DiffUtil$DiffResult; -HSPLandroidx/recyclerview/widget/DiffUtil;->forward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; HSPLandroidx/recyclerview/widget/DiffUtil;->midPoint(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;)Landroidx/recyclerview/widget/DiffUtil$Snake; HSPLandroidx/recyclerview/widget/GapWorker$1;->()V HSPLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;->()V @@ -5022,7 +5020,6 @@ HSPLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;->clearPre HSPLandroidx/recyclerview/widget/GapWorker;->()V HSPLandroidx/recyclerview/widget/GapWorker;->()V HSPLandroidx/recyclerview/widget/GapWorker;->add(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLandroidx/recyclerview/widget/GapWorker;->remove(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$1;->(Landroidx/recyclerview/widget/ItemTouchHelper;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$2;->(Landroidx/recyclerview/widget/ItemTouchHelper;)V HSPLandroidx/recyclerview/widget/ItemTouchHelper$2;->onInterceptTouchEvent(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/MotionEvent;)Z @@ -5062,6 +5059,9 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager;->assertNotInLayoutOrScroll HSPLandroidx/recyclerview/widget/LinearLayoutManager;->calculateExtraLayoutSpace(Landroidx/recyclerview/widget/RecyclerView$State;[I)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollHorizontally()Z HSPLandroidx/recyclerview/widget/LinearLayoutManager;->canScrollVertically()Z +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I +HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeHorizontalScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollExtent(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollOffset(Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/LinearLayoutManager;->computeScrollRange(Landroidx/recyclerview/widget/RecyclerView$State;)I @@ -5087,7 +5087,6 @@ HSPLandroidx/recyclerview/widget/LinearLayoutManager;->isLayoutRTL()Z HSPLandroidx/recyclerview/widget/LinearLayoutManager;->layoutChunk(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutState;Landroidx/recyclerview/widget/LinearLayoutManager$LayoutChunkResult;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->layoutForPredictiveAnimations(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;II)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onAnchorReady(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/LinearLayoutManager$AnchorInfo;I)V -HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutChildren(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/LinearLayoutManager;->onLayoutCompleted(Landroidx/recyclerview/widget/RecyclerView$State;)V @@ -5126,6 +5125,10 @@ HSPLandroidx/recyclerview/widget/OpReorderer;->(Landroidx/recyclerview/wid HSPLandroidx/recyclerview/widget/OpReorderer;->getLastMoveOutOfOrder(Ljava/util/List;)I HSPLandroidx/recyclerview/widget/OpReorderer;->reorderOps(Ljava/util/List;)V HSPLandroidx/recyclerview/widget/OrientationHelper$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedEnd(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurement(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedMeasurementInOther(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getDecoratedStart(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndAfterPadding()I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getEndPadding()I HSPLandroidx/recyclerview/widget/OrientationHelper$1;->getMode()I @@ -5146,7 +5149,6 @@ HSPLandroidx/recyclerview/widget/OrientationHelper;->(Landroidx/recyclervi HSPLandroidx/recyclerview/widget/OrientationHelper;->createHorizontalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; HSPLandroidx/recyclerview/widget/OrientationHelper;->createOrientationHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;I)Landroidx/recyclerview/widget/OrientationHelper; HSPLandroidx/recyclerview/widget/OrientationHelper;->createVerticalHelper(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)Landroidx/recyclerview/widget/OrientationHelper; -HSPLandroidx/recyclerview/widget/OrientationHelper;->getTotalSpaceChange()I HSPLandroidx/recyclerview/widget/OrientationHelper;->onLayoutComplete()V HSPLandroidx/recyclerview/widget/RecyclerView$1;->(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$2;->(Landroidx/recyclerview/widget/RecyclerView;)V @@ -5175,7 +5177,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->findRelativeAdapterPosit HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->getStateRestorationPolicy()Landroidx/recyclerview/widget/RecyclerView$Adapter$StateRestorationPolicy; HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasObservers()Z HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->hasStableIds()Z -HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyDataSetChanged()V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeChanged(IILjava/lang/Object;)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyItemRangeInserted(II)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->onAttachedToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V @@ -5186,7 +5187,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->setHasStableIds(Z)V HSPLandroidx/recyclerview/widget/RecyclerView$Adapter;->unregisterAdapterDataObserver(Landroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;)V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->()V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->hasObservers()Z -HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyChanged()V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeChanged(IILjava/lang/Object;)V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyItemRangeInserted(II)V HSPLandroidx/recyclerview/widget/RecyclerView$AdapterDataObserver;->()V @@ -5216,6 +5216,11 @@ HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/g HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildAt(I)Landroid/view/View; +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildEnd(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getChildStart(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentEnd()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$1;->getParentStart()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildAt(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager$2;->getChildEnd(Landroid/view/View;)I @@ -5234,7 +5239,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachAndScrapAtta HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewAt(I)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->detachViewInternal(ILandroid/view/View;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/content/Context;Landroid/util/AttributeSet;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroidx/recyclerview/widget/RecyclerView$LayoutParams; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getBaseline()I @@ -5244,20 +5248,26 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildCount()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getChildMeasureSpec(IIIIZ)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getColumnCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBottom(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedBoundsWithMargins(Landroid/view/View;Landroid/graphics/Rect;)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedLeft(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredHeight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedMeasuredWidth(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedRight(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getDecoratedTop(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getFocusedChild()Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getHeightMode()I -HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getItemCount()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLayoutDirection()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getLeftDecorationWidth(Landroid/view/View;)I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumHeight()I +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getMinimumWidth()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingBottom()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingLeft()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingRight()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPaddingTop()I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getPosition(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getProperties(Landroid/content/Context;Landroid/util/AttributeSet;II)Landroidx/recyclerview/widget/RecyclerView$LayoutManager$Properties; +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRightDecorationWidth(Landroid/view/View;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getRowCountForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getSelectionModeForAccessibility(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;)I HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getTopDecorationHeight(Landroid/view/View;)I @@ -5268,10 +5278,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->isMeasurementUpToD HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->layoutDecoratedWithMargins(Landroid/view/View;IIII)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->measureChildWithMargins(Landroid/view/View;II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;)V -HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAddFocusables(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/ArrayList;II)Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAttachedToWindow(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityEvent(Landroidx/recyclerview/widget/RecyclerView$Recycler;Landroidx/recyclerview/widget/RecyclerView$State;Landroid/view/accessibility/AccessibilityEvent;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onInitializeAccessibilityNodeInfo(Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat;)V @@ -5287,6 +5294,8 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->requestLayout()V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->scrapOrRecycleView(Landroidx/recyclerview/widget/RecyclerView$Recycler;ILandroid/view/View;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setExactMeasureSpecsFrom(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasureSpecs(II)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimension(II)V +HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimension(Landroid/graphics/Rect;II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setMeasuredDimensionFromChildren(II)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->setRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V HSPLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->shouldMeasureChild(Landroid/view/View;IILandroidx/recyclerview/widget/RecyclerView$LayoutParams;)Z @@ -5297,7 +5306,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->getViewLayoutPositi HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemChanged()Z HSPLandroidx/recyclerview/widget/RecyclerView$LayoutParams;->isItemRemoved()Z HSPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->()V -HSPLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData;->()V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->()V HSPLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->attach()V @@ -5319,6 +5327,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->clearScrap()V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getRecycledViewPool()Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapCount()I HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapList()Ljava/util/List; +HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapOrCachedViewForId(JIZ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getScrapOrHiddenOrCachedHolderForPosition(IZ)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(I)Landroid/view/View; HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->getViewForPosition(IZ)Landroid/view/View; @@ -5328,8 +5337,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->maybeSendPoolingContain HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->offsetPositionRecordsForInsert(II)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onAdapterChanged(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onAttachedToWindow()V -HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->onDetachedFromWindow()V -HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->poolingContainerDetach(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->poolingContainerDetach(Landroidx/recyclerview/widget/RecyclerView$Adapter;Z)V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleAndClearCachedViews()V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->scrapView(Landroid/view/View;)V @@ -5339,11 +5346,9 @@ HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->unscrapView(Landroidx/r HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->updateViewCacheSize()V HSPLandroidx/recyclerview/widget/RecyclerView$Recycler;->validateViewHolderForOffsetPosition(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onChanged()V HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeChanged(IILjava/lang/Object;)V HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onItemRangeInserted(II)V HSPLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->triggerUpdateProcessor()V -HSPLandroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener;->()V HSPLandroidx/recyclerview/widget/RecyclerView$State;->()V HSPLandroidx/recyclerview/widget/RecyclerView$State;->assertLayoutStep(I)V HSPLandroidx/recyclerview/widget/RecyclerView$State;->getItemCount()I @@ -5360,9 +5365,9 @@ HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearOldPosition()V HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearPayload()V HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearReturnedFromScrapFlag()V HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->clearTmpDetachFlag()V -HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAbsoluteAdapterPosition()I HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAdapterPosition()I HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getBindingAdapterPosition()I +HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getItemId()J HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getItemViewType()I HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getLayoutPosition()I HSPLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getUnmodifiedPayloads()Ljava/util/List; @@ -5386,7 +5391,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context; HSPLandroidx/recyclerview/widget/RecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroidx/recyclerview/widget/RecyclerView;->access$000(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HSPLandroidx/recyclerview/widget/RecyclerView;->access$100(Landroidx/recyclerview/widget/RecyclerView;I)V -HSPLandroidx/recyclerview/widget/RecyclerView;->addFocusables(Ljava/util/ArrayList;II)V +HSPLandroidx/recyclerview/widget/RecyclerView;->access$500(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;)V HSPLandroidx/recyclerview/widget/RecyclerView;->addItemDecoration(Landroidx/recyclerview/widget/RecyclerView$ItemDecoration;I)V HSPLandroidx/recyclerview/widget/RecyclerView;->addOnChildAttachStateChangeListener(Landroidx/recyclerview/widget/RecyclerView$OnChildAttachStateChangeListener;)V @@ -5428,6 +5433,7 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->getBaseline()I HSPLandroidx/recyclerview/widget/RecyclerView;->getChangedHolderKey(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)J HSPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; HSPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolderInt(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLandroidx/recyclerview/widget/RecyclerView;->getDecoratedBoundsWithMarginsInt(Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroidx/recyclerview/widget/RecyclerView;->getFullClassName(Landroid/content/Context;Ljava/lang/String;)Ljava/lang/String; HSPLandroidx/recyclerview/widget/RecyclerView;->getItemAnimator()Landroidx/recyclerview/widget/RecyclerView$ItemAnimator; HSPLandroidx/recyclerview/widget/RecyclerView;->getItemDecorInsetsForChild(Landroid/view/View;)Landroid/graphics/Rect; @@ -5450,7 +5456,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->markKnownViewsInvalid()V HSPLandroidx/recyclerview/widget/RecyclerView;->offsetPositionRecordsForInsert(II)V HSPLandroidx/recyclerview/widget/RecyclerView;->onAttachedToWindow()V HSPLandroidx/recyclerview/widget/RecyclerView;->onChildAttachedToWindow(Landroid/view/View;)V -HSPLandroidx/recyclerview/widget/RecyclerView;->onDetachedFromWindow()V HSPLandroidx/recyclerview/widget/RecyclerView;->onDraw(Landroid/graphics/Canvas;)V HSPLandroidx/recyclerview/widget/RecyclerView;->onEnterLayoutOrScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->onExitLayoutOrScroll()V @@ -5488,7 +5493,6 @@ HSPLandroidx/recyclerview/widget/RecyclerView;->startInterceptRequestLayout()V HSPLandroidx/recyclerview/widget/RecyclerView;->startNestedScroll(II)Z HSPLandroidx/recyclerview/widget/RecyclerView;->stopGlowAnimations(Landroid/view/MotionEvent;)Z HSPLandroidx/recyclerview/widget/RecyclerView;->stopInterceptRequestLayout(Z)V -HSPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll(I)V HSPLandroidx/recyclerview/widget/RecyclerView;->stopScroll()V HSPLandroidx/recyclerview/widget/RecyclerView;->stopScrollersInternal()V @@ -5530,14 +5534,12 @@ HSPLandroidx/recyclerview/widget/ViewBoundsCheck;->(Landroidx/recyclerview HSPLandroidx/recyclerview/widget/ViewBoundsCheck;->findOneViewWithinBoundFlags(IIII)Landroid/view/View; HSPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V HSPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->()V -HSPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->drainCache()V HSPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->obtain()Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord; HSPLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->recycle(Landroidx/recyclerview/widget/ViewInfoStore$InfoRecord;)V HSPLandroidx/recyclerview/widget/ViewInfoStore;->()V HSPLandroidx/recyclerview/widget/ViewInfoStore;->addToPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)V HSPLandroidx/recyclerview/widget/ViewInfoStore;->clear()V HSPLandroidx/recyclerview/widget/ViewInfoStore;->getFromOldChangeHolders(J)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HSPLandroidx/recyclerview/widget/ViewInfoStore;->onDetach()V HSPLandroidx/recyclerview/widget/ViewInfoStore;->onViewDetached(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HSPLandroidx/recyclerview/widget/ViewInfoStore;->process(Landroidx/recyclerview/widget/ViewInfoStore$ProcessCallback;)V HSPLandroidx/recyclerview/widget/ViewInfoStore;->removeFromDisappearedInLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V @@ -5550,8 +5552,6 @@ HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;->getWr HSPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage;->obtainViewType(Landroidx/recyclerview/widget/NestedAdapterWrapper;)I HSPLandroidx/savedstate/Recreator$Companion;->()V HSPLandroidx/savedstate/Recreator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLandroidx/savedstate/Recreator$SavedStateProvider;->(Landroidx/savedstate/SavedStateRegistry;)V -HSPLandroidx/savedstate/Recreator$SavedStateProvider;->add(Ljava/lang/String;)V HSPLandroidx/savedstate/Recreator;->()V HSPLandroidx/savedstate/Recreator;->(Landroidx/savedstate/SavedStateRegistryOwner;)V HSPLandroidx/savedstate/Recreator;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V @@ -5568,7 +5568,6 @@ HSPLandroidx/savedstate/SavedStateRegistry;->performAttach$lambda$4(Landroidx/sa HSPLandroidx/savedstate/SavedStateRegistry;->performAttach$savedstate_release(Landroidx/lifecycle/Lifecycle;)V HSPLandroidx/savedstate/SavedStateRegistry;->performRestore$savedstate_release(Landroid/os/Bundle;)V HSPLandroidx/savedstate/SavedStateRegistry;->registerSavedStateProvider(Ljava/lang/String;Landroidx/savedstate/SavedStateRegistry$SavedStateProvider;)V -HSPLandroidx/savedstate/SavedStateRegistry;->runOnNextRecreation(Ljava/lang/Class;)V HSPLandroidx/savedstate/SavedStateRegistryController$Companion;->()V HSPLandroidx/savedstate/SavedStateRegistryController$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLandroidx/savedstate/SavedStateRegistryController$Companion;->create(Landroidx/savedstate/SavedStateRegistryOwner;)Landroidx/savedstate/SavedStateRegistryController; @@ -5968,6 +5967,7 @@ HSPLcom/airbnb/lottie/model/layer/BaseLayer;->setProgress(F)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->setVisible(Z)V HSPLcom/airbnb/lottie/model/layer/BaseLayer;->setupInOutAnimations()V HSPLcom/airbnb/lottie/model/layer/CompositionLayer$1;->()V +HSPLcom/airbnb/lottie/model/layer/CompositionLayer;->(Lcom/airbnb/lottie/LottieDrawable;Lcom/airbnb/lottie/model/layer/Layer;Ljava/util/List;Lcom/airbnb/lottie/LottieComposition;)V HSPLcom/airbnb/lottie/model/layer/CompositionLayer;->drawLayer(Landroid/graphics/Canvas;Landroid/graphics/Matrix;I)V HSPLcom/airbnb/lottie/model/layer/CompositionLayer;->resolveChildKeyPath(Lcom/airbnb/lottie/model/KeyPath;ILjava/util/List;Lcom/airbnb/lottie/model/KeyPath;)V HSPLcom/airbnb/lottie/model/layer/CompositionLayer;->setClipToCompositionBounds(Z)V @@ -6109,7 +6109,6 @@ HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->findName(Ljava/lang/String;L HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->hasNext()Z HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->isLiteral(I)Z HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextBoolean()Z -HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextDouble()D HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextInt()I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextName()Ljava/lang/String; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextNonWhitespace(Z)I @@ -6117,6 +6116,7 @@ HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextQuotedValue(Lokio/ByteSt HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->nextString()Ljava/lang/String; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peek()Lcom/airbnb/lottie/parser/moshi/JsonReader$Token; HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peekKeyword()I +HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->peekNumber()I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->selectName(Lcom/airbnb/lottie/parser/moshi/JsonReader$Options;)I HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->skipName()V HSPLcom/airbnb/lottie/parser/moshi/JsonUtf8Reader;->skipQuotedValue(Lokio/ByteString;)V @@ -6234,9 +6234,7 @@ HSPLcom/annimon/stream/Objects;->requireNonNull(Ljava/lang/Object;)Ljava/lang/Ob HSPLcom/annimon/stream/Optional;->()V HSPLcom/annimon/stream/Optional;->()V HSPLcom/annimon/stream/Optional;->(Ljava/lang/Object;)V -HSPLcom/annimon/stream/Optional;->empty()Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Optional;->of(Ljava/lang/Object;)Lcom/annimon/stream/Optional; -HSPLcom/annimon/stream/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/annimon/stream/Optional;->orElseThrow(Lcom/annimon/stream/function/Supplier;)Ljava/lang/Object; HSPLcom/annimon/stream/Stream$2;->(Lcom/annimon/stream/Stream;)V HSPLcom/annimon/stream/Stream$2;->apply(ILjava/lang/Object;)Lcom/annimon/stream/IntPair; @@ -6259,19 +6257,15 @@ HSPLcom/annimon/stream/Stream;->limit(J)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->map(Lcom/annimon/stream/function/Function;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->mapIndexed(IILcom/annimon/stream/function/IndexedFunction;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->match(Lcom/annimon/stream/function/Predicate;I)Z -HSPLcom/annimon/stream/Stream;->max(Ljava/util/Comparator;)Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Stream;->of(Ljava/lang/Iterable;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->of(Ljava/util/Map;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->of([Ljava/lang/Object;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->rangeClosed(II)Lcom/annimon/stream/Stream; -HSPLcom/annimon/stream/Stream;->reduce(Lcom/annimon/stream/function/BiFunction;)Lcom/annimon/stream/Optional; HSPLcom/annimon/stream/Stream;->reduce(Ljava/lang/Object;Lcom/annimon/stream/function/BiFunction;)Ljava/lang/Object; HSPLcom/annimon/stream/Stream;->sorted()Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->sorted(Ljava/util/Comparator;)Lcom/annimon/stream/Stream; HSPLcom/annimon/stream/Stream;->toList()Ljava/util/List; HSPLcom/annimon/stream/Stream;->withoutNulls()Lcom/annimon/stream/Stream; -HSPLcom/annimon/stream/function/BinaryOperator$Util$2;->(Ljava/util/Comparator;)V -HSPLcom/annimon/stream/function/BinaryOperator$Util;->maxBy(Ljava/util/Comparator;)Lcom/annimon/stream/function/BinaryOperator; HSPLcom/annimon/stream/function/Predicate$Util$4;->(Lcom/annimon/stream/function/Predicate;)V HSPLcom/annimon/stream/function/Predicate$Util$4;->test(Ljava/lang/Object;)Z HSPLcom/annimon/stream/function/Predicate$Util$5;->()V @@ -6298,9 +6292,6 @@ HSPLcom/annimon/stream/iterator/PrimitiveIterator$OfInt;->next()Ljava/lang/Objec HSPLcom/annimon/stream/operator/IntArray;->([I)V HSPLcom/annimon/stream/operator/IntArray;->hasNext()Z HSPLcom/annimon/stream/operator/IntArray;->nextInt()I -HSPLcom/annimon/stream/operator/IntRangeClosed;->(II)V -HSPLcom/annimon/stream/operator/IntRangeClosed;->hasNext()Z -HSPLcom/annimon/stream/operator/IntRangeClosed;->nextInt()I HSPLcom/annimon/stream/operator/ObjArray;->([Ljava/lang/Object;)V HSPLcom/annimon/stream/operator/ObjArray;->hasNext()Z HSPLcom/annimon/stream/operator/ObjArray;->nextIteration()Ljava/lang/Object; @@ -6319,15 +6310,12 @@ HSPLcom/annimon/stream/operator/ObjMapIndexed;->nextIteration()Ljava/lang/Object HSPLcom/annimon/stream/operator/ObjSorted;->(Ljava/util/Iterator;Ljava/util/Comparator;)V HSPLcom/annimon/stream/operator/ObjSorted;->nextIteration()V HSPLcom/bumptech/glide/GeneratedAppGlideModule;->()V +HSPLcom/bumptech/glide/GeneratedAppGlideModule;->getExcludedModuleClasses()Ljava/util/Set; +HSPLcom/bumptech/glide/GeneratedAppGlideModule;->getRequestManagerFactory()Lcom/bumptech/glide/manager/RequestManagerRetriever$RequestManagerFactory; HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->(Landroid/content/Context;)V HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->applyOptions(Landroid/content/Context;Lcom/bumptech/glide/GlideBuilder;)V -HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->getExcludedModuleClasses()Ljava/util/Set; -HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->getRequestManagerFactory()Lcom/bumptech/glide/GeneratedRequestManagerFactory; -HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->getRequestManagerFactory()Lcom/bumptech/glide/manager/RequestManagerRetriever$RequestManagerFactory; HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->isManifestParsingEnabled()Z HSPLcom/bumptech/glide/GeneratedAppGlideModuleImpl;->registerComponents(Landroid/content/Context;Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/Registry;)V -HSPLcom/bumptech/glide/GeneratedRequestManagerFactory;->()V -HSPLcom/bumptech/glide/GeneratedRequestManagerFactory;->build(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)Lcom/bumptech/glide/RequestManager; HSPLcom/bumptech/glide/GenericTransitionOptions;->()V HSPLcom/bumptech/glide/Glide;->(Landroid/content/Context;Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/load/engine/cache/MemoryCache;Lcom/bumptech/glide/load/engine/bitmap_recycle/BitmapPool;Lcom/bumptech/glide/load/engine/bitmap_recycle/ArrayPool;Lcom/bumptech/glide/manager/RequestManagerRetriever;Lcom/bumptech/glide/manager/ConnectivityMonitorFactory;ILcom/bumptech/glide/Glide$RequestOptionsFactory;Ljava/util/Map;Ljava/util/List;Ljava/util/List;Lcom/bumptech/glide/module/AppGlideModule;Lcom/bumptech/glide/GlideExperiments;)V HSPLcom/bumptech/glide/Glide;->checkAndInitializeGlide(Landroid/content/Context;Lcom/bumptech/glide/GeneratedAppGlideModule;)V @@ -6417,6 +6405,7 @@ HSPLcom/bumptech/glide/RequestManager$RequestManagerConnectivityListener;->()V HSPLcom/bumptech/glide/RequestManager;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)V HSPLcom/bumptech/glide/RequestManager;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Lcom/bumptech/glide/manager/RequestTracker;Lcom/bumptech/glide/manager/ConnectivityMonitorFactory;Landroid/content/Context;)V +HSPLcom/bumptech/glide/RequestManager;->as(Ljava/lang/Class;)Lcom/bumptech/glide/RequestBuilder; HSPLcom/bumptech/glide/RequestManager;->asDrawable()Lcom/bumptech/glide/RequestBuilder; HSPLcom/bumptech/glide/RequestManager;->clear(Landroid/view/View;)V HSPLcom/bumptech/glide/RequestManager;->clear(Lcom/bumptech/glide/request/target/Target;)V @@ -6940,7 +6929,6 @@ HSPLcom/bumptech/glide/manager/DoNothingFirstFrameWaiter;->registerSelf(Landroid HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->(Landroidx/lifecycle/Lifecycle;)V HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->addListener(Lcom/bumptech/glide/manager/LifecycleListener;)V HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLcom/bumptech/glide/manager/LifecycleLifecycle;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->(Lcom/bumptech/glide/manager/LifecycleRequestManagerRetriever;Landroidx/lifecycle/Lifecycle;)V HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->onStart()V HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->onStop()V @@ -6949,6 +6937,7 @@ HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever;->(Lcom/bu HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever;->getOnly(Landroidx/lifecycle/Lifecycle;)Lcom/bumptech/glide/RequestManager; HSPLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever;->getOrCreate(Landroid/content/Context;Lcom/bumptech/glide/Glide;Landroidx/lifecycle/Lifecycle;Landroidx/fragment/app/FragmentManager;Z)Lcom/bumptech/glide/RequestManager; HSPLcom/bumptech/glide/manager/RequestManagerRetriever$1;->()V +HSPLcom/bumptech/glide/manager/RequestManagerRetriever$1;->build(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)Lcom/bumptech/glide/RequestManager; HSPLcom/bumptech/glide/manager/RequestManagerRetriever;->()V HSPLcom/bumptech/glide/manager/RequestManagerRetriever;->(Lcom/bumptech/glide/manager/RequestManagerRetriever$RequestManagerFactory;Lcom/bumptech/glide/GlideExperiments;)V HSPLcom/bumptech/glide/manager/RequestManagerRetriever;->assertNotDestroyed(Landroid/app/Activity;)V @@ -7074,7 +7063,6 @@ HSPLcom/bumptech/glide/request/SingleRequest;->getErrorDrawable()Landroid/graphi HSPLcom/bumptech/glide/request/SingleRequest;->getLock()Ljava/lang/Object; HSPLcom/bumptech/glide/request/SingleRequest;->getPlaceholderDrawable()Landroid/graphics/drawable/Drawable; HSPLcom/bumptech/glide/request/SingleRequest;->isEquivalentTo(Lcom/bumptech/glide/request/Request;)Z -HSPLcom/bumptech/glide/request/SingleRequest;->isRunning()Z HSPLcom/bumptech/glide/request/SingleRequest;->maybeApplySizeMultiplier(IF)I HSPLcom/bumptech/glide/request/SingleRequest;->notifyRequestCoordinatorLoadFailed()V HSPLcom/bumptech/glide/request/SingleRequest;->obtain(Landroid/content/Context;Lcom/bumptech/glide/GlideContext;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Class;Lcom/bumptech/glide/request/BaseRequestOptions;IILcom/bumptech/glide/Priority;Lcom/bumptech/glide/request/target/Target;Lcom/bumptech/glide/request/RequestListener;Ljava/util/List;Lcom/bumptech/glide/request/RequestCoordinator;Lcom/bumptech/glide/load/engine/Engine;Lcom/bumptech/glide/request/transition/TransitionFactory;Ljava/util/concurrent/Executor;)Lcom/bumptech/glide/request/SingleRequest; @@ -7099,7 +7087,6 @@ HSPLcom/bumptech/glide/request/target/ImageViewTarget;->(Landroid/widget/I HSPLcom/bumptech/glide/request/target/ImageViewTarget;->maybeUpdateAnimatable(Ljava/lang/Object;)V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->onLoadFailed(Landroid/graphics/drawable/Drawable;)V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->onLoadStarted(Landroid/graphics/drawable/Drawable;)V -HSPLcom/bumptech/glide/request/target/ImageViewTarget;->onStop()V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->setDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/bumptech/glide/request/target/ImageViewTarget;->setResourceInternal(Ljava/lang/Object;)V HSPLcom/bumptech/glide/request/target/ImageViewTargetFactory;->()V @@ -7463,7 +7450,6 @@ HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->(Lcom/fasterxm HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->(Lcom/fasterxml/jackson/core/io/IOContext;ILjava/io/Reader;Lcom/fasterxml/jackson/core/ObjectCodec;Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;[CIIZ)V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_closeInput()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_closeScope(I)V -HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_finishString()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_finishString2()V HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_loadMore()Z HSPLcom/fasterxml/jackson/core/json/ReaderBasedJsonParser;->_matchFalse()V @@ -7514,7 +7500,6 @@ HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_finishString2([CI)V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_loadMore()Z HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_loadMoreGuaranteed()V HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_nextAfterName()Lcom/fasterxml/jackson/core/JsonToken; -HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_nextTokenNotInObject(I)Lcom/fasterxml/jackson/core/JsonToken; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_padLastQuad(II)I HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_parseName(I)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->_parsePosNumber(I)Lcom/fasterxml/jackson/core/JsonToken; @@ -7531,6 +7516,7 @@ HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName(III)Ljava/la HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName(IIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->findName([IIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getReadCapabilities()Lcom/fasterxml/jackson/core/util/JacksonFeatureSet; +HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->getText()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->nextFieldName()Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseEscapedName([IIIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/json/UTF8StreamJsonParser;->parseLongName(III)Ljava/lang/String; @@ -7543,6 +7529,7 @@ HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_flushBuffer()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_releaseBuffers()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_verifyValueWrite(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeBinary(Lcom/fasterxml/jackson/core/Base64Variant;[BII)V +HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeFieldName(Lcom/fasterxml/jackson/core/SerializableString;Z)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeFieldName(Ljava/lang/String;Z)V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeNull()V HSPLcom/fasterxml/jackson/core/json/WriterBasedJsonGenerator;->_writeString(Ljava/lang/String;)V @@ -7606,6 +7593,7 @@ HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->_thresholdSize(I)I HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->copyArrays()V HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->createRoot()Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer; HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->createRoot(I)Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer; +HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->findSymbol([CIII)Ljava/lang/String; HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->hashSeed()I HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->makeChild(I)Lcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer; HSPLcom/fasterxml/jackson/core/sym/CharsToNameCanonicalizer;->maybeDirty()Z @@ -8127,6 +8115,7 @@ HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->_deserializeWithErro HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->deserializeFromObject(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;)Ljava/lang/Object; +HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializer;->vanillaDeserialize(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Lcom/fasterxml/jackson/core/JsonToken;)Ljava/lang/Object; HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->()V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->(Lcom/fasterxml/jackson/databind/deser/BeanDeserializerBuilder;Lcom/fasterxml/jackson/databind/BeanDescription;Lcom/fasterxml/jackson/databind/deser/impl/BeanPropertyMap;Ljava/util/Map;Ljava/util/Set;ZLjava/util/Set;Z)V HSPLcom/fasterxml/jackson/databind/deser/BeanDeserializerBase;->_delegateDeserializer()Lcom/fasterxml/jackson/databind/JsonDeserializer; @@ -8285,6 +8274,7 @@ HSPLcom/fasterxml/jackson/databind/deser/impl/FailingDeserializer;->(Ljava HSPLcom/fasterxml/jackson/databind/deser/impl/FailingDeserializer;->(Ljava/lang/String;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->(Lcom/fasterxml/jackson/databind/deser/impl/FieldProperty;Lcom/fasterxml/jackson/databind/JsonDeserializer;Lcom/fasterxml/jackson/databind/deser/NullValueProvider;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->(Lcom/fasterxml/jackson/databind/introspect/BeanPropertyDefinition;Lcom/fasterxml/jackson/databind/JavaType;Lcom/fasterxml/jackson/databind/jsontype/TypeDeserializer;Lcom/fasterxml/jackson/databind/util/Annotations;Lcom/fasterxml/jackson/databind/introspect/AnnotatedField;)V +HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->deserializeAndSet(Lcom/fasterxml/jackson/core/JsonParser;Lcom/fasterxml/jackson/databind/DeserializationContext;Ljava/lang/Object;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->fixAccess(Lcom/fasterxml/jackson/databind/DeserializationConfig;)V HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->getMember()Lcom/fasterxml/jackson/databind/introspect/AnnotatedMember; HSPLcom/fasterxml/jackson/databind/deser/impl/FieldProperty;->withValueDeserializer(Lcom/fasterxml/jackson/databind/JsonDeserializer;)Lcom/fasterxml/jackson/databind/deser/SettableBeanProperty; @@ -9873,7 +9863,6 @@ HSPLcom/google/android/material/animation/AnimationUtils;->()V HSPLcom/google/android/material/animation/AnimationUtils;->lerp(FFF)F HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->()V HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->()V -HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer; HSPLcom/google/android/material/animation/ArgbEvaluatorCompat;->getInstance()Lcom/google/android/material/animation/ArgbEvaluatorCompat; HSPLcom/google/android/material/animation/MotionSpec;->()V HSPLcom/google/android/material/animation/MotionSpec;->addInfoFromAnimator(Lcom/google/android/material/animation/MotionSpec;Landroid/animation/Animator;)V @@ -10083,6 +10072,57 @@ HSPLcom/google/android/material/button/MaterialButtonHelper;->setShapeAppearance HSPLcom/google/android/material/button/MaterialButtonHelper;->updateBackground()V HSPLcom/google/android/material/button/MaterialButtonHelper;->updateButtonShape(Lcom/google/android/material/shape/ShapeAppearanceModel;)V HSPLcom/google/android/material/button/MaterialButtonHelper;->wrapDrawableWithInset(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/InsetDrawable; +HSPLcom/google/android/material/card/MaterialCardView;->()V +HSPLcom/google/android/material/card/MaterialCardView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +HSPLcom/google/android/material/card/MaterialCardView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +HSPLcom/google/android/material/card/MaterialCardView;->isCheckable()Z +HSPLcom/google/android/material/card/MaterialCardView;->isChecked()Z +HSPLcom/google/android/material/card/MaterialCardView;->isDragged()Z +HSPLcom/google/android/material/card/MaterialCardView;->onAttachedToWindow()V +HSPLcom/google/android/material/card/MaterialCardView;->onCreateDrawableState(I)[I +HSPLcom/google/android/material/card/MaterialCardView;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V +HSPLcom/google/android/material/card/MaterialCardView;->onMeasure(II)V +HSPLcom/google/android/material/card/MaterialCardView;->setAncestorContentPadding(IIII)V +HSPLcom/google/android/material/card/MaterialCardView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLcom/google/android/material/card/MaterialCardView;->setBackgroundInternal(Landroid/graphics/drawable/Drawable;)V +HSPLcom/google/android/material/card/MaterialCardView;->setCardBackgroundColor(I)V +HSPLcom/google/android/material/card/MaterialCardView;->setClickable(Z)V +HSPLcom/google/android/material/card/MaterialCardViewHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/drawable/InsetDrawable;Landroid/graphics/drawable/Drawable;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper$1;->(Lcom/google/android/material/card/MaterialCardViewHelper;Landroid/graphics/drawable/Drawable;IIII)V +HSPLcom/google/android/material/card/MaterialCardViewHelper$1;->getMinimumHeight()I +HSPLcom/google/android/material/card/MaterialCardViewHelper$1;->getMinimumWidth()I +HSPLcom/google/android/material/card/MaterialCardViewHelper$1;->getPadding(Landroid/graphics/Rect;)Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->()V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->(Lcom/google/android/material/card/MaterialCardView;Landroid/util/AttributeSet;II)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->canClipToOutline()Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->createForegroundRippleDrawable()Landroid/graphics/drawable/Drawable; +HSPLcom/google/android/material/card/MaterialCardViewHelper;->createForegroundShapeDrawable()Lcom/google/android/material/shape/MaterialShapeDrawable; +HSPLcom/google/android/material/card/MaterialCardViewHelper;->getBackground()Lcom/google/android/material/shape/MaterialShapeDrawable; +HSPLcom/google/android/material/card/MaterialCardViewHelper;->getClickableForeground()Landroid/graphics/drawable/Drawable; +HSPLcom/google/android/material/card/MaterialCardViewHelper;->getParentCardViewCalculatedCornerPadding()F +HSPLcom/google/android/material/card/MaterialCardViewHelper;->insetDrawable(Landroid/graphics/drawable/Drawable;)Landroid/graphics/drawable/Drawable; +HSPLcom/google/android/material/card/MaterialCardViewHelper;->isCheckable()Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->isCheckedIconBottom()Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->isCheckedIconEnd()Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->loadFromAttributes(Landroid/content/res/TypedArray;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->recalculateCheckedIconPosition(II)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setCardBackgroundColor(Landroid/content/res/ColorStateList;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setCardForegroundColor(Landroid/content/res/ColorStateList;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setChecked(Z)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setChecked(ZZ)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setCheckedIcon(Landroid/graphics/drawable/Drawable;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setCheckedIconMargin(I)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setCheckedIconSize(I)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->setUserContentPadding(IIII)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->shouldAddCornerPaddingInsideCardBackground()Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->shouldAddCornerPaddingOutsideCardBackground()Z +HSPLcom/google/android/material/card/MaterialCardViewHelper;->updateClickable()V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->updateContentPadding()V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->updateElevation()V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->updateInsetForeground(Landroid/graphics/drawable/Drawable;)V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->updateRippleColor()V +HSPLcom/google/android/material/card/MaterialCardViewHelper;->updateStroke()V HSPLcom/google/android/material/chip/Chip$$ExternalSyntheticLambda0;->(Lcom/google/android/material/chip/Chip;)V HSPLcom/google/android/material/chip/Chip$1;->(Lcom/google/android/material/chip/Chip;)V HSPLcom/google/android/material/chip/Chip$1;->onFontRetrieved(Landroid/graphics/Typeface;Z)V @@ -10297,21 +10337,13 @@ HSPLcom/google/android/material/imageview/ShapeableImageView;->access$000(Lcom/g HSPLcom/google/android/material/imageview/ShapeableImageView;->access$100(Lcom/google/android/material/imageview/ShapeableImageView;)Lcom/google/android/material/shape/MaterialShapeDrawable; HSPLcom/google/android/material/imageview/ShapeableImageView;->access$102(Lcom/google/android/material/imageview/ShapeableImageView;Lcom/google/android/material/shape/MaterialShapeDrawable;)Lcom/google/android/material/shape/MaterialShapeDrawable; HSPLcom/google/android/material/imageview/ShapeableImageView;->access$200(Lcom/google/android/material/imageview/ShapeableImageView;)Landroid/graphics/RectF; -HSPLcom/google/android/material/imageview/ShapeableImageView;->drawStroke(Landroid/graphics/Canvas;)V HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingBottom()I HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingLeft()I HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingRight()I HSPLcom/google/android/material/imageview/ShapeableImageView;->getContentPaddingTop()I -HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingBottom()I -HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingLeft()I -HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingRight()I -HSPLcom/google/android/material/imageview/ShapeableImageView;->getPaddingTop()I HSPLcom/google/android/material/imageview/ShapeableImageView;->isContentPaddingRelative()Z -HSPLcom/google/android/material/imageview/ShapeableImageView;->onDraw(Landroid/graphics/Canvas;)V HSPLcom/google/android/material/imageview/ShapeableImageView;->onMeasure(II)V -HSPLcom/google/android/material/imageview/ShapeableImageView;->onSizeChanged(IIII)V HSPLcom/google/android/material/imageview/ShapeableImageView;->setPadding(IIII)V -HSPLcom/google/android/material/imageview/ShapeableImageView;->updateShapeMask(II)V HSPLcom/google/android/material/internal/CollapsingTextHelper$1;->(Lcom/google/android/material/internal/CollapsingTextHelper;)V HSPLcom/google/android/material/internal/CollapsingTextHelper$1;->apply(Landroid/graphics/Typeface;)V HSPLcom/google/android/material/internal/CollapsingTextHelper$2;->(Lcom/google/android/material/internal/CollapsingTextHelper;)V @@ -10491,6 +10523,8 @@ HSPLcom/google/android/material/shape/MaterialShapeDrawable;->requiresCompatShad HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setElevation(F)V HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setFillColor(Landroid/content/res/ColorStateList;)V +HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setShadowBitmapDrawingEnable(Z)V +HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setShadowColor(I)V HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setShapeAppearanceModel(Lcom/google/android/material/shape/ShapeAppearanceModel;)V HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FI)V HSPLcom/google/android/material/shape/MaterialShapeDrawable;->setStroke(FLandroid/content/res/ColorStateList;)V @@ -11108,7 +11142,9 @@ HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->()V HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->(Landroid/content/Context;Ljava/lang/String;)V HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->getFormattedDate(J)Ljava/lang/String; HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->getStoredUserAgentString(Ljava/lang/String;)Ljava/lang/String; +HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->removeStoredDate(Ljava/lang/String;)V HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->storeHeartBeat(JLjava/lang/String;)V +HSPLcom/google/firebase/heartbeatinfo/HeartBeatInfoStorage;->updateStoredUserAgent(Ljava/lang/String;Ljava/lang/String;)V HSPLcom/google/firebase/installations/FirebaseInstallations$$ExternalSyntheticLambda1;->(Lcom/google/firebase/FirebaseApp;)V HSPLcom/google/firebase/installations/FirebaseInstallations$1;->()V HSPLcom/google/firebase/installations/FirebaseInstallations;->()V @@ -11251,7 +11287,6 @@ HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->()V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->(Lcom/google/i18n/phonenumbers/metadata/source/MetadataSource;Ljava/util/Map;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->buildNationalNumberForParsing(Ljava/lang/String;Ljava/lang/StringBuilder;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->checkRegionForParsing(Ljava/lang/CharSequence;Ljava/lang/String;)Z -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->chooseFormattingPatternForNumber(Ljava/util/List;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->createExtnPattern(Z)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/google/i18n/phonenumbers/MetadataLoader;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->createInstance(Lcom/google/i18n/phonenumbers/metadata/source/MetadataSource;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil; @@ -11260,26 +11295,14 @@ HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extnDigits(I)Ljava/lang/Strin HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extractCountryCode(Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;)I HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extractPhoneContext(Ljava/lang/String;I)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->extractPossibleNumber(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsnUsingPattern(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getInstance()Lcom/google/i18n/phonenumbers/PhoneNumberUtil; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegion(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegionOrCallingCode(ILjava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNumberDescByType(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForCountryCode(I)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->hasValidCountryCallingCode(I)Z -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isPhoneContextValid(Ljava/lang/String;)Z HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isValidRegionCode(Ljava/lang/String;)Z HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isViablePhoneNumber(Ljava/lang/CharSequence;)Z -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeAppendFormattedExtension(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeExtractCountryCode(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Ljava/lang/StringBuilder;ZLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)I HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeStripExtension(Ljava/lang/StringBuilder;)Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeStripInternationalPrefixAndNormalize(Ljava/lang/StringBuilder;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource; @@ -11290,52 +11313,30 @@ HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->normalizeDigitsOnly(Ljava/lan HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->parse(Ljava/lang/CharSequence;Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->parseHelper(Ljava/lang/CharSequence;Ljava/lang/String;ZZLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)V -HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->prefixNumberWithCountryCallingCode(ILcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->setInstance(Lcom/google/i18n/phonenumbers/PhoneNumberUtil;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->setItalianLeadingZerosForPhoneNumber(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)V HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult; HSPLcom/google/i18n/phonenumbers/PhoneNumberUtil;->testNumberLength(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$ValidationResult; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->()V -HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getFormat()Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPattern(I)Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPatternCount()I -HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getNationalPrefixFormattingRule()Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getPattern()Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->setFormat(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->setNationalPrefixOptionalWhenFormatting(Z)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->setPattern(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->()V -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getFixedLine()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getGeneralDesc()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getId()Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getIntlNumberFormatList()Ljava/util/List; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getLeadingDigits()Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNationalPrefixForParsing()Ljava/lang/String; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNumberFormatList()Ljava/util/List; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPager()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPersonalNumber()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPremiumRate()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSameMobileAndFixedLinePattern()Z -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSharedCost()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getTollFree()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getUan()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoicemail()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoip()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->hasLeadingDigits()Z HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setCountryCode(I)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setFixedLine(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setGeneralDesc(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setId(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setInternationalPrefix(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingDigits(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMainCountryForCode(Z)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobile(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setMobileNumberPortableRegion(Z)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefix(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixForParsing(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixTransformRule(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNoInternationalDialling(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPager(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setPersonalNumber(Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; @@ -11350,7 +11351,6 @@ HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->( HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->getMetadataList()Ljava/util/List; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadataCollection;->readExternal(Ljava/io/ObjectInput;)V HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->()V -HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getNationalNumberPattern()Ljava/lang/String; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getPossibleLengthList()Ljava/util/List; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getPossibleLengthLocalOnlyList()Ljava/util/List; HSPLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->readExternal(Ljava/io/ObjectInput;)V @@ -11362,16 +11362,11 @@ HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;->values()[Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource; HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->()V HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->getCountryCode()I -HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->getNationalNumber()J -HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasExtension()Z -HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->isItalianLeadingZero()Z HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCode(I)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->setNationalNumber(J)Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/google/i18n/phonenumbers/internal/GeoEntityUtility;->isGeoEntity(Ljava/lang/String;)Z HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->()V HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->create()Lcom/google/i18n/phonenumbers/internal/MatcherApi; -HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z -HSPLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z HSPLcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache$1;->(Lcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache;IFZ)V HSPLcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache$1;->removeEldestEntry(Ljava/util/Map$Entry;)Z HSPLcom/google/i18n/phonenumbers/internal/RegexCache$LRUCache;->(I)V @@ -11437,6 +11432,7 @@ HSPLcom/pnikosis/materialishprogress/ProgressWheel;->()V HSPLcom/pnikosis/materialishprogress/ProgressWheel;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLcom/pnikosis/materialishprogress/ProgressWheel;->onVisibilityChanged(Landroid/view/View;I)V HSPLcom/pnikosis/materialishprogress/ProgressWheel;->parseAttributes(Landroid/content/res/TypedArray;)V +HSPLcom/pnikosis/materialishprogress/ProgressWheel;->setAnimationEnabled()V HSPLcom/pnikosis/materialishprogress/ProgressWheel;->setBarColor(I)V HSPLcom/pnikosis/materialishprogress/ProgressWheel;->setupPaints()V HSPLcom/pnikosis/materialishprogress/ProgressWheel;->spin()V @@ -11526,6 +11522,7 @@ HSPLcom/squareup/wire/internal/Internal__InternalKt;->checkElementsNotNull(Ljava HSPLcom/squareup/wire/internal/Internal__InternalKt;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;)I HSPLcom/squareup/wire/internal/Internal__InternalKt;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)I HSPLcom/squareup/wire/internal/Internal__InternalKt;->countNonNull(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)I +HSPLcom/squareup/wire/internal/Internal__InternalKt;->immutableCopyOf(Ljava/lang/String;Ljava/util/List;)Ljava/util/List; HSPLio/reactivex/rxjava3/android/plugins/RxAndroidPlugins;->callRequireNonNull(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/android/plugins/RxAndroidPlugins;->initMainThreadScheduler(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Scheduler; HSPLio/reactivex/rxjava3/android/plugins/RxAndroidPlugins;->onMainThreadScheduler(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Scheduler; @@ -11555,7 +11552,6 @@ HSPLio/reactivex/rxjava3/core/Flowable;->combineLatest(Lorg/reactivestreams/Publ HSPLio/reactivex/rxjava3/core/Flowable;->combineLatestArray([Lorg/reactivestreams/Publisher;Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->create(Lio/reactivex/rxjava3/core/FlowableOnSubscribe;Lio/reactivex/rxjava3/core/BackpressureStrategy;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged()Lio/reactivex/rxjava3/core/Flowable; -HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->doOnEach(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->doOnNext(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Flowable; @@ -11577,18 +11573,11 @@ HSPLio/reactivex/rxjava3/core/Flowable;->subscribeOn(Lio/reactivex/rxjava3/core/ HSPLio/reactivex/rxjava3/core/Flowable;->switchMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->switchMap(Lio/reactivex/rxjava3/functions/Function;I)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->switchMap0(Lio/reactivex/rxjava3/functions/Function;IZ)Lio/reactivex/rxjava3/core/Flowable; -HSPLio/reactivex/rxjava3/core/Flowable;->switchMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->throttleLatest(JLjava/util/concurrent/TimeUnit;)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->throttleLatest(JLjava/util/concurrent/TimeUnit;Lio/reactivex/rxjava3/core/Scheduler;Z)Lio/reactivex/rxjava3/core/Flowable; HSPLio/reactivex/rxjava3/core/Flowable;->toObservable()Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Maybe;->()V -HSPLio/reactivex/rxjava3/core/Maybe;->create(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)Lio/reactivex/rxjava3/core/Maybe; -HSPLio/reactivex/rxjava3/core/Maybe;->doOnSuccess(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Maybe; -HSPLio/reactivex/rxjava3/core/Maybe;->empty()Lio/reactivex/rxjava3/core/Maybe; HSPLio/reactivex/rxjava3/core/Maybe;->filter(Lio/reactivex/rxjava3/functions/Predicate;)Lio/reactivex/rxjava3/core/Maybe; -HSPLio/reactivex/rxjava3/core/Maybe;->flatMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Maybe; -HSPLio/reactivex/rxjava3/core/Maybe;->fromCallable(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Maybe; -HSPLio/reactivex/rxjava3/core/Maybe;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Maybe; HSPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/core/MaybeObserver;)V HSPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/disposables/Disposable; @@ -11604,7 +11593,6 @@ HSPLio/reactivex/rxjava3/core/Observable;->combineLatestArray([Lio/reactivex/rxj HSPLio/reactivex/rxjava3/core/Observable;->concatArray([Lio/reactivex/rxjava3/core/ObservableSource;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->create(Lio/reactivex/rxjava3/core/ObservableOnSubscribe;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged()Lio/reactivex/rxjava3/core/Observable; -HSPLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->doOnEach(Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)Lio/reactivex/rxjava3/core/Observable; HSPLio/reactivex/rxjava3/core/Observable;->doOnNext(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Observable; @@ -11705,7 +11693,6 @@ HSPLio/reactivex/rxjava3/internal/disposables/DisposableHelper;->setOnce(Ljava/u HSPLio/reactivex/rxjava3/internal/disposables/DisposableHelper;->validate(Lio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/disposables/Disposable;)Z HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->()V HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->(Ljava/lang/String;I)V -HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->complete(Lio/reactivex/rxjava3/core/MaybeObserver;)V HSPLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->error(Ljava/lang/Throwable;Lio/reactivex/rxjava3/core/SingleObserver;)V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->()V HSPLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->(Lio/reactivex/rxjava3/disposables/Disposable;)V @@ -11856,7 +11843,6 @@ HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObser HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->checkTerminated(ZZLorg/reactivestreams/Subscriber;)Z HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->request(J)V -HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->requestFusion(I)I HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->run()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->trySchedule()V HSPLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnConditionalSubscriber;->(Lio/reactivex/rxjava3/internal/fuseable/ConditionalSubscriber;Lio/reactivex/rxjava3/core/Scheduler$Worker;ZI)V @@ -11959,57 +11945,14 @@ HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;-> HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->hasCustomOnError()Z HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->onComplete()V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->(Lio/reactivex/rxjava3/core/MaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->isDisposed()Z -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Predicate;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver;->onSuccess(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Predicate;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onComplete()V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->isDisposed()Z -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Function;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->(Ljava/util/concurrent/Callable;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/core/Scheduler;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onComplete()V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->run()V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/core/Scheduler;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Predicate;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onAfterTerminate()V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V -HSPLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->(Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->()V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/functions/Function;Z)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->drain()V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onNext(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->request(J)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Function;Z)V -HSPLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->subscribeActual(Lorg/reactivestreams/Subscriber;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver;->(Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver;->onSuccess(Ljava/lang/Object;)V @@ -12078,15 +12021,7 @@ HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterOb HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Predicate;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFilter;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onNext(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->(Lio/reactivex/rxjava3/core/ObservableSource;Lio/reactivex/rxjava3/functions/Function;Z)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V @@ -12103,11 +12038,7 @@ HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture;->(Ljava/util/concurrent/Future;JLjava/util/concurrent/TimeUnit;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->(Lio/reactivex/rxjava3/core/Observer;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onNext(Ljava/lang/Object;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->(Lorg/reactivestreams/Publisher;)V -HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableJust;->(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableJust;->get()Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;)V @@ -12282,9 +12213,7 @@ HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode;->soNext HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode;->spValue(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->()V HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->clear()V -HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->isEmpty()Z HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lpConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; -HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvProducerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->offer(Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->poll()Ljava/lang/Object; @@ -12436,7 +12365,6 @@ HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->(IF)V HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->add(Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->keys()[Ljava/lang/Object; HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->mix(I)I -HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->rehash()V HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->remove(Ljava/lang/Object;)Z HSPLio/reactivex/rxjava3/internal/util/OpenHashSet;->removeEntry(I[Ljava/lang/Object;I)Z HSPLio/reactivex/rxjava3/internal/util/Pow2;->roundToPowerOfTwo(I)I @@ -12456,11 +12384,9 @@ HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->asConsumer(Lkotlin/jvm/functions HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->asOnCompleteAction(Lkotlin/jvm/functions/Function0;)Lio/reactivex/rxjava3/functions/Action; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->asOnErrorConsumer(Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/functions/Consumer; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Flowable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; -HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Single;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Flowable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; -HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Observable;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Single;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; HSPLio/reactivex/rxjava3/observables/ConnectableObservable;->()V @@ -12557,6 +12483,7 @@ HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->add(Lio/reactivex/rxjava3/su HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->create()Lio/reactivex/rxjava3/subjects/BehaviorSubject; HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->createDefault(Ljava/lang/Object;)Lio/reactivex/rxjava3/subjects/BehaviorSubject; HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->getValue()Ljava/lang/Object; +HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->onNext(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->remove(Lio/reactivex/rxjava3/subjects/BehaviorSubject$BehaviorDisposable;)V HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->setCurrent(Ljava/lang/Object;)V HSPLio/reactivex/rxjava3/subjects/BehaviorSubject;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V @@ -12798,10 +12725,8 @@ HSPLj$/util/Optional;->()V HSPLj$/util/Optional;->(Ljava/lang/Object;)V HSPLj$/util/Optional;->empty()Lj$/util/Optional; HSPLj$/util/Optional;->get()Ljava/lang/Object; -HSPLj$/util/Optional;->ifPresent(Lj$/util/function/Consumer;)V HSPLj$/util/Optional;->isPresent()Z HSPLj$/util/Optional;->map(Lj$/util/function/Function;)Lj$/util/Optional; -HSPLj$/util/Optional;->of(Ljava/lang/Object;)Lj$/util/Optional; HSPLj$/util/Optional;->ofNullable(Ljava/lang/Object;)Lj$/util/Optional; HSPLj$/util/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/S;->([Ljava/lang/Object;III)V @@ -12809,7 +12734,6 @@ HSPLj$/util/S;->a(Lj$/util/function/Consumer;)V HSPLj$/util/S;->characteristics()I HSPLj$/util/S;->estimateSize()J HSPLj$/util/S;->getExactSizeIfKnown()J -HSPLj$/util/S;->s(Lj$/util/function/Consumer;)Z HSPLj$/util/U;->()V HSPLj$/util/V;->()V HSPLj$/util/W;->()V @@ -12828,7 +12752,6 @@ HSPLj$/util/c;->()V HSPLj$/util/concurrent/ConcurrentHashMap;->()V HSPLj$/util/concurrent/ConcurrentHashMap;->()V HSPLj$/util/concurrent/ConcurrentHashMap;->(IFI)V -HSPLj$/util/concurrent/ConcurrentHashMap;->addCount(JI)V HSPLj$/util/concurrent/ConcurrentHashMap;->casTabAt([Lj$/util/concurrent/l;ILj$/util/concurrent/l;Lj$/util/concurrent/l;)Z HSPLj$/util/concurrent/ConcurrentHashMap;->clear()V HSPLj$/util/concurrent/ConcurrentHashMap;->comparableClassFor(Ljava/lang/Object;)Ljava/lang/Class; @@ -12841,7 +12764,6 @@ HSPLj$/util/concurrent/ConcurrentHashMap;->keySet()Ljava/util/Set; HSPLj$/util/concurrent/ConcurrentHashMap;->mappingCount()J HSPLj$/util/concurrent/ConcurrentHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->putIfAbsent(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLj$/util/concurrent/ConcurrentHashMap;->putVal(Ljava/lang/Object;Ljava/lang/Object;Z)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->replaceNode(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/concurrent/ConcurrentHashMap;->resizeStamp(I)I @@ -12888,12 +12810,9 @@ HSPLj$/util/d;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/d;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/d;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLj$/util/d;->values()Ljava/util/Collection; -HSPLj$/util/function/b;->(Ljava/util/Comparator;I)V HSPLj$/util/m;->()V HSPLj$/util/m;->j(Lj$/util/Spliterator;)J HSPLj$/util/m;->y(Ljava/lang/Object;Ljava/lang/Object;)Z -HSPLj$/util/stream/A1;->(Lj$/util/stream/V2;Ljava/lang/Object;I)V -HSPLj$/util/stream/A1;->l1()Lj$/util/stream/P1; HSPLj$/util/stream/B2;->(Lj$/util/stream/c;)V HSPLj$/util/stream/B2;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; HSPLj$/util/stream/C2;->(Lj$/util/stream/g2;Ljava/util/Comparator;)V @@ -12905,12 +12824,6 @@ HSPLj$/util/stream/Collector$Characteristics;->values()[Lj$/util/stream/Collecto HSPLj$/util/stream/Collectors;->()V HSPLj$/util/stream/Collectors;->toList()Lj$/util/stream/Collector; HSPLj$/util/stream/Collectors;->toSet()Lj$/util/stream/Collector; -HSPLj$/util/stream/E1;->(Lj$/util/function/BinaryOperator;)V -HSPLj$/util/stream/E1;->accept(Ljava/lang/Object;)V -HSPLj$/util/stream/E1;->get()Ljava/lang/Object; -HSPLj$/util/stream/E1;->m()V -HSPLj$/util/stream/E1;->n(J)V -HSPLj$/util/stream/E1;->q()Z HSPLj$/util/stream/F1;->(Lj$/util/stream/V2;Lj$/util/function/BinaryOperator;Lj$/util/function/BiConsumer;Lj$/util/function/Supplier;Lj$/util/stream/Collector;)V HSPLj$/util/stream/F1;->l1()Lj$/util/stream/P1; HSPLj$/util/stream/F1;->p()I @@ -12976,10 +12889,7 @@ HSPLj$/util/stream/Y1;->collect(Lj$/util/stream/Collector;)Ljava/lang/Object; HSPLj$/util/stream/Y1;->filter(Lj$/util/function/Predicate;)Lj$/util/stream/Stream; HSPLj$/util/stream/Y1;->findFirst()Lj$/util/Optional; HSPLj$/util/stream/Y1;->forEach(Lj$/util/function/Consumer;)V -HSPLj$/util/stream/Y1;->limit(J)Lj$/util/stream/Stream; HSPLj$/util/stream/Y1;->map(Lj$/util/function/Function;)Lj$/util/stream/Stream; -HSPLj$/util/stream/Y1;->max(Ljava/util/Comparator;)Lj$/util/Optional; -HSPLj$/util/stream/Y1;->n(Lj$/util/function/BinaryOperator;)Lj$/util/Optional; HSPLj$/util/stream/Y1;->sorted()Lj$/util/stream/Stream; HSPLj$/util/stream/Y1;->t1(Lj$/util/Spliterator;Lj$/util/stream/g2;)V HSPLj$/util/stream/Z0;->()V @@ -12998,12 +12908,6 @@ HSPLj$/util/stream/c;->isParallel()Z HSPLj$/util/stream/c;->n1(Lj$/util/Spliterator;Lj$/util/stream/g2;)Lj$/util/stream/g2; HSPLj$/util/stream/c;->o1(Lj$/util/stream/g2;)Lj$/util/stream/g2; HSPLj$/util/stream/c;->q1(Lj$/util/stream/F3;)Ljava/lang/Object; -HSPLj$/util/stream/h2;->(Lj$/util/stream/i2;Lj$/util/stream/g2;)V -HSPLj$/util/stream/h2;->accept(Ljava/lang/Object;)V -HSPLj$/util/stream/h2;->n(J)V -HSPLj$/util/stream/h2;->q()Z -HSPLj$/util/stream/i2;->(Lj$/util/stream/c;IJJ)V -HSPLj$/util/stream/i2;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; HSPLj$/util/stream/l;->(I)V HSPLj$/util/stream/n;->(Lj$/util/function/Supplier;Lj$/util/function/BiConsumer;Lj$/util/function/BinaryOperator;Lj$/util/function/Function;Ljava/util/Set;)V HSPLj$/util/stream/n;->(Lj$/util/function/Supplier;Lj$/util/function/BiConsumer;Lj$/util/function/BinaryOperator;Ljava/util/Set;)V @@ -13016,12 +12920,8 @@ HSPLj$/util/stream/u2;->q()Z HSPLj$/util/stream/w0;->()V HSPLj$/util/stream/w0;->()V HSPLj$/util/stream/w0;->(Lj$/util/stream/V2;)V -HSPLj$/util/stream/w0;->C0(JJJ)J -HSPLj$/util/stream/w0;->S0(J)I HSPLj$/util/stream/w0;->f0(Lj$/util/stream/w0;Lj$/util/Spliterator;)Ljava/lang/Object; -HSPLj$/util/stream/w0;->k1(Lj$/util/stream/c;JJ)Lj$/util/stream/Stream; HSPLj$/util/stream/w0;->m1(Lj$/util/Spliterator;Z)Lj$/util/stream/Stream; -HSPLj$/util/stream/w0;->p()I HSPLj$/util/stream/w;->(Lj$/util/stream/c;ILjava/lang/Object;I)V HSPLj$/util/stream/w;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; HSPLkotlin/InitializedLazyImpl;->(Ljava/lang/Object;)V @@ -13091,13 +12991,11 @@ HSPLkotlin/UnsafeLazyImpl;->(Lkotlin/jvm/functions/Function0;)V HSPLkotlin/UnsafeLazyImpl;->getValue()Ljava/lang/Object; HSPLkotlin/collections/AbstractCollection$toString$1;->(Lkotlin/collections/AbstractCollection;)V HSPLkotlin/collections/AbstractCollection;->()V -HSPLkotlin/collections/AbstractCollection;->isEmpty()Z HSPLkotlin/collections/AbstractCollection;->toString()Ljava/lang/String; HSPLkotlin/collections/AbstractList$Companion;->()V HSPLkotlin/collections/AbstractList$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/collections/AbstractList$Companion;->checkElementIndex$kotlin_stdlib(II)V HSPLkotlin/collections/AbstractList$IteratorImpl;->(Lkotlin/collections/AbstractList;)V -HSPLkotlin/collections/AbstractList$IteratorImpl;->hasNext()Z HSPLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->()V HSPLkotlin/collections/AbstractList;->iterator()Ljava/util/Iterator; @@ -13164,7 +13062,6 @@ HSPLkotlin/collections/ArraysKt;->toMutableSet([Ljava/lang/Object;)Ljava/util/Se HSPLkotlin/collections/ArraysKt;->toSet([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/ArraysKt;->zip([Ljava/lang/Object;[Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt__ArraysJVMKt;->copyOfRangeToIndexCheck(II)V -HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->asList([Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([B[BIIIILjava/lang/Object;)[B HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto$default([Ljava/lang/Object;[Ljava/lang/Object;IIIILjava/lang/Object;)[Ljava/lang/Object; HSPLkotlin/collections/ArraysKt___ArraysJvmKt;->copyInto([B[BIII)[B @@ -13208,7 +13105,6 @@ HSPLkotlin/collections/CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/O HSPLkotlin/collections/CollectionsKt;->flatten(Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt;->getLastIndex(Ljava/util/List;)I HSPLkotlin/collections/CollectionsKt;->getOrNull(Ljava/util/List;I)Ljava/lang/Object; -HSPLkotlin/collections/CollectionsKt;->intersect(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/CollectionsKt;->joinTo$default(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Appendable; HSPLkotlin/collections/CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/collections/CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object; @@ -13225,7 +13121,6 @@ HSPLkotlin/collections/CollectionsKt;->optimizeReadOnlyList(Ljava/util/List;)Lja HSPLkotlin/collections/CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt;->plus(Ljava/util/Collection;Ljava/lang/Object;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt;->plus(Ljava/util/Collection;[Ljava/lang/Object;)Ljava/util/List; -HSPLkotlin/collections/CollectionsKt;->retainAll(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Z HSPLkotlin/collections/CollectionsKt;->reverse(Ljava/util/List;)V HSPLkotlin/collections/CollectionsKt;->reversed(Ljava/lang/Iterable;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt;->sort(Ljava/util/List;)V @@ -13261,9 +13156,6 @@ HSPLkotlin/collections/CollectionsKt__MutableCollectionsJVMKt;->sortWith(Ljava/u HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;[Ljava/lang/Object;)Z HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->convertToListIfNotCollection(Ljava/lang/Iterable;)Ljava/util/Collection; -HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->filterInPlace$CollectionsKt__MutableCollectionsKt(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;Z)Z -HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->retainAll(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Z -HSPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->retainAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z HSPLkotlin/collections/CollectionsKt___CollectionsJvmKt;->filterIsInstance(Ljava/lang/Iterable;Ljava/lang/Class;)Ljava/util/List; HSPLkotlin/collections/CollectionsKt___CollectionsJvmKt;->filterIsInstanceTo(Ljava/lang/Iterable;Ljava/util/Collection;Ljava/lang/Class;)Ljava/util/Collection; HSPLkotlin/collections/CollectionsKt___CollectionsJvmKt;->reverse(Ljava/util/List;)V @@ -13283,9 +13175,7 @@ HSPLkotlin/collections/CollectionsKt___CollectionsKt;->first(Ljava/util/List;)Lj HSPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/lang/Iterable;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->firstOrNull(Ljava/util/List;)Ljava/lang/Object; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->getOrNull(Ljava/util/List;I)Ljava/lang/Object; -HSPLkotlin/collections/CollectionsKt___CollectionsKt;->intersect(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo$default(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/Appendable; -HSPLkotlin/collections/CollectionsKt___CollectionsKt;->joinTo(Ljava/lang/Iterable;Ljava/lang/Appendable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/Appendable; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString$default(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->joinToString(Ljava/lang/Iterable;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; HSPLkotlin/collections/CollectionsKt___CollectionsKt;->last(Ljava/util/List;)Ljava/lang/Object; @@ -13331,11 +13221,9 @@ HSPLkotlin/collections/EmptyMap;->entrySet()Ljava/util/Set; HSPLkotlin/collections/EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/collections/EmptyMap;->get(Ljava/lang/Object;)Ljava/lang/Void; HSPLkotlin/collections/EmptyMap;->getEntries()Ljava/util/Set; -HSPLkotlin/collections/EmptyMap;->getKeys()Ljava/util/Set; HSPLkotlin/collections/EmptyMap;->getSize()I HSPLkotlin/collections/EmptyMap;->getValues()Ljava/util/Collection; HSPLkotlin/collections/EmptyMap;->isEmpty()Z -HSPLkotlin/collections/EmptyMap;->keySet()Ljava/util/Set; HSPLkotlin/collections/EmptyMap;->size()I HSPLkotlin/collections/EmptyMap;->values()Ljava/util/Collection; HSPLkotlin/collections/EmptySet;->()V @@ -13357,7 +13245,6 @@ HSPLkotlin/collections/IndexingIterator;->next()Ljava/lang/Object; HSPLkotlin/collections/IndexingIterator;->next()Lkotlin/collections/IndexedValue; HSPLkotlin/collections/IntIterator;->()V HSPLkotlin/collections/IntIterator;->next()Ljava/lang/Object; -HSPLkotlin/collections/MapsKt;->asSequence(Ljava/util/Map;)Lkotlin/sequences/Sequence; HSPLkotlin/collections/MapsKt;->build(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt;->createMapBuilder()Ljava/util/Map; HSPLkotlin/collections/MapsKt;->emptyMap()Ljava/util/Map; @@ -13375,7 +13262,6 @@ HSPLkotlin/collections/MapsKt__MapsJVMKt;->build(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsJVMKt;->createMapBuilder()Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapCapacity(I)I HSPLkotlin/collections/MapsKt__MapsJVMKt;->mapOf(Lkotlin/Pair;)Ljava/util/Map; -HSPLkotlin/collections/MapsKt__MapsJVMKt;->toSingletonMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->emptyMap()Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->linkedMapOf([Lkotlin/Pair;)Ljava/util/LinkedHashMap; HSPLkotlin/collections/MapsKt__MapsKt;->mapOf([Lkotlin/Pair;)Ljava/util/Map; @@ -13388,7 +13274,6 @@ HSPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/lang/Iterable;Ljava/util/Map HSPLkotlin/collections/MapsKt__MapsKt;->toMap(Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->toMap([Lkotlin/Pair;Ljava/util/Map;)Ljava/util/Map; HSPLkotlin/collections/MapsKt__MapsKt;->toMutableMap(Ljava/util/Map;)Ljava/util/Map; -HSPLkotlin/collections/MapsKt___MapsKt;->asSequence(Ljava/util/Map;)Lkotlin/sequences/Sequence; HSPLkotlin/collections/RingBuffer;->(I)V HSPLkotlin/collections/RingBuffer;->([Ljava/lang/Object;I)V HSPLkotlin/collections/RingBuffer;->access$getCapacity$p(Lkotlin/collections/RingBuffer;)I @@ -13399,7 +13284,6 @@ HSPLkotlin/collections/RingBuffer;->removeFirst(I)V HSPLkotlin/collections/RingBuffer;->toArray()[Ljava/lang/Object; HSPLkotlin/collections/RingBuffer;->toArray([Ljava/lang/Object;)[Ljava/lang/Object; HSPLkotlin/collections/SetsKt;->emptySet()Ljava/util/Set; -HSPLkotlin/collections/SetsKt;->minus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/SetsKt;->minus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/SetsKt;->plus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/SetsKt;->plus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; @@ -13408,7 +13292,6 @@ HSPLkotlin/collections/SetsKt;->setOf([Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/SetsKt__SetsJVMKt;->setOf(Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/SetsKt__SetsKt;->emptySet()Ljava/util/Set; HSPLkotlin/collections/SetsKt__SetsKt;->setOf([Ljava/lang/Object;)Ljava/util/Set; -HSPLkotlin/collections/SetsKt___SetsKt;->minus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/SetsKt___SetsKt;->minus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; HSPLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Iterable;)Ljava/util/Set; HSPLkotlin/collections/SetsKt___SetsKt;->plus(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; @@ -13461,12 +13344,21 @@ HSPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineResumed(Lkotlin HSPLkotlin/coroutines/jvm/internal/DebugProbesKt;->probeCoroutineSuspended(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/RestrictedContinuationImpl;->(Lkotlin/coroutines/Continuation;)V HSPLkotlin/coroutines/jvm/internal/RestrictedSuspendLambda;->(ILkotlin/coroutines/Continuation;)V +HSPLkotlin/internal/PlatformImplementations;->()V +HSPLkotlin/internal/PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random; +HSPLkotlin/internal/PlatformImplementationsKt;->()V HSPLkotlin/internal/ProgressionUtilKt;->differenceModulo(III)I HSPLkotlin/internal/ProgressionUtilKt;->differenceModulo(JJJ)J HSPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(III)I HSPLkotlin/internal/ProgressionUtilKt;->getProgressionLastElement(JJJ)J HSPLkotlin/internal/ProgressionUtilKt;->mod(II)I HSPLkotlin/internal/ProgressionUtilKt;->mod(JJ)J +HSPLkotlin/internal/jdk7/JDK7PlatformImplementations;->()V +HSPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V +HSPLkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion;->()V +HSPLkotlin/internal/jdk8/JDK8PlatformImplementations;->()V +HSPLkotlin/internal/jdk8/JDK8PlatformImplementations;->defaultPlatformRandom()Lkotlin/random/Random; +HSPLkotlin/internal/jdk8/JDK8PlatformImplementations;->sdkIsNullOrAtLeast(I)Z HSPLkotlin/io/CloseableKt;->closeFinally(Ljava/io/Closeable;Ljava/lang/Throwable;)V HSPLkotlin/jvm/JvmClassMappingKt;->getAnnotationClass(Ljava/lang/annotation/Annotation;)Lkotlin/reflect/KClass; HSPLkotlin/jvm/JvmClassMappingKt;->getJavaClass(Lkotlin/reflect/KClass;)Ljava/lang/Class; @@ -13489,6 +13381,7 @@ HSPLkotlin/jvm/internal/FunctionReference;->(ILjava/lang/Object;)V HSPLkotlin/jvm/internal/FunctionReference;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V HSPLkotlin/jvm/internal/FunctionReferenceImpl;->(ILjava/lang/Object;Ljava/lang/Class;Ljava/lang/String;Ljava/lang/String;I)V +HSPLkotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;)V HSPLkotlin/jvm/internal/Intrinsics;->checkNotNull(Ljava/lang/Object;Ljava/lang/String;)V HSPLkotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V @@ -13531,6 +13424,19 @@ HSPLkotlin/properties/ObservableProperty;->(Ljava/lang/Object;)V HSPLkotlin/properties/ObservableProperty;->afterChange(Lkotlin/reflect/KProperty;Ljava/lang/Object;Ljava/lang/Object;)V HSPLkotlin/properties/ObservableProperty;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; HSPLkotlin/properties/ObservableProperty;->setValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V +HSPLkotlin/random/AbstractPlatformRandom;->()V +HSPLkotlin/random/AbstractPlatformRandom;->nextInt(I)I +HSPLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->()V +HSPLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->initialValue()Ljava/lang/Object; +HSPLkotlin/random/FallbackThreadLocalRandom$implStorage$1;->initialValue()Ljava/util/Random; +HSPLkotlin/random/FallbackThreadLocalRandom;->()V +HSPLkotlin/random/FallbackThreadLocalRandom;->getImpl()Ljava/util/Random; +HSPLkotlin/random/Random$Default;->()V +HSPLkotlin/random/Random$Default;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLkotlin/random/Random$Default;->nextInt(I)I +HSPLkotlin/random/Random;->()V +HSPLkotlin/random/Random;->()V +HSPLkotlin/random/Random;->access$getDefaultRandom$cp()Lkotlin/random/Random; HSPLkotlin/ranges/IntProgression$Companion;->()V HSPLkotlin/ranges/IntProgression$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLkotlin/ranges/IntProgression;->()V @@ -14966,6 +14872,7 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type;->getNumber()I HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type;->valueOf(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value$Type; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->()V +HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$Builder;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Argument$Value;->(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$Builder;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V @@ -15032,6 +14939,7 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->merg HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->mergeFrom(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder;->setId(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation$Builder; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->()V +HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$Builder;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Annotation;->(Lkotlin/reflect/jvm/internal/impl/protobuf/GeneratedMessageLite$Builder;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V @@ -15154,7 +15062,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getOldFlags()I HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getReceiverType()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getReturnType()Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getReturnTypeId()I -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getSerializedSize()I HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getTypeParameter(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$TypeParameter; HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getTypeParameterCount()I HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->getTypeParameterList()Ljava/util/List; @@ -15171,7 +15078,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->hasReturnType( HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->hasReturnTypeId()Z HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->hasTypeTable()Z HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->initFields()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;->writeTo(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedOutputStream;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind$1;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$MemberKind;->(Ljava/lang/String;III)V @@ -15317,7 +15223,6 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;->initField HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;->isInitialized()Z HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument;->writeTo(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedOutputStream;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->()V -HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/ExtensionRegistryLite;Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$1;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->(Z)V HSPLkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type;->getArgument(I)Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Type$Argument; @@ -15639,6 +15544,7 @@ HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolve HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->()V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->([Ljava/lang/String;Ljava/util/Set;Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->getQualifiedClassName(I)Ljava/lang/String; +HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->getString(I)Ljava/lang/String; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverBase;->isLocalClassName(I)Z HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmNameResolverKt;->toExpandedRecordsList(Ljava/util/List;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/metadata/jvm/deserialization/JvmProtoBufUtil;->()V @@ -15807,6 +15713,7 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readBytes()Lkot HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readDouble()D HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readEnum()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readFloat()F +HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readInt32()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawByte()B HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawLittleEndian32()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;->readRawLittleEndian64()J @@ -15866,8 +15773,10 @@ HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->getField(Lkotlin/reflec HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->getSerializedSize()I HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->getWireFormatForFieldType(Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;Z)I HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->hasField(Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet$FieldDescriptorLite;)Z +HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->isInitialized()Z HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->isInitialized(Ljava/util/Map$Entry;)Z HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->iterator()Ljava/util/Iterator; +HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->makeImmutable()V HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->newFieldSet()Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet; HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->readPrimitiveField(Lkotlin/reflect/jvm/internal/impl/protobuf/CodedInputStream;Lkotlin/reflect/jvm/internal/impl/protobuf/WireFormat$FieldType;Z)Ljava/lang/Object; HSPLkotlin/reflect/jvm/internal/impl/protobuf/FieldSet;->setField(Lkotlin/reflect/jvm/internal/impl/protobuf/FieldSet$FieldDescriptorLite;Ljava/lang/Object;)V @@ -16393,7 +16302,6 @@ HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/Deserializati HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getSkipMetadataVersionCheck()Z HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getSkipPrereleaseCheck()Z HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationConfiguration$Default;->getTypeAliasesAllowed()Z -HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedContainerSource;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/TypeDeserializer;Ljava/util/List;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->childContext$default(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;ILjava/lang/Object;)Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->childContext(Lkotlin/reflect/jvm/internal/impl/descriptors/DeclarationDescriptor;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/TypeTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/VersionRequirementTable;Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/BinaryVersion;)Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationContext;->getComponents()Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/DeserializationComponents; @@ -16447,8 +16355,8 @@ HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeseria HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->getReceiverParameterAnnotations(Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotatedCallableKind;)Lkotlin/reflect/jvm/internal/impl/descriptors/annotations/Annotations; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->initializeWithCoroutinesExperimentalityStatus(Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/descriptors/DeserializedSimpleFunctionDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Lkotlin/reflect/jvm/internal/impl/descriptors/ReceiverParameterDescriptor;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/types/KotlinType;Lkotlin/reflect/jvm/internal/impl/descriptors/Modality;Lkotlin/reflect/jvm/internal/impl/descriptors/DescriptorVisibility;Ljava/util/Map;)V HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadConstructor(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Constructor;Z)Lkotlin/reflect/jvm/internal/impl/descriptors/ClassConstructorDescriptor; +HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadFunction(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Function;)Lkotlin/reflect/jvm/internal/impl/descriptors/SimpleFunctionDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadOldFlags(I)I -HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->loadProperty(Lkotlin/reflect/jvm/internal/impl/metadata/ProtoBuf$Property;)Lkotlin/reflect/jvm/internal/impl/descriptors/PropertyDescriptor; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/MemberDeserializer;->valueParameters(Ljava/util/List;Lkotlin/reflect/jvm/internal/impl/protobuf/MessageLite;Lkotlin/reflect/jvm/internal/impl/serialization/deserialization/AnnotatedCallableKind;)Ljava/util/List; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt;->getClassId(Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;I)Lkotlin/reflect/jvm/internal/impl/name/ClassId; HSPLkotlin/reflect/jvm/internal/impl/serialization/deserialization/NameResolverUtilKt;->getName(Lkotlin/reflect/jvm/internal/impl/metadata/deserialization/NameResolver;I)Lkotlin/reflect/jvm/internal/impl/name/Name; @@ -17087,8 +16995,6 @@ HSPLkotlin/sequences/SequencesKt__SequencesKt;->constrainOnce(Lkotlin/sequences/ HSPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt__SequencesKt;->generateSequence(Lkotlin/jvm/functions/Function0;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->(Ljava/lang/Class;)V -HSPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; -HSPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLkotlin/sequences/SequencesKt___SequencesJvmKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence; HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V HSPLkotlin/sequences/SequencesKt___SequencesKt$filterNotNull$1;->()V @@ -17126,6 +17032,7 @@ HSPLkotlin/text/CharsKt__CharJVMKt;->isWhitespace(C)Z HSPLkotlin/text/Charsets;->()V HSPLkotlin/text/Charsets;->()V HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->(Lkotlin/text/DelimitedRangesSequence;)V +HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->calcNext()V HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->hasNext()Z HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Ljava/lang/Object; HSPLkotlin/text/DelimitedRangesSequence$iterator$1;->next()Lkotlin/ranges/IntRange; @@ -17185,9 +17092,11 @@ HSPLkotlin/text/StringsKt__IndentKt$getIndentFunction$1;->invoke(Ljava/lang/Obje HSPLkotlin/text/StringsKt__IndentKt$getIndentFunction$1;->invoke(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__IndentKt;->getIndentFunction$StringsKt__IndentKt(Ljava/lang/String;)Lkotlin/jvm/functions/Function1; HSPLkotlin/text/StringsKt__IndentKt;->indentWidth$StringsKt__IndentKt(Ljava/lang/String;)I +HSPLkotlin/text/StringsKt__IndentKt;->replaceIndent(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__IndentKt;->trimIndent(Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;)Ljava/lang/Long; HSPLkotlin/text/StringsKt__StringNumberConversionsKt;->toLongOrNull(Ljava/lang/String;I)Ljava/lang/Long; +HSPLkotlin/text/StringsKt__StringsJVMKt;->isBlank(Ljava/lang/CharSequence;)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->regionMatches(Ljava/lang/String;ILjava/lang/String;IIZ)Z HSPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;CCZILjava/lang/Object;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsJVMKt;->replace$default(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String; @@ -17206,6 +17115,7 @@ HSPLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence; HSPLkotlin/text/StringsKt__StringsKt;->contains$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;CZ)Z HSPLkotlin/text/StringsKt__StringsKt;->contains(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z +HSPLkotlin/text/StringsKt__StringsKt;->findAnyOf$StringsKt__StringsKt(Ljava/lang/CharSequence;Ljava/util/Collection;IZZ)Lkotlin/Pair; HSPLkotlin/text/StringsKt__StringsKt;->getIndices(Ljava/lang/CharSequence;)Lkotlin/ranges/IntRange; HSPLkotlin/text/StringsKt__StringsKt;->getLastIndex(Ljava/lang/CharSequence;)I HSPLkotlin/text/StringsKt__StringsKt;->indexOf$default(Ljava/lang/CharSequence;CIZILjava/lang/Object;)I @@ -17227,7 +17137,6 @@ HSPLkotlin/text/StringsKt__StringsKt;->splitToSequence$default(Ljava/lang/CharSe HSPLkotlin/text/StringsKt__StringsKt;->splitToSequence(Ljava/lang/CharSequence;[Ljava/lang/String;ZI)Lkotlin/sequences/Sequence; HSPLkotlin/text/StringsKt__StringsKt;->startsWith$default(Ljava/lang/CharSequence;Ljava/lang/CharSequence;ZILjava/lang/Object;)Z HSPLkotlin/text/StringsKt__StringsKt;->startsWith(Ljava/lang/CharSequence;Ljava/lang/CharSequence;Z)Z -HSPLkotlin/text/StringsKt__StringsKt;->substring(Ljava/lang/CharSequence;Lkotlin/ranges/IntRange;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringAfter(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->substringBeforeLast(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLkotlin/text/StringsKt__StringsKt;->trim(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; @@ -17334,6 +17243,7 @@ HSPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow$default(IILkotlinx/ HSPLkotlinx/coroutines/flow/SharedFlowKt;->MutableSharedFlow(IILkotlinx/coroutines/channels/BufferOverflow;)Lkotlinx/coroutines/flow/MutableSharedFlow; HSPLkotlinx/coroutines/flow/SharedFlowKt;->access$setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V HSPLkotlinx/coroutines/flow/SharedFlowKt;->setBufferAt([Ljava/lang/Object;JLjava/lang/Object;)V +HSPLkotlinx/coroutines/flow/StateFlowImpl;->()V HSPLkotlinx/coroutines/flow/StateFlowImpl;->(Ljava/lang/Object;)V HSPLkotlinx/coroutines/flow/StateFlowImpl;->getValue()Ljava/lang/Object; HSPLkotlinx/coroutines/flow/StateFlowImpl;->setValue(Ljava/lang/Object;)V @@ -17348,46 +17258,6 @@ HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlow;->getSlots()[Lkotlinx/co HSPLkotlinx/coroutines/flow/internal/AbstractSharedFlowKt;->()V HSPLkotlinx/coroutines/flow/internal/NullSurrogateKt;->()V HSPLkotlinx/coroutines/internal/Symbol;->(Ljava/lang/String;)V -HSPLme/leolin/shortcutbadger/ShortcutBadgeException;->(Ljava/lang/String;)V -HSPLme/leolin/shortcutbadger/ShortcutBadgeException;->(Ljava/lang/String;Ljava/lang/Exception;)V -HSPLme/leolin/shortcutbadger/ShortcutBadger;->()V -HSPLme/leolin/shortcutbadger/ShortcutBadger;->applyCount(Landroid/content/Context;I)Z -HSPLme/leolin/shortcutbadger/ShortcutBadger;->applyCountOrThrow(Landroid/content/Context;I)V -HSPLme/leolin/shortcutbadger/ShortcutBadger;->initBadger(Landroid/content/Context;)Z -HSPLme/leolin/shortcutbadger/ShortcutBadger;->removeCount(Landroid/content/Context;)Z -HSPLme/leolin/shortcutbadger/impl/AdwHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/AdwHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/ApexHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/ApexHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/AsusHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/AsusHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/DefaultBadger;->()V -HSPLme/leolin/shortcutbadger/impl/DefaultBadger;->executeBadge(Landroid/content/Context;Landroid/content/ComponentName;I)V -HSPLme/leolin/shortcutbadger/impl/DefaultBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/EverythingMeHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/EverythingMeHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/HuaweiHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/HuaweiHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/NewHtcHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/NewHtcHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/NovaHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/NovaHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/OPPOHomeBader;->()V -HSPLme/leolin/shortcutbadger/impl/OPPOHomeBader;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/SamsungHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/SamsungHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/SamsungHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/SonyHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/SonyHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/VivoHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/VivoHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/ZTEHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/ZTEHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/impl/ZukHomeBadger;->()V -HSPLme/leolin/shortcutbadger/impl/ZukHomeBadger;->getSupportLaunchers()Ljava/util/List; -HSPLme/leolin/shortcutbadger/util/BroadcastHelper;->resolveBroadcast(Landroid/content/Context;Landroid/content/Intent;)Ljava/util/List; -HSPLme/leolin/shortcutbadger/util/BroadcastHelper;->sendDefaultIntentExplicitly(Landroid/content/Context;Landroid/content/Intent;)V -HSPLme/leolin/shortcutbadger/util/BroadcastHelper;->sendIntentExplicitly(Landroid/content/Context;Landroid/content/Intent;)V HSPLnet/zetetic/database/DatabaseUtils;->()V HSPLnet/zetetic/database/DatabaseUtils;->cursorPickFillWindowStartPosition(II)I HSPLnet/zetetic/database/DatabaseUtils;->getSqlStatementType(Ljava/lang/String;)I @@ -17403,6 +17273,7 @@ HSPLnet/zetetic/database/sqlcipher/CloseGuard;->open(Ljava/lang/String;)V HSPLnet/zetetic/database/sqlcipher/SQLiteClosable;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteClosable;->acquireReference()V HSPLnet/zetetic/database/sqlcipher/SQLiteClosable;->close()V +HSPLnet/zetetic/database/sqlcipher/SQLiteClosable;->releaseReference()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection$Operation;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection$Operation;->(Lnet/zetetic/database/sqlcipher/SQLiteConnection$1;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection$OperationLog;->()V @@ -17430,6 +17301,7 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->canonicalizeSyncMode(Ljava HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->detachCancellationSignal(Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)I +HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZLandroid/os/CancellationSignal;)I HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J HSPLnet/zetetic/database/sqlcipher/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String; @@ -17512,11 +17384,13 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->executeSql(Ljava/lang/String HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->findEditTable(Ljava/lang/String;)Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getPath()Ljava/lang/String; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getThreadSession()Lnet/zetetic/database/sqlcipher/SQLiteSession; HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->getVersion()I HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->hasCodec()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->inTransaction()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insert(Ljava/lang/String;ILandroid/content/ContentValues;)J HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J +HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isMainThread()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isOpen()Z HSPLnet/zetetic/database/sqlcipher/SQLiteDatabase;->isReadOnly()Z @@ -17567,7 +17441,7 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteOpenHelper;->getReadableDatabase()Lnet/ HSPLnet/zetetic/database/sqlcipher/SQLiteOpenHelper;->getWritableDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLnet/zetetic/database/sqlcipher/SQLiteOpenHelper;->onConfigure(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->()V -HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bind(ILjava/lang/Object;)V +HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bindAllArgs([Ljava/lang/Object;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->bindString(ILjava/lang/String;)V @@ -17577,7 +17451,6 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getColumnNames()[Ljava/lang/S HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getDatabase()Lnet/zetetic/database/sqlcipher/SQLiteDatabase; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSession()Lnet/zetetic/database/sqlcipher/SQLiteSession; HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->getSql()Ljava/lang/String; -HSPLnet/zetetic/database/sqlcipher/SQLiteProgram;->onAllReferencesReleased()V HSPLnet/zetetic/database/sqlcipher/SQLiteQuery;->(Lnet/zetetic/database/sqlcipher/SQLiteDatabase;Ljava/lang/String;Landroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteQuery;->fillWindow(Landroid/database/CursorWindow;IIZ)I HSPLnet/zetetic/database/sqlcipher/SQLiteQueryBuilder;->()V @@ -17588,6 +17461,7 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteSession$Transaction;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession$Transaction;->(Lnet/zetetic/database/sqlcipher/SQLiteSession$1;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->(Lnet/zetetic/database/sqlcipher/SQLiteConnectionPool;)V +HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->beginTransaction(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->beginTransactionUnchecked(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->endTransaction(Landroid/os/CancellationSignal;)V @@ -17598,7 +17472,9 @@ HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->executeForLong(Ljava/lang/Str HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Z HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->hasTransaction()Z HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->obtainTransaction(ILnet/zetetic/database/sqlcipher/SQLiteTransactionListener;)Lnet/zetetic/database/sqlcipher/SQLiteSession$Transaction; +HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->prepare(Ljava/lang/String;ILandroid/os/CancellationSignal;Lnet/zetetic/database/sqlcipher/SQLiteStatementInfo;)V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->recycleTransaction(Lnet/zetetic/database/sqlcipher/SQLiteSession$Transaction;)V +HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->releaseConnection()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->setTransactionSuccessful()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->throwIfNoTransaction()V HSPLnet/zetetic/database/sqlcipher/SQLiteSession;->throwIfTransactionMarkedSuccessful()V @@ -17852,6 +17728,8 @@ HSPLokhttp3/RealCall$AsyncCall;->()V HSPLokhttp3/RealCall$AsyncCall;->(Lokhttp3/RealCall;Lokhttp3/Callback;)V HSPLokhttp3/RealCall$AsyncCall;->execute()V HSPLokhttp3/RealCall$AsyncCall;->executeOn(Ljava/util/concurrent/ExecutorService;)V +HSPLokhttp3/RealCall$AsyncCall;->get()Lokhttp3/RealCall; +HSPLokhttp3/RealCall$AsyncCall;->host()Ljava/lang/String; HSPLokhttp3/RealCall;->(Lokhttp3/OkHttpClient;Lokhttp3/Request;Z)V HSPLokhttp3/RealCall;->captureCallStackTrace()V HSPLokhttp3/RealCall;->enqueue(Lokhttp3/Callback;)V @@ -18175,10 +18053,10 @@ HSPLokio/Buffer$UnsafeCursor;->()V HSPLokio/Buffer;->()V HSPLokio/Buffer;->clear()V HSPLokio/Buffer;->close()V -HSPLokio/Buffer;->completeSegmentByteCount()J HSPLokio/Buffer;->copyTo(Lokio/Buffer;JJ)Lokio/Buffer; HSPLokio/Buffer;->exhausted()Z HSPLokio/Buffer;->getByte(J)B +HSPLokio/Buffer;->indexOf(BJJ)J HSPLokio/Buffer;->indexOfElement(Lokio/ByteString;J)J HSPLokio/Buffer;->read(Lokio/Buffer;J)J HSPLokio/Buffer;->read([BII)I @@ -18197,6 +18075,8 @@ HSPLokio/Buffer;->readUtf8(J)Ljava/lang/String; HSPLokio/Buffer;->setSize$okio(J)V HSPLokio/Buffer;->size()J HSPLokio/Buffer;->skip(J)V +HSPLokio/Buffer;->writableSegment$okio(I)Lokio/Segment; +HSPLokio/Buffer;->write(Lokio/Buffer;J)V HSPLokio/Buffer;->write([B)Lokio/Buffer; HSPLokio/Buffer;->write([BII)Lokio/Buffer; HSPLokio/Buffer;->writeAll(Lokio/Source;)J @@ -18291,7 +18171,6 @@ HSPLokio/Options;->of([Lokio/ByteString;)Lokio/Options; HSPLokio/OutputStreamSink;->(Ljava/io/OutputStream;Lokio/Timeout;)V HSPLokio/OutputStreamSink;->close()V HSPLokio/OutputStreamSink;->flush()V -HSPLokio/OutputStreamSink;->write(Lokio/Buffer;J)V HSPLokio/PeekSource;->(Lokio/BufferedSource;)V HSPLokio/PeekSource;->read(Lokio/Buffer;J)J HSPLokio/RealBufferedSink;->(Lokio/Sink;)V @@ -18501,6 +18380,7 @@ HSPLorg/conscrypt/ConscryptEngine;->singleDstBuffer(Ljava/nio/ByteBuffer;)[Ljava HSPLorg/conscrypt/ConscryptEngine;->singleSrcBuffer(Ljava/nio/ByteBuffer;)[Ljava/nio/ByteBuffer; HSPLorg/conscrypt/ConscryptEngine;->transitionTo(I)V HSPLorg/conscrypt/ConscryptEngine;->unwrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult; +HSPLorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;II[Ljava/nio/ByteBuffer;II)Ljavax/net/ssl/SSLEngineResult; HSPLorg/conscrypt/ConscryptEngine;->unwrap([Ljava/nio/ByteBuffer;[Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult; HSPLorg/conscrypt/ConscryptEngine;->verifyCertificateChain([[BLjava/lang/String;)V HSPLorg/conscrypt/ConscryptEngine;->wrap(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Ljavax/net/ssl/SSLEngineResult; @@ -18519,7 +18399,6 @@ HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->(Lorg/conscrypt/C HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->access$100(Lorg/conscrypt/ConscryptEngineSocket$SSLInputStream;[BII)I HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->init()V HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->isHandshaking(Ljavax/net/ssl/SSLEngineResult$HandshakeStatus;)Z -HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->processDataFromSocket([BII)I HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->read([BII)I HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->readFromSocket()I HSPLorg/conscrypt/ConscryptEngineSocket$SSLInputStream;->readUntilDataAvailable([BII)I @@ -18702,6 +18581,7 @@ HSPLorg/conscrypt/OpenSSLCipher;->checkAndSetEncodedKey(ILjava/security/Key;)[B HSPLorg/conscrypt/OpenSSLCipher;->engineDoFinal([BII)[B HSPLorg/conscrypt/OpenSSLCipher;->engineDoFinal([BII[BI)I HSPLorg/conscrypt/OpenSSLCipher;->engineGetIV()[B +HSPLorg/conscrypt/OpenSSLCipher;->engineGetOutputSize(I)I HSPLorg/conscrypt/OpenSSLCipher;->engineInit(ILjava/security/Key;Ljava/security/SecureRandom;)V HSPLorg/conscrypt/OpenSSLCipher;->engineInit(ILjava/security/Key;Ljava/security/spec/AlgorithmParameterSpec;Ljava/security/SecureRandom;)V HSPLorg/conscrypt/OpenSSLCipher;->engineUpdate([BII)[B @@ -19094,7 +18974,6 @@ HSPLorg/signal/core/util/OptionalExtensionsKt;->orNull(Lj$/util/Optional;)Ljava/ HSPLorg/signal/core/util/OptionalExtensionsKt;->toOptional(Ljava/lang/Object;)Lj$/util/Optional; HSPLorg/signal/core/util/PendingIntentFlags;->()V HSPLorg/signal/core/util/PendingIntentFlags;->()V -HSPLorg/signal/core/util/PendingIntentFlags;->cancelCurrent()I HSPLorg/signal/core/util/PendingIntentFlags;->immutable()I HSPLorg/signal/core/util/PendingIntentFlags;->mutable()I HSPLorg/signal/core/util/PendingIntentFlags;->updateCurrent()I @@ -19178,7 +19057,6 @@ HSPLorg/signal/core/util/StreamUtil;->copy(Ljava/io/InputStream;Ljava/io/OutputS HSPLorg/signal/core/util/StringExtensionsKt;->nullIfBlank(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringExtensionsKt;->toSingleLine(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringUtil;->()V -HSPLorg/signal/core/util/StringUtil;->forceLtr(Ljava/lang/CharSequence;)Ljava/lang/String; HSPLorg/signal/core/util/StringUtil;->isEmpty(Ljava/lang/String;)Z HSPLorg/signal/core/util/StringUtil;->isolateBidi(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/StringUtil;->replace(Ljava/lang/CharSequence;CLjava/lang/String;)Ljava/lang/CharSequence; @@ -19228,6 +19106,9 @@ HSPLorg/signal/core/util/concurrent/DeadlockDetector$ExecutorInfo;->hashCode()I HSPLorg/signal/core/util/concurrent/DeadlockDetector;->()V HSPLorg/signal/core/util/concurrent/DeadlockDetector;->(Landroid/os/Handler;J)V HSPLorg/signal/core/util/concurrent/DeadlockDetector;->start()V +HSPLorg/signal/core/util/concurrent/FutureMapTransformer;->(Lorg/signal/core/util/concurrent/ListenableFuture;Lorg/signal/core/util/concurrent/FutureTransformers$Transformer;)V +HSPLorg/signal/core/util/concurrent/FutureMapTransformer;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; +HSPLorg/signal/core/util/concurrent/FutureTransformers;->map(Lorg/signal/core/util/concurrent/ListenableFuture;Lorg/signal/core/util/concurrent/FutureTransformers$Transformer;)Lorg/signal/core/util/concurrent/ListenableFuture; HSPLorg/signal/core/util/concurrent/LatestPrioritizedSerialExecutor;->(Ljava/util/concurrent/Executor;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->()V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->add(Lio/reactivex/rxjava3/disposables/Disposable;)Lorg/signal/core/util/concurrent/LifecycleDisposable; @@ -19237,16 +19118,8 @@ HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onCreate(Landroidx/lif HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposable;->plusAssign(Lio/reactivex/rxjava3/disposables/Disposable;)V HSPLorg/signal/core/util/concurrent/LifecycleDisposableKt;->addTo(Lio/reactivex/rxjava3/disposables/Disposable;Lorg/signal/core/util/concurrent/LifecycleDisposable;)Lio/reactivex/rxjava3/disposables/Disposable; -HSPLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->subscribe(Lio/reactivex/rxjava3/core/MaybeEmitter;)V -HSPLorg/signal/core/util/concurrent/MaybeCompat;->$r8$lambda$aPKBr0JUhvb1CVWSMT6CNAHU584(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V -HSPLorg/signal/core/util/concurrent/MaybeCompat;->()V -HSPLorg/signal/core/util/concurrent/MaybeCompat;->()V -HSPLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable$lambda$0(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V -HSPLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable(Lkotlin/jvm/functions/Function0;)Lio/reactivex/rxjava3/core/Maybe; HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->(Ljava/lang/Object;)V HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1;->invoke(Ljava/lang/Object;)V @@ -19254,6 +19127,13 @@ HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$2;-> HSPLorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$3;->(Ljava/lang/Object;)V HSPLorg/signal/core/util/concurrent/RxExtensions;->safeBlockingGet(Lio/reactivex/rxjava3/core/Single;)Ljava/lang/Object; HSPLorg/signal/core/util/concurrent/RxExtensions;->subscribeWithSubject(Lio/reactivex/rxjava3/core/Observable;Lio/reactivex/rxjava3/subjects/Subject;Lio/reactivex/rxjava3/disposables/CompositeDisposable;)Lio/reactivex/rxjava3/subjects/Subject; +HSPLorg/signal/core/util/concurrent/SettableFuture;->()V +HSPLorg/signal/core/util/concurrent/SettableFuture;->(Ljava/lang/Object;)V +HSPLorg/signal/core/util/concurrent/SettableFuture;->get()Ljava/lang/Object; +HSPLorg/signal/core/util/concurrent/SettableFuture;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; +HSPLorg/signal/core/util/concurrent/SettableFuture;->notifyAllListeners()V +HSPLorg/signal/core/util/concurrent/SettableFuture;->set(Ljava/lang/Object;)Z +HSPLorg/signal/core/util/concurrent/SettableFuture;->setException(Ljava/lang/Throwable;)Z HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->()V HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0;->rejectedExecution(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V HSPLorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1;->(Ljava/lang/String;I)V @@ -19307,8 +19187,6 @@ HSPLorg/signal/core/util/logging/CompoundLogger;->flush()V HSPLorg/signal/core/util/logging/CompoundLogger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/CompoundLogger;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/Log$Logger;->()V -HSPLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;)V -HSPLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V HSPLorg/signal/core/util/logging/Log;->()V HSPLorg/signal/core/util/logging/Log;->()V HSPLorg/signal/core/util/logging/Log;->blockUntilAllWritesFinished()V @@ -19320,7 +19198,6 @@ HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;Lja HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;Z)V HSPLorg/signal/core/util/logging/Log;->i(Ljava/lang/String;Ljava/lang/String;Z)V HSPLorg/signal/core/util/logging/Log;->initialize(Lorg/signal/core/util/logging/Log$InternalCheck;[Lorg/signal/core/util/logging/Log$Logger;)V -HSPLorg/signal/core/util/logging/Log;->internal()Lorg/signal/core/util/logging/Log$Logger; HSPLorg/signal/core/util/logging/Log;->tag(Ljava/lang/Class;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Log;->w(Ljava/lang/String;Ljava/lang/String;)V HSPLorg/signal/core/util/logging/Log;->w(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V @@ -19366,6 +19243,7 @@ HSPLorg/signal/core/util/logging/Scrubber;->access$getTOP_100_TLDS$p()Ljava/util HSPLorg/signal/core/util/logging/Scrubber;->access$hash(Lorg/signal/core/util/logging/Scrubber;Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Scrubber;->hash(Ljava/lang/String;)Ljava/lang/String; HSPLorg/signal/core/util/logging/Scrubber;->scrub(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; +HSPLorg/signal/core/util/logging/Scrubber;->scrub(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Lkotlin/jvm/functions/Function2;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubCallLinkKeys(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubDomains(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLorg/signal/core/util/logging/Scrubber;->scrubE164(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; @@ -19390,6 +19268,7 @@ HSPLorg/signal/core/util/tracing/DebugAnnotation;->()V HSPLorg/signal/core/util/tracing/DebugAnnotation;->(Ljava/lang/Long;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Double;Ljava/lang/String;Ljava/lang/Long;Lorg/signal/core/util/tracing/DebugAnnotation$NestedValue;Lokio/ByteString;)V HSPLorg/signal/core/util/tracing/DebugAnnotation;->equals(Ljava/lang/Object;)Z HSPLorg/signal/core/util/tracing/TracePacket$Builder;->()V +HSPLorg/signal/core/util/tracing/TracePacket$Builder;->build()Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/TracePacket$Builder;->synchronization_marker(Lokio/ByteString;)Lorg/signal/core/util/tracing/TracePacket$Builder; HSPLorg/signal/core/util/tracing/TracePacket$Builder;->timestamp(Ljava/lang/Long;)Lorg/signal/core/util/tracing/TracePacket$Builder; HSPLorg/signal/core/util/tracing/TracePacket$Builder;->track_descriptor(Lorg/signal/core/util/tracing/TrackDescriptor;)Lorg/signal/core/util/tracing/TracePacket$Builder; @@ -19405,6 +19284,8 @@ HSPLorg/signal/core/util/tracing/Tracer$$ExternalSyntheticLambda0;->getTimeNanos HSPLorg/signal/core/util/tracing/Tracer;->()V HSPLorg/signal/core/util/tracing/Tracer;->()V HSPLorg/signal/core/util/tracing/Tracer;->addPacket(Lorg/signal/core/util/tracing/TracePacket;)V +HSPLorg/signal/core/util/tracing/Tracer;->debugAnnotation(Ljava/lang/String;Ljava/lang/String;)Lorg/signal/core/util/tracing/DebugAnnotation; +HSPLorg/signal/core/util/tracing/Tracer;->end(Ljava/lang/String;J)V HSPLorg/signal/core/util/tracing/Tracer;->forMethodEnd(Ljava/lang/String;JJ)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->forMethodStart(Ljava/lang/String;JJLjava/util/Map;)Lorg/signal/core/util/tracing/TracePacket; HSPLorg/signal/core/util/tracing/Tracer;->forSynchronization(J)Lorg/signal/core/util/tracing/TracePacket; @@ -19413,8 +19294,8 @@ HSPLorg/signal/core/util/tracing/Tracer;->forTrackId(J)Lorg/signal/core/util/tra HSPLorg/signal/core/util/tracing/Tracer;->getInstance()Lorg/signal/core/util/tracing/Tracer; HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;)V HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)V +HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;JLjava/util/Map;)V HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V -HSPLorg/signal/core/util/tracing/Tracer;->start(Ljava/lang/String;Ljava/util/Map;)V HSPLorg/signal/core/util/tracing/Tracer;->toByteArray(Ljava/util/UUID;)[B HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->()V HSPLorg/signal/core/util/tracing/TrackDescriptor$Builder;->build()Lorg/signal/core/util/tracing/TrackDescriptor; @@ -19748,7 +19629,6 @@ HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda57;->r HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda58;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->()V -HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->isInternal()Z HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda5;->run()V HSPLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda60;->(Lorg/thoughtcrime/securesms/ApplicationContext;)V @@ -19980,16 +19860,6 @@ HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->()V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;[B[BILjava/lang/String;ZZZIIJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;)V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->(Ljava/lang/String;IJLjava/lang/String;ILjava/lang/String;Ljava/lang/String;[B[BILjava/lang/String;ZZZIIJLjava/lang/String;Lorg/thoughtcrime/securesms/stickers/StickerLocator;Lorg/thoughtcrime/securesms/blurhash/BlurHash;Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/attachments/PointerAttachment;->getUri()Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/audio/AudioRecorder;)V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorder;->()V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorder;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->()V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager26;->(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->()V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; HSPLorg/thoughtcrime/securesms/avatar/Avatar$Companion;->()V HSPLorg/thoughtcrime/securesms/avatar/Avatar$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId$DoNotPersist;->()V @@ -20056,31 +19926,23 @@ HSPLorg/thoughtcrime/securesms/avatar/TextAvatarDrawable;->getStartX(Landroid/te HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView$WhenMappings;->()V HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->()V HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->displayChatAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V +HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->displayChatAvatar(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->hideStoryRing()V HSPLorg/thoughtcrime/securesms/avatar/view/AvatarView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->()V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->clearDrawable()V -HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->getGlideRequests()Lorg/thoughtcrime/securesms/mms/GlideRequests; -HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadge(Lorg/thoughtcrime/securesms/badges/models/Badge;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->getGlideRequestManager()Lcom/bumptech/glide/RequestManager; +HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadge(Lorg/thoughtcrime/securesms/badges/models/Badge;Lcom/bumptech/glide/RequestManager;)V HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadgeFromRecipient(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadgeFromRecipient(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/badges/BadgeImageView;->setBadgeFromRecipient(Lorg/thoughtcrime/securesms/recipients/Recipient;Lcom/bumptech/glide/RequestManager;)V HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->()V HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$4;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$notAnimated$1;->invoke(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGift;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->()V HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map; -HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getMessageIdsOpenedThisSession$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/blurhash/Base83;->()V HSPLorg/thoughtcrime/securesms/blurhash/Base83;->isValid(Ljava/lang/String;)Z @@ -20089,10 +19951,10 @@ HSPLorg/thoughtcrime/securesms/blurhash/BlurHash;->()V HSPLorg/thoughtcrime/securesms/blurhash/BlurHash;->parseOrNull(Ljava/lang/String;)Lorg/thoughtcrime/securesms/blurhash/BlurHash; HSPLorg/thoughtcrime/securesms/blurhash/BlurHashModelLoader$Factory;->()V HSPLorg/thoughtcrime/securesms/blurhash/BlurHashResourceDecoder;->()V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/components/AlbumThumbnailView;)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCorners()V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCornersForSizeClass2()V @@ -20103,11 +19965,11 @@ HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCellBackground HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRadii(IIII)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRelativeRadii(Lorg/thoughtcrime/securesms/components/ThumbnailView;IIII)V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlide(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;IZ)V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlides(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;Z)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlide(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;IZ)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlides(Lcom/bumptech/glide/RequestManager;Ljava/util/List;Z)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V -HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->showSlides(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;)V +HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->showSlides(Lcom/bumptech/glide/RequestManager;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->sizeClass(I)I HSPLorg/thoughtcrime/securesms/components/AlertView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/AlertView;->initialize()V @@ -20116,7 +19978,6 @@ HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->(Landroid/cont HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/AnimatingToggle;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AudioView;)V -HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/AudioView;)V HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/components/AudioView;I)V HSPLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda4;->run()V @@ -20124,21 +19985,12 @@ HSPLorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener;->< HSPLorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/AudioView$PlayPauseClickedListener-IA;)V HSPLorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;)V HSPLorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener;->(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/AudioView$SeekBarModifiedListener-IA;)V -HSPLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$70S_ChWvvHg6uKYhRw5m0jX0OG0(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V HSPLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$ttH02xbblnAnQbQdy9cXzPNafwQ(Lorg/thoughtcrime/securesms/components/AudioView;I)V HSPLorg/thoughtcrime/securesms/components/AudioView;->()V HSPLorg/thoughtcrime/securesms/components/AudioView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/AudioView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLorg/thoughtcrime/securesms/components/AudioView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; -HSPLorg/thoughtcrime/securesms/components/AudioView;->hasAudioUri()Z -HSPLorg/thoughtcrime/securesms/components/AudioView;->isTarget(Landroid/net/Uri;)Z HSPLorg/thoughtcrime/securesms/components/AudioView;->lambda$setTint$3(I)V HSPLorg/thoughtcrime/securesms/components/AudioView;->onAttachedToWindow()V -HSPLorg/thoughtcrime/securesms/components/AudioView;->onDuration(Landroid/net/Uri;J)V -HSPLorg/thoughtcrime/securesms/components/AudioView;->onPlaybackState(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V -HSPLorg/thoughtcrime/securesms/components/AudioView;->onProgress(Landroid/net/Uri;DJ)V -HSPLorg/thoughtcrime/securesms/components/AudioView;->onSpeedChanged(Landroid/net/Uri;F)V -HSPLorg/thoughtcrime/securesms/components/AudioView;->onStart(Landroid/net/Uri;ZZ)V HSPLorg/thoughtcrime/securesms/components/AudioView;->setProgressAndPlayBackgroundTint(I)V HSPLorg/thoughtcrime/securesms/components/AudioView;->setTint(I)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/AvatarImageView;Lorg/thoughtcrime/securesms/recipients/Recipient;)V @@ -20164,16 +20016,12 @@ HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->()V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->disableQuickContact()V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->initialize(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions;)V -HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V -HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;ZZ)V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/components/AvatarImageView$AvatarOptions;)V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V +HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatar(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/recipients/Recipient;ZZ)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setAvatarClickHandler(Lorg/thoughtcrime/securesms/recipients/Recipient;Z)V -HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setFallbackPhotoProvider(Lorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;)V HSPLorg/thoughtcrime/securesms/components/AvatarImageView;->setOnClickListener(Landroid/view/View$OnClickListener;)V HSPLorg/thoughtcrime/securesms/components/ComposeText$1;->(Lorg/thoughtcrime/securesms/components/ComposeText;)V -HSPLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->()V -HSPLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V -HSPLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;Lorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener-IA;)V HSPLorg/thoughtcrime/securesms/components/ComposeText$QueryStart;->(IZ)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->()V HSPLorg/thoughtcrime/securesms/components/ComposeText;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -20186,18 +20034,13 @@ HSPLorg/thoughtcrime/securesms/components/ComposeText;->findQueryStart(Ljava/lan HSPLorg/thoughtcrime/securesms/components/ComposeText;->findQueryStart(Ljava/lang/CharSequence;IZ)Lorg/thoughtcrime/securesms/components/ComposeText$QueryStart; HSPLorg/thoughtcrime/securesms/components/ComposeText;->initialize()V HSPLorg/thoughtcrime/securesms/components/ComposeText;->isLandscape()Z -HSPLorg/thoughtcrime/securesms/components/ComposeText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLorg/thoughtcrime/securesms/components/ComposeText;->onDraw(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->onMeasure(II)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->onSelectionChanged(II)V -HSPLorg/thoughtcrime/securesms/components/ComposeText;->setCursorPositionChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$CursorPositionChangedListener;)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->setHint(Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->setHintWithChecks(Ljava/lang/CharSequence;)V -HSPLorg/thoughtcrime/securesms/components/ComposeText;->setInlineQueryChangedListener(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryChangedListener;)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->setMediaListener(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V -HSPLorg/thoughtcrime/securesms/components/ComposeText;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V HSPLorg/thoughtcrime/securesms/components/ComposeText;->setMessageSendType(Lorg/thoughtcrime/securesms/conversation/MessageSendType;)V -HSPLorg/thoughtcrime/securesms/components/ComposeText;->setStylingChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$StylingChangedListener;)V HSPLorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher;->()V HSPLorg/thoughtcrime/securesms/components/ComposeTextStyleWatcher;->()V HSPLorg/thoughtcrime/securesms/components/ConversationItemFooter$$ExternalSyntheticLambda0;->(I)V @@ -20230,7 +20073,6 @@ HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion;-> HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->()V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->getFooter()Lorg/thoughtcrime/securesms/util/views/Stub; HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setBorderless(Z)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V @@ -20238,7 +20080,7 @@ HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setClickab HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setConversationColor(I)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCorners(IIII)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setFocusable(Z)V -HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/List;ZZ)V +HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setImageResource(Lcom/bumptech/glide/RequestManager;Ljava/util/List;ZZ)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMaximumThumbnailHeight(I)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMinimumThumbnailWidth(I)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V @@ -20247,7 +20089,6 @@ HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setStartTr HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailBounds([I)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showShade(Z)V -HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showThumbnailView()V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState$Creator;->()V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->()V HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->(ZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIII)V @@ -20273,14 +20114,11 @@ HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getAl HSPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getThumbnailViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setOnClickListener(Landroid/view/View$OnClickListener;)V HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setUnreadCountBackgroundTint(I)V HSPLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setWallpaperEnabled(Z)V HSPLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->onFinishInflate()V -HSPLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->setEventListener(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar$EventListener;)V HSPLorg/thoughtcrime/securesms/components/CornerMask;->(Landroid/view/View;)V -HSPLorg/thoughtcrime/securesms/components/CornerMask;->mask(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/components/CornerMask;->setRadii(IIII)V HSPLorg/thoughtcrime/securesms/components/CornerMask;->setRadius(I)V HSPLorg/thoughtcrime/securesms/components/CornerMask;->setTopLeftRadius(I)V @@ -20307,10 +20145,7 @@ HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->( HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->addInputListener(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout$Listener;)V HSPLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->setFragmentManager(Landroidx/fragment/app/FragmentManager;)V -HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V -HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V HSPLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/components/InputPanel;)V @@ -20321,13 +20156,10 @@ HSPLorg/thoughtcrime/securesms/components/InputPanel$RecordTime;->(Landroi HSPLorg/thoughtcrime/securesms/components/InputPanel$SlideToCancel;->(Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/components/InputPanel;->()V HSPLorg/thoughtcrime/securesms/components/InputPanel;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/components/InputPanel;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; HSPLorg/thoughtcrime/securesms/components/InputPanel;->onFinishInflate()V HSPLorg/thoughtcrime/securesms/components/InputPanel;->setHideForMessageRequestState(Z)V -HSPLorg/thoughtcrime/securesms/components/InputPanel;->setListener(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V HSPLorg/thoughtcrime/securesms/components/InputPanel;->setMediaKeyboardToggleMode(Lorg/thoughtcrime/securesms/keyboard/KeyboardPage;)V HSPLorg/thoughtcrime/securesms/components/InputPanel;->setMediaListener(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V -HSPLorg/thoughtcrime/securesms/components/InputPanel;->setStickerSuggestions(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/components/InputPanel;->setWallpaperEnabled(Z)V HSPLorg/thoughtcrime/securesms/components/InputPanel;->showMediaKeyboardToggle(Z)V HSPLorg/thoughtcrime/securesms/components/InputPanel;->updateVisibility()V @@ -20356,7 +20188,6 @@ HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->$r8$lambd HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->()V HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->_init_$lambda$0(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat; -HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->addKeyboardStateListener(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardStateListener;)V HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->applyInsets(Landroidx/core/graphics/Insets;Landroidx/core/graphics/Insets;)V HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getKeyboardGuideline()Landroidx/constraintlayout/widget/Guideline; HSPLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->getNavigationBarGuideline()Landroidx/constraintlayout/widget/Guideline; @@ -20386,7 +20217,6 @@ HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->(Landro HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->onFinishInflate()V HSPLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->setHandler(Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V HSPLorg/thoughtcrime/securesms/components/Outliner;->()V -HSPLorg/thoughtcrime/securesms/components/Outliner;->draw(Landroid/graphics/Canvas;IIII)V HSPLorg/thoughtcrime/securesms/components/Outliner;->setColor(I)V HSPLorg/thoughtcrime/securesms/components/Outliner;->setRadii(IIII)V HSPLorg/thoughtcrime/securesms/components/Outliner;->setStrokeWidth(F)V @@ -20423,8 +20253,6 @@ HSPLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2;->()V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$2;->()V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Z HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$4;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$5;->(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;)V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion;->()V @@ -20432,7 +20260,6 @@ HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$Companion;->< HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy;->()V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$DefaultScrollStrategy;->()V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->(IZLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollStrategy;)V -HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->getPosition()I HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->()V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->()V HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1;->apply(JLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest; @@ -20444,8 +20271,6 @@ HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->(Land HSPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->notifyListCommitted()V HSPLorg/thoughtcrime/securesms/components/SendButton;->()V HSPLorg/thoughtcrime/securesms/components/SendButton;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/components/SendButton;->setPopupContainer(Landroid/view/ViewGroup;)V -HSPLorg/thoughtcrime/securesms/components/SendButton;->setScheduledSendListener(Lorg/thoughtcrime/securesms/components/SendButton$ScheduledSendListener;)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport1;->m(Ljava/lang/Object;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport2;->m([Ljava/lang/Object;)Ljava/util/List; @@ -20458,7 +20283,6 @@ HSPLorg/thoughtcrime/securesms/components/ThumbnailView$ThumbnailClickDispatcher HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->()V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->fillTargetDimensions([I[I[I)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->getNonZeroCount([I)I HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->hasSameContents(Lorg/thoughtcrime/securesms/mms/Slide;Lorg/thoughtcrime/securesms/mms/Slide;)Z @@ -20468,8 +20292,8 @@ HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setBounds(IIII)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setClickable(Z)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setFocusable(Z)V -HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;ZZ)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/mms/Slide;ZZII)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;ZZ)Lorg/signal/core/util/concurrent/ListenableFuture; +HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;ZZII)Lorg/signal/core/util/concurrent/ListenableFuture; HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setRadii(IIII)V HSPLorg/thoughtcrime/securesms/components/ThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V @@ -20482,7 +20306,6 @@ HSPLorg/thoughtcrime/securesms/components/TypingIndicatorView;->stopAnimation()V HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->()V HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->()V HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypingThreads()Landroidx/lifecycle/LiveData; -HSPLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypists(J)Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->()V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->()V HSPLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->()V @@ -20508,10 +20331,8 @@ HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText$$ExternalSynthetic HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->$r8$lambda$8pyXdt50o8im33POXP_o4TKoD6U(Lorg/thoughtcrime/securesms/components/emoji/EmojiEditText;Landroid/view/View;Z)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->addOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->appendEmojiFilter([Landroid/text/InputFilter;Z)[Landroid/text/InputFilter; HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->lambda$new$0(Landroid/view/View;Z)V -HSPLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiFilter;->(Landroid/widget/TextView;Z)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -20536,9 +20357,6 @@ HSPLorg/thoughtcrime/securesms/components/emoji/EmojiProvider;->getEmojiDrawable HSPLorg/thoughtcrime/securesms/components/emoji/EmojiSpan;->(Landroid/graphics/drawable/Drawable;Landroid/widget/TextView;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiSpan;->draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiSpan;->getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I -HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V -HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda1;->()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda2;->run()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda3;->(Ljava/lang/Runnable;)V @@ -20558,6 +20376,7 @@ HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->hasMetricAffecti HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isEllipsizedAtEnd()Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isJumbomoji()Z +HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isSingleLine()Z HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$ellipsizeEmojiTextForMaxLines$2()V HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$ellipsizeEmojiTextForMaxLines$3(Ljava/lang/Runnable;Landroid/view/View;)Lkotlin/Unit; HSPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->lambda$getLongestLineWidth$0(Ljava/lang/String;)Ljava/lang/Float; @@ -20636,9 +20455,6 @@ HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->() HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->(Ljava/lang/String;ILjava/lang/String;)V HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->fitzpatrickFromUnicode(Ljava/lang/CharSequence;I)Lorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick; HSPLorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick;->values()[Lorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick; -HSPLorg/thoughtcrime/securesms/components/mention/MentionAnnotation$$ExternalSyntheticLambda1;->()V -HSPLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;II)Ljava/util/List; HSPLorg/thoughtcrime/securesms/components/mention/MentionDeleter;->()V HSPLorg/thoughtcrime/securesms/components/mention/MentionRenderer$MultiLineMentionRenderer;->(IILandroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/components/mention/MentionRenderer$SingleLineMentionRenderer;->(IILandroid/graphics/drawable/Drawable;)V @@ -20647,7 +20463,6 @@ HSPLorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;->draw(Landroid/graphics/Canvas;Landroid/text/Spanned;Landroid/text/Layout;)V HSPLorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate;->setTint(I)V HSPLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->()V -HSPLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V HSPLorg/thoughtcrime/securesms/components/menu/ActionItem;->()V HSPLorg/thoughtcrime/securesms/components/menu/ActionItem;->(ILjava/lang/CharSequence;ILjava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/components/menu/ActionItem;->(ILjava/lang/CharSequence;ILjava/lang/Runnable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -20858,7 +20673,6 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->acces HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->clearProgressEventHandler()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->createMediaControllerAsync()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->finishPostpone()V -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->getVoiceNotePlaybackState()Landroidx/lifecycle/MutableLiveData; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->getVoiceNotePlayerViewState()Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->initializeMediaController(Landroidx/media3/session/MediaController;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->notifyProgressEventHandler()V @@ -20866,7 +20680,6 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onCre HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaNotificationProvider$Companion;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaNotificationProvider$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaNotificationProvider;->()V @@ -20905,12 +20718,6 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->compone HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->component5()F HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->component6()Z HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->component7()Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState$ClipType; -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getPlayheadPositionMillis()J -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getSpeed()F -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getTrackDuration()J -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getUri()Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isAutoReset()Z -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isPlaying()Z HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;->()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;->(Landroid/content/Context;Landroidx/media3/exoplayer/ExoPlayer;)V @@ -20921,7 +20728,6 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlayer;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onConnect(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)Landroidx/media3/session/MediaSession$ConnectionResult; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onCustomCommand(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;Landroidx/media3/session/SessionCommand;Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onDisconnected(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onPostConnect(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->setAudioStream(Landroid/os/Bundle;)Lcom/google/common/util/concurrent/ListenableFuture; HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager$HardwareSensorEventListener;->(Lorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;)V @@ -20933,7 +20739,6 @@ HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManage HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onPause(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onStop(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->sendNewStreamTypeToPlayer(I)V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->unregisterCallbacksAndRelease()V HSPLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManagerKt;->()V @@ -21094,13 +20899,11 @@ HSPLorg/thoughtcrime/securesms/conversation/BodyBubbleLayoutTransition;->()V HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->()V HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->(Landroid/graphics/drawable/Drawable;)V -HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->draw(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->setProjections(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZ)V HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZ)V HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->(ZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->includeWarningUpdateMessage()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->isHidden()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData;->isMessageRequestAccepted()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->()V @@ -21113,36 +20916,14 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->getUnreadCount()I HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->shouldJumpToMessage()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->shouldScrollToLastSeen()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationData;->showUniversalExpireTimerMessage()Z -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->(Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider-IA;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideDecoratorsIfContentIsNotPresent()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideDescription()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->prependIcon(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence; -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAbout(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAvatar(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setLinkifyDescription(Z)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setSubtitle(Ljava/lang/CharSequence;I)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->showBackgroundBubble(Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;JLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Ljava/util/ArrayList;Lorg/thoughtcrime/securesms/stickers/StickerLocator;ZIIZZLorg/thoughtcrime/securesms/badges/models/Badge;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->canInitializeFromDatabase()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->from(Landroid/os/Bundle;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getConversationScreenType()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType; HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDistributionType()I -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftContentType()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMedia()Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMediaType()Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftText()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getMedia()Ljava/util/ArrayList; -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getShareDataTimestamp()J HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStartingPosition()I -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStickerLocator()Lorg/thoughtcrime/securesms/stickers/StickerLocator; HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getThreadId()J HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getWallpaper()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; -HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isBorderless()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isFirstTimeInSelfCreatedGroup()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isWithSearchOpen()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder;->(Landroid/content/Context;Ljava/lang/Class;Lorg/thoughtcrime/securesms/recipients/RecipientId;JLorg/thoughtcrime/securesms/conversation/ConversationIntents$ConversationScreenType;)V @@ -21202,19 +20983,14 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClic HSPLorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClickListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItem;Lorg/thoughtcrime/securesms/conversation/ConversationItem$ViewOnceMessageClickListener-IA;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lj$/util/Optional;Lj$/util/Optional;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ZZZZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->canPlayContent()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lj$/util/Optional;Lj$/util/Optional;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/String;ZZZZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->forceFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getActiveFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/components/ConversationItemFooter; HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBodyBubbleCorners(IIII)Lorg/thoughtcrime/securesms/util/Projection$Corners; -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultBubbleColor(Z)I HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getDefaultTopMarginForRecord(Lorg/thoughtcrime/securesms/database/model/MessageRecord;II)I -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getGiftId()J -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getOpenableGiftProjection(Z)Lorg/thoughtcrime/securesms/util/Projection; HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getRoot()Landroid/view/ViewGroup; -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getSnapshotProjections(Landroid/view/ViewGroup;ZZ)Lorg/thoughtcrime/securesms/util/ProjectionList; HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z @@ -21232,7 +21008,6 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isCondensedMode() HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isContentCondensed()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isFooterVisible(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isGiftMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isSingularMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStartOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStoryReaction(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z @@ -21267,7 +21042,6 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setStoryReactionL HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setThumbnailCorners(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldDrawBodyBubbleOutline(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldInterceptClicks(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z -HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->showProjectionArea()V HSPLorg/thoughtcrime/securesms/conversation/ConversationItem;->unbind()V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticBackport0;->m(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$ExternalSyntheticLambda2;->()V @@ -21275,7 +21049,6 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$$External HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->getProjections()Ljava/util/Set; HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->init()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onDrawForeground(Landroid/graphics/Canvas;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onSizeChanged(IIII)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setBackground(Landroid/graphics/drawable/Drawable;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setOnSizeChangedListener(Lorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble$OnSizeChangedListener;)V @@ -21293,11 +21066,6 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(ZILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;->(ZLkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$SwipeAvailabilityProvider;Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$OnSwipeListener;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->attachToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener$Callback;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage$ComputedProperties;->(Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage$ConversationMessageFactory;->createWithUnresolvedData(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/CharSequence;Ljava/util/List;ZLorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HSPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->()V @@ -21319,11 +21087,10 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->< HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->(Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback;Lorg/signal/core/util/concurrent/LifecycleDisposable;Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->(Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback;Lorg/signal/core/util/concurrent/LifecycleDisposable;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->setAfterFirstRenderMode(Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->(Lorg/thoughtcrime/securesms/recipients/Recipient;ZLio/reactivex/rxjava3/core/Observable;ZZZZIJZZ)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->(Lorg/thoughtcrime/securesms/recipients/Recipient;ZLio/reactivex/rxjava3/core/Observable;ZZZZIJLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Z)V HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component10()Z +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component10()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component11()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component2()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component3()Lio/reactivex/rxjava3/core/Observable; @@ -21333,19 +21100,13 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->c HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component7()Z HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component8()I HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot;->component9()J +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu;->()V +HSPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu;->access$getTAG$p()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/conversation/ConversationRepository;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationRepository;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationRepository;->getConversationData(JLorg/thoughtcrime/securesms/recipients/Recipient;I)Lorg/thoughtcrime/securesms/conversation/ConversationData; -HSPLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->getSearchResults()Landroidx/lifecycle/LiveData; -HSPLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter$EventListener;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->setStickers(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFF)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFFLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator-IA;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FF)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FFF)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->dpToPx(I)I +HSPLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter$EventListener;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Landroid/view/View$OnClickListener;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->clearExpiring()V @@ -21354,7 +21115,7 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setIndividua HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setOnStoryRingClickListener(Landroid/view/View$OnClickListener;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setRecipientTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setStoryRingFromState(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setTitle(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setTitle(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->updateSubtitleVisibility()V HSPLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->updateVerifiedSubtitleVisibility()V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;)V @@ -21371,32 +21132,9 @@ HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->()V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->onFinishInflate()V HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateItem;->setOnClickListener(Landroid/view/View$OnClickListener;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->()V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$OnTickListener;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda0;->()V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda1;->()V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->run()V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->run()V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$gcFI10LhFCaBEmJzQp8t_xBcU8U(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$h27hRrs_Rwv2sGlsmjqcW0dGIZI(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->()V HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;Landroid/content/Context;Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->getLatestTimestamp(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;Landroidx/recyclerview/widget/LinearLayoutManager;)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->ignoreViewReveals()V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$0(J)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$1(J)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->onViewsRevealed(J)V -HSPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->stopIgnoringViewReveals(Ljava/lang/Long;)V HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType$Creator;->()V @@ -21428,27 +21166,13 @@ HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->()V HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->style$default(Ljava/lang/Object;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/text/Spannable;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->style(Ljava/lang/Object;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/text/Spannable;)Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; HSPLorg/thoughtcrime/securesms/conversation/MessageStyler;->style(Ljava/lang/Object;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/text/Spannable;Z)Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda3;->(Lio/reactivex/rxjava3/core/ObservableEmitter;J)V -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->(J)V -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->$r8$lambda$2XiX_Dh66c_pIVZzuRFfoiDjp1A(JLio/reactivex/rxjava3/core/ObservableEmitter;)V HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->()V HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->()V -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount$lambda$6(JLio/reactivex/rxjava3/core/ObservableEmitter;)V -HSPLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount(J)Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;)V HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->()V HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; -HSPLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->setListener(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$Listener;)V -HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->()V -HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->(Landroidx/activity/ComponentActivity;)V -HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onStart(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener;->()V @@ -21524,75 +21248,17 @@ HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDec HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)V -HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->()V HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->(Landroidx/recyclerview/widget/RecyclerView;)V HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getChatColors$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; -HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; -HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayoutManager(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroidx/recyclerview/widget/LinearLayoutManager; HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getNoLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Z -HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$setUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;Z)V -HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->getLayoutManager()Landroidx/recyclerview/widget/LinearLayoutManager; HSPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->setChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Ljava/lang/CharSequence;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component1()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component2()Ljava/lang/CharSequence; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Lkotlin/Pair; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->$r8$lambda$SLYPkhFM2MVtyCpgHajSG6aOkdY(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->access$getShareOrDraftDataInternal(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)Lkotlin/Pair; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftDataInternal(J)Lkotlin/Pair; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->loadDraftsInternal(J)Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->saveDrafts$lambda$9(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->saveDrafts(JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copy(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copyAndSetDrafts$default(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copyAndSetDrafts(JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->getThreadId()J -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->toDrafts()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->invoke(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Lkotlin/Pair;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/MaybeSource; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->()V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->(JLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;)V -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$saveDrafts(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->loadShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; -HSPLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->saveDrafts(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->run()V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->$r8$lambda$IJ0Uk3eauzGuBkd_D1PotCUrlIQ(Landroidx/recyclerview/widget/RecyclerView;)V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->()V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->(Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateSlide(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->isRunning()Z -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished$lambda$4(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->()V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->()V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect;->getMmsParts(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;)Ljava/util/Set; @@ -21648,32 +21314,12 @@ HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$C HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;->()V HSPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->()V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->()V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;Landroid/view/View;Landroid/view/ViewGroup;Lorg/thoughtcrime/securesms/components/ComposeText;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->access$getEmojiPopup$p(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup; -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->dismiss()V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->onOrientationChange(Z)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->updateList(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Results;)V HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;)V HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->()V HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;)V HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;Lorg/thoughtcrime/securesms/keyboard/emoji/search/EmojiSearchRepository;Lorg/thoughtcrime/securesms/components/emoji/RecentEmojiPageModel;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getResults()Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getSelection()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->()V HSPLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->(Lorg/thoughtcrime/securesms/database/RecipientTable;)V HSPLorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2;->(Lorg/thoughtcrime/securesms/database/RecipientTable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -21689,7 +21335,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;-> HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onStart(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$1;->(Landroidx/activity/ComponentActivity;)V @@ -21699,11 +21344,8 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inl HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$5;->(Landroidx/activity/ComponentActivity;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;Landroidx/activity/ComponentActivity;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$stripeRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->$r8$lambda$rJaCnn2xrQlJTPwnM83GXFMdMzE(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate(Landroid/os/Bundle;Z)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onPreCreate()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onResume()V @@ -21737,7 +21379,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContrac HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivityResultContracts$Callbacks;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V @@ -21751,32 +21392,18 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$Conversatio HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->bindPayloadsIfAvailable()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->canPlayContent()Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getBindable()Lorg/thoughtcrime/securesms/BindableConversationItem; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getDisplayMode()Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getNextMessage()Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getPreviousMessage()Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->showProjectionArea()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$OnScrollStateChangedListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->invoke(Ljava/lang/String;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->$r8$lambda$RwrnJe2SKX6YQ0B5PDojQRbXNOc(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind$lambda$1(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->$r8$lambda$0GW66dll143qhTHiVUdlBHolclI(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->$r8$lambda$u2AJxgyeBquqI1nF9ok3s6g0b5Q(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->(Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->_init_$lambda$4(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->_init_$lambda$6(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; @@ -21786,17 +21413,15 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$ge HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$getLifecycleOwner$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Landroidx/lifecycle/LifecycleOwner; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->access$get_selected$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;)Ljava/util/HashSet; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->consumePulseRequest()Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge$PulseRequest; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getChatColorsData()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getClickListener()Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getColorizer()Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getConversationMessage(I)Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getDisplayMode()Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getGlideRequests()Lorg/thoughtcrime/securesms/mms/GlideRequests; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getNextMessage(I)Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getPreviousMessage(I)Lorg/thoughtcrime/securesms/database/model/MessageRecord; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getRequestManager()Lcom/bumptech/glide/RequestManager; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSearchQuery()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSelectedItems()Ljava/util/Set; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->hasNoConversationMessages()Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->hasWallpaper()Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->isMessageRequestAccepted()Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->isParentInScroll()Z @@ -21804,78 +21429,35 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onAttache HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onHasWallpaperChanged(Z)Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setMessageRequestAccepted(Z)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setMessageRequestIsAccepted(Z)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setSearchQuery(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->updateSearchQuery(Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearVoiceNotePlayer()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getVoiceNotePlayerStub()Lorg/thoughtcrime/securesms/util/views/Stub; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->hide(Lorg/thoughtcrime/securesms/util/views/Stub;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$Listener;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda14;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda15;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda8;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda9;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda11;->onLayoutChange(Landroid/view/View;IIIIIIII)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda24;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActionModeCallback;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActivityResultCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentKeyboardFragmentListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentManagerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$BackPressedDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationBannerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationItemClickListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->getSnapshot()Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DisabledInputListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelMediaListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$KeyboardEvents;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroidx/recyclerview/widget/LinearLayoutManager;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onResume(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onStart(Landroidx/lifecycle/LifecycleOwner;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$MotionEventRelayDrain;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->bind(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(J)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->$r8$lambda$SqiWUifYWEV36mNfvnPsrkHWoAw(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled$lambda$0(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->presentComposeDivider()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SearchEventListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SendButtonListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SwipeAvailabilityProvider;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->setToolbarMargin(I)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/appcompat/widget/Toolbar;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener;->onGlobalLayout()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$VoiceMessageRecordingSessionCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$WhenMappings;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2;->invoke()Ljava/lang/Object; @@ -21891,74 +21473,29 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversation HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Lj$/util/Optional;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$attachListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$1;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->get()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$3;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->invoke(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$jumpAndPulseScrollStrategy$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke(Landroidx/lifecycle/SavedStateHandle;)Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestRepository$2;->invoke()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$messageRequestViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->accept(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$1;->accept(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)V @@ -21971,10 +21508,7 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConve HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3;->apply(Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState;)Lio/reactivex/rxjava3/core/ObservableSource; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->run()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->(Landroid/view/View;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->$r8$lambda$oOR6vln5-HH0T67uKvvWOaEanvw(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->(Lkotlin/jvm/internal/Ref$BooleanRef;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4;->invoke$lambda$1(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Ljava/util/List;Lkotlin/jvm/internal/Ref$BooleanRef;)V @@ -21991,23 +21525,16 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreate HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1;->get()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1;->invoke(Lorg/thoughtcrime/securesms/database/model/StoryViewState;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$reactionDelegate$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->(Landroidx/fragment/app/Fragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->invoke()Landroidx/lifecycle/ViewModelStore; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1;->invoke()Ljava/lang/Object; @@ -22018,14 +21545,8 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inl HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$3;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->(Landroidx/fragment/app/Fragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Landroidx/lifecycle/ViewModelStore; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->(Lkotlin/jvm/functions/Function0;Landroidx/fragment/app/Fragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->(Landroidx/fragment/app/Fragment;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; @@ -22039,21 +21560,11 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inl HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->(Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Landroidx/lifecycle/ViewModelStore; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->(Landroidx/fragment/app/Fragment;Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; @@ -22061,61 +21572,35 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$voiceNotePla HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->$r8$lambda$YDQLzyHN5FWBrQEkaTYrdZ0__OI(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$doAfterFirstRender(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAdapter$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getArgs(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getBinding(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getColorizer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/colors/Colorizer; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeText(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ComposeText; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getConversationItemDecorations$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getConversationRecipientRepository(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getGroupCallViewModel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInlineQueryViewModel$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInputPanel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/InputPanel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getLayoutManager$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroidx/recyclerview/widget/ConversationLayoutManager; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMarkReadHelper$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/MarkReadHelper; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMessageRequestRepository(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getScrollToPositionDelegate$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getThreadHeaderMarginDecoration$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getViewModel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isScrolledToBottom(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$moveToStartPosition(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/ConversationData;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentInputReadyState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$updateMessageRequestAcceptedState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->doAfterFirstRender()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getArgs()Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getBinding()Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getComposeText()Lorg/thoughtcrime/securesms/components/ComposeText; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getContainer()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getConversationGroupViewModel()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getConversationRecipientRepository()Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getDraftViewModel()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getGroupCallViewModel()Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInlineQueryController()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInputPanel()Lorg/thoughtcrime/securesms/components/InputPanel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getKeyboardPagerViewModel()Lorg/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getLinkPreviewViewModel()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMessageRequestRepository()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMotionEventRelay()Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchNav()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchViewModel()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendButton()Lorg/thoughtcrime/securesms/components/SendButton; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendEditButton()Landroid/widget/ImageButton; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getShareDataTimestampViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getStickerViewModel()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeConversationThreadUi()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeGiphyMp4()Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeInlineSearch()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeLinkPreviews()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeMediaKeyboard()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeSearch()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeStickerSuggestions()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->invalidateOptionsMenu()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->isScrolledToBottom()Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->moveToStartPosition(Lorg/thoughtcrime/securesms/conversation/ConversationData;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->observeConversationThread()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onCreate(Landroid/os/Bundle;)V @@ -22126,19 +21611,12 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onViewStat HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentActionBarMenu()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentConversationTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentGroupCallJoinButton()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentInputReadyState(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentNavigationIconForNormal()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentStoryRing()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentTypingIndicator()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentWallpaper(Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->registerForResults()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->updateMessageRequestAcceptedState(Z)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Landroid/view/View;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getHeight()I -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getItemView()Landroid/view/View; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->updateForWallpaper()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState;->()V @@ -22147,9 +21625,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$Unrea HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->(ZZ)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->(ZZILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->access$timestamp(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHasWallpaper()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHeader(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->hasHeader(I)Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->isFirstUnread(I)Z @@ -22188,10 +21663,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;- HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;->getGroupRecord()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11;->call()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->call()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->call()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7;->(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7;->call()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion;->()V @@ -22207,9 +21678,7 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessage HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->apply(I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$getMessageCounts$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$98QfcuQyzMi7mf2qZrmWDK7X98k(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$KdCOHPNqejWN1AhOnsjSsYWIQ1E(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$SEmY6z8BVO3vpDRoIUBmm8tqjes(JLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;I)Lorg/thoughtcrime/securesms/conversation/v2/ConversationThreadState; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$jYghkNuRsI_xLxRgZRxsCeMcFTc(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->(Landroid/content/Context;Z)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->access$getUnreadCount(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;J)I @@ -22219,10 +21688,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getConve HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords$lambda$11(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Single; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getMessageCounts(J)Lio/reactivex/rxjava3/core/Flowable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder$lambda$10(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder(Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Maybe; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState$lambda$15(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getRequestReviewState(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)Lio/reactivex/rxjava3/core/Single; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadCount(J)I HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getUnreadMentionsCount(J)I HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->()V @@ -22254,7 +21719,7 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapte HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State;->(Ljava/util/List;ZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter$State;->getTypists()Ljava/util/List; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->(Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->(Lcom/bumptech/glide/RequestManager;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter;->getItemCount()I HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$10;->accept(Ljava/lang/Object;)V @@ -22265,11 +21730,7 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->apply( HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$11;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Lkotlin/Unit;Lj$/util/Optional;)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Lj$/util/Optional;)Lio/reactivex/rxjava3/core/MaybeSource; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -22333,18 +21794,10 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$chatColorsD HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$chatColorsDataObservable$2;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$chatColorsDataObservable$2;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$chatColorsDataObservable$2;->apply(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Landroid/graphics/Rect;)Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)Lio/reactivex/rxjava3/core/SingleSource; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Lj$/util/Optional;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->(ZZ)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; @@ -22357,26 +21810,16 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$ge HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$get_conversationThreadState$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)Lio/reactivex/rxjava3/subjects/Subject; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->access$setRecipientSnapshot$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->canShowAsBubble(Landroid/content/Context;)Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getChatColorsSnapshot()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getConversationThreadState()Lio/reactivex/rxjava3/core/Single; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getGroupMemberServiceIds()Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getHasMessageRequestState()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getIdentityRecordsObservable()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getInputReadyState()Lio/reactivex/rxjava3/core/Observable; +HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getMessageRequestState()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getPagingController()Lorg/signal/paging/ProxyPagingController; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipient()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipientSnapshot()Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getReminder()Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRequestReviewState()Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScheduledMessagesCount()Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScrollButtonState()Lio/reactivex/rxjava3/core/Flowable; -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getSearchQuery()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getStoryRingState()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getThreadId()J HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getWallpaperSnapshot()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->isPushAvailable()Z HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->onChatBoundsChanged(Landroid/graphics/Rect;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->setShowScrollButtonsForScrollPosition(ZZ)V HSPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->updateIdentityRecordsInBackground()V HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$inflater$2;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->()V @@ -22384,7 +21827,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landro HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->(Landroid/content/Context;Landroid/util/AttributeSet;IILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->clear()V -HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$Listener;)V HSPLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setWallpaperEnabled(Z)V HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;Z)V @@ -22393,7 +21835,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZZ)V HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getConversationRecipient()Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getGroupRecord()Lorg/thoughtcrime/securesms/database/model/GroupRecord; HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getMessageRequestState()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isActiveGroup()Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isAnnouncementGroup()Ljava/lang/Boolean; @@ -22401,27 +21842,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isClientExpired HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isRequestingMember()Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->isUnauthorized()Z HSPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->shouldShowInviteToSignal()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->setDrain(Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay$Drain;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->getTimestamp()J -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/String;)Lio/reactivex/rxjava3/core/SingleSource; -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->access$getStickerSearchRepository$p(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository; -HSPLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->getStickers()Lio/reactivex/rxjava3/core/Flowable; -HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/audio/AudioRecorder;Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$SessionCallback;)V HSPLorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;->(ZZLjava/lang/String;)V HSPLorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;->getValue()Ljava/lang/String; @@ -22450,17 +21870,9 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey$Compa HSPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationElementKey;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areContentsTheSame(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areItemsTheSame(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)Z HSPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey;->(J)V HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageBackedKey;->hashCode()I @@ -22518,11 +21930,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->updateM HSPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->updateWithData(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;)Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areContentsTheSame(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areItemsTheSame(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)Z -HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->getRecipientInfo()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeaderKey;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->()V @@ -22560,7 +21967,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewM HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;)V HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getHasOngoingGroupCallSnapshot()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->peekGroupCall()V HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel$1;->()V @@ -22589,33 +21995,22 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel HSPLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->updateGroupStateIfNeeded()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;->(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Landroid/graphics/drawable/Drawable;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;->getMask()Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->draw(Landroid/graphics/Canvas;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getMask()Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOpacity()I -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getOutline(Landroid/graphics/Outline;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->isSolidColor()Z HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setCorners(Lorg/thoughtcrime/securesms/util/Projection$Corners;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setCorners([F)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setLocalChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;->()V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->addOnMeasureListener(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnMeasureListener;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->onMeasure(II)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->removeOnMeasureListener(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnMeasureListener;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->setOnDispatchTouchEventListener(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnDispatchTouchEventListener;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$Companion;->()V @@ -22657,38 +22052,26 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyB HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;->isIncoming()Z HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridgeKt;->bridge(Lorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;)Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge; HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda4;->()V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;)V +HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/conversation/ConversationAdapter$ItemClickListener;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$PassthroughClickListener;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$ReactionMeasureListener;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$bodyBubbleDrawable$1;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$bodyBubbleDrawable$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$bodyBubbleDrawable$1;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$footerDrawable$1;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$footerDrawable$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$footerDrawable$1;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$replyDelegate$1;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$senderDrawable$1;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->$r8$lambda$ocilDMoff9b132TfYhzB6ol1qqk(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext;Lorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->_init_$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;Landroid/view/View;IIIIIIII)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->bind(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->bind(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->canPlayContent()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage; HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->getShape()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape; -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateBodyBubbleDrawable(Landroid/view/ViewGroup;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateChatColorsDrawable(Landroid/view/ViewGroup;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->invalidateFooterDrawable(Landroid/view/ViewGroup;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->isContentCondensed()Z HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->isForcedFooter()Z HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->linkifyMessageBody(Landroid/text/Spannable;)V @@ -22705,7 +22088,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyV HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentSenderNameColor()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->setConversationMessage(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->setShape(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->showProjectionArea()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$1;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$2;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme$getBodyTextColor$2;->invoke(Landroid/content/Context;Z)Ljava/lang/Integer; @@ -22715,8 +22097,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->< HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyTextColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)I -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getFooterBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getReplyIconBackgroundColor()I HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemUtils;->linkifyUrlLinks(Landroid/text/Spannable;ZLorg/thoughtcrime/securesms/util/UrlClickHandler;)V @@ -22730,10 +22110,6 @@ HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate$Di HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Ljava/util/List;Landroid/view/View;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/Space;Lorg/thoughtcrime/securesms/util/views/Stub;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyBindingBridge;)V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->displayTuckedIntoBody()V -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->getFooterWidth()I -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPostMeasure()Z -HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPreMeasure()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener;)V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$Companion;->()V HSPLorg/thoughtcrime/securesms/conversation/v2/items/V2OnDispatchTouchEventListener$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -22764,7 +22140,7 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload;->values()[Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$Payload; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->$r8$lambda$2QDH4q4xSHpazU1KhZ4uhNUhhdI(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$OnConversationClickListener;Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->(Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$OnConversationClickListener;Lorg/thoughtcrime/securesms/conversationlist/ClearFilterViewHolder$OnClearFilterClickListener;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->getItem(I)Lorg/thoughtcrime/securesms/conversationlist/model/Conversation; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->getItemViewType(I)I HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter;->lambda$onCreateViewHolder$1(Lorg/thoughtcrime/securesms/conversationlist/ConversationListAdapter$ConversationViewHolder;Landroid/view/View;)V @@ -22918,7 +22294,6 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCre HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onCreateView(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;Landroid/os/Bundle;)Landroid/view/View; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onFirstRender()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onMegaphoneChanged(Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onMegaphoneCompleted(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPause()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPostSubmitList(I)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onPrepareOptionsMenu(Landroid/view/Menu;)V @@ -22931,25 +22306,25 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updat HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateMultiSelectState()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateReminders()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->updateSearchToolbarHint(Lorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationFilterRequest;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda12;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->run()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda10;->run()V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda13;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda6;->onChanged(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$LAkoq7MeJO-fCezsfjX-mK5pWPo(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Landroid/text/SpannableString;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$dlLpa5X9k6koT8N7PU2hVGd424s(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$k1MmUJ3xOtwOkC4HHJE6kKVtClw(Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem;Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->$r8$lambda$m6UBhFD1iIvqrclbuOW7C8gY-JM(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;Ljava/lang/CharSequence;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->(Landroid/content/Context;Landroid/util/AttributeSet;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bindThread(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->createFinalBodyWithMediaIcon(Landroid/content/Context;Ljava/lang/CharSequence;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->getThreadDisplayBody(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lorg/thoughtcrime/securesms/mms/GlideRequests;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bind(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->bindThread(Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;Ljava/util/Locale;Ljava/util/Set;Lorg/thoughtcrime/securesms/conversationlist/model/ConversationSet;Ljava/lang/String;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->createFinalBodyWithMediaIcon(Landroid/content/Context;Ljava/lang/CharSequence;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->getThreadDisplayBody(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Lcom/bumptech/glide/RequestManager;ILorg/thoughtcrime/securesms/glide/GlideLiveDataTarget;)Landroidx/lifecycle/LiveData; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->lambda$bindThread$1(Ljava/util/Locale;Lorg/thoughtcrime/securesms/database/model/ThreadRecord;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->lambda$getThreadDisplayBody$9(Lorg/thoughtcrime/securesms/database/model/ThreadRecord;Landroid/content/Context;Ljava/lang/CharSequence;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->observeDisplayBody(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/LiveData;)V @@ -22968,18 +22343,18 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItem;->whileLoad HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator;->disable()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda4;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterRepository;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ChatFilterRepository;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$Companion;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter;->(Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lorg/thoughtcrime/securesms/mms/GlideRequests;)V +HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter;->(Landroid/content/Context;Ljava/util/Set;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$DisplayOptions;Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$ConversationListSearchClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$LongClickCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$StoryContextMenuCallbacks;Lorg/thoughtcrime/securesms/contacts/paged/ContactSearchAdapter$CallButtonClickCallbacks;Landroidx/lifecycle/LifecycleOwner;Lcom/bumptech/glide/RequestManager;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$$ExternalSyntheticLambda0;->onResult(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$1;->()V @@ -23036,10 +22411,6 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaph HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1;->()V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1;->invoke(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onMegaphoneCompleted$1;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onMegaphoneCompleted$1;->()V -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onMegaphoneCompleted$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onMegaphoneCompleted$1;->invoke(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onVisible$1$1;->(Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onVisible$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onVisible$1$1;->invoke(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState;)Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$ConversationListState; @@ -23078,7 +22449,6 @@ HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getN HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getPinnedCount()I HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getSelectedState()Lio/reactivex/rxjava3/core/Flowable; HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->getWebSocketState()Lio/reactivex/rxjava3/core/Observable; -HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onMegaphoneCompleted(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onMegaphoneVisible(Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onVisible$lambda$0(Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;Lorg/thoughtcrime/securesms/megaphone/Megaphone;)V HSPLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onVisible()V @@ -23290,7 +22660,7 @@ HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->saveIdent HSPLorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;->saveIdentityWithoutSideEffects(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId;Lorg/signal/libsignal/protocol/IdentityKey;Lorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZJZ)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalKyberPreKeyStore;->()V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalKyberPreKeyStore;->(Lorg/whispersystems/signalservice/api/push/ServiceId;)V -HSPLorg/thoughtcrime/securesms/crypto/storage/SignalKyberPreKeyStore;->storeKyberPreKey(ILorg/signal/libsignal/protocol/state/KyberPreKeyRecord;)V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalKyberPreKeyStore;->storeLastResortKyberPreKey(ILorg/signal/libsignal/protocol/state/KyberPreKeyRecord;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalSenderKeyStore;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalSenderKeyStore;->deleteAll()V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/crypto/storage/TextSecurePreKeyStore;Lorg/thoughtcrime/securesms/crypto/storage/SignalKyberPreKeyStore;Lorg/thoughtcrime/securesms/crypto/storage/SignalIdentityKeyStore;Lorg/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore;Lorg/thoughtcrime/securesms/crypto/storage/SignalSenderKeyStore;)V @@ -23299,7 +22669,7 @@ HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->saveIdentity(Lorg/signal/libsignal/protocol/SignalProtocolAddress;Lorg/signal/libsignal/protocol/IdentityKey;)Z HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->senderKeys()Lorg/thoughtcrime/securesms/crypto/storage/SignalSenderKeyStore; HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->sessions()Lorg/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore; -HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->storeKyberPreKey(ILorg/signal/libsignal/protocol/state/KyberPreKeyRecord;)V +HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->storeLastResortKyberPreKey(ILorg/signal/libsignal/protocol/state/KyberPreKeyRecord;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;->storeSignedPreKey(ILorg/signal/libsignal/protocol/state/SignedPreKeyRecord;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceDataStoreImpl;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl;)V HSPLorg/thoughtcrime/securesms/crypto/storage/SignalServiceDataStoreImpl;->aci()Lorg/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl; @@ -23322,11 +22692,14 @@ HSPLorg/thoughtcrime/securesms/database/AttachmentTable$TransformProperties;->access$getDEFAULT_MEDIA_QUALITY$cp()I HSPLorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1;->(Lorg/thoughtcrime/securesms/attachments/Attachment;Lorg/thoughtcrime/securesms/database/AttachmentTable;JZLkotlin/jvm/internal/Ref$BooleanRef;)V HSPLorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable$insertAttachment$attachmentId$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)Lorg/thoughtcrime/securesms/attachments/AttachmentId; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->()V HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;Lorg/thoughtcrime/securesms/crypto/AttachmentSecret;)V HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->access$getVisualHashStringOrNull(Lorg/thoughtcrime/securesms/database/AttachmentTable;Lorg/thoughtcrime/securesms/attachments/Attachment;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->deleteAbandonedPreuploadedAttachments()I +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachment(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachment(Lorg/thoughtcrime/securesms/attachments/AttachmentId;)Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment; +HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachments(Landroid/database/Cursor;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachmentsForMessage(J)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getAttachmentsForMessages(Ljava/util/Collection;)Ljava/util/Map; HSPLorg/thoughtcrime/securesms/database/AttachmentTable;->getVisualHashStringOrNull(Lorg/thoughtcrime/securesms/attachments/Attachment;)Ljava/lang/String; @@ -23372,13 +22745,10 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->()V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onDelete(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onQuery(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onSql(Ljava/lang/String;[Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseMonitor;->onUpdate(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V @@ -23403,18 +22773,14 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambd HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5;->run()V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->run()V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$6H_TtixOHSa7Tr30medlqcHry2c(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$6mdIgDDCV4XFVFnyxH8Vj4a6MqU(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$8PzBCQMLi_6Y7FOR98cRbpXw-Xk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$Aq7iz6-OcN5qdEpvMz8WyoOoHtc(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$FLqOSncPM9UHAHmQfH7ITyYgYis(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$P-H8JPj8WgBa8EorlTkjTC0yG1E(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$Q9T3e0x03-9UyovUEacfv32ZkYs(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$XcpL0fyOGdTr1sc4d0z4i8eoe14(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$XpAe1b_YlxfSEkV3hD_v20iDkHw(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$ZjxWKgbWA1SSTmnWoVneQana_Lk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$mv9tymw4eNQuLtAMo52Pot0i2c4(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$nM9Xevlg3i5jd4hhWqCSJ8V0APs(Lorg/thoughtcrime/securesms/database/DatabaseObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$oXFDlhvhHFY1OBIQHYp3Oanmq-k(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V @@ -23427,13 +22793,11 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversa HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyConversationListeners$19(J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyRecipientChanged$34(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyStoryObservers$35(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyVerboseConversationListeners$20(J)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationListObserver$0(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerConversationObserver$1(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageInsertObserver$11(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerMessageUpdateObserver$10(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerNotificationProfileObserver$12(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerScheduledMessageObserver$14(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerStoryObserver$13(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerVerboseConversationObserver$2(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$runPostSuccessfulTransaction$40(Ljava/lang/Runnable;)V @@ -23445,14 +22809,12 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyMapped(Ljava/ut HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyRecipientChanged(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifySet(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyStoryObservers(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyVerboseConversationListeners(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationListObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMapped(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMessageInsertObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerMessageUpdateObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerNotificationProfileObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V -HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerScheduledMessageObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerStoryObserver(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerVerboseConversationObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V HSPLorg/thoughtcrime/securesms/database/DatabaseObserver;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V @@ -23465,7 +22827,6 @@ HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->getWritableDatabase()Lor HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyAttachmentListeners()V HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyConversationListListeners()V HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyConversationListeners(J)V -HSPLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyVerboseConversationListeners(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/DistributionListTables$ListTable;->()V @@ -23484,15 +22845,11 @@ HSPLorg/thoughtcrime/securesms/database/DraftTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/DraftTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->()V HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->(Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->addIfNotNull(Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V -HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->getDraftOfType(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/DraftTable$Draft; HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->getSize()I HSPLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->size()I HSPLorg/thoughtcrime/securesms/database/DraftTable;->()V HSPLorg/thoughtcrime/securesms/database/DraftTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/DraftTable;->asDrafts(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; -HSPLorg/thoughtcrime/securesms/database/DraftTable;->clearDrafts(J)V HSPLorg/thoughtcrime/securesms/database/DraftTable;->getDrafts(J)Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; HSPLorg/thoughtcrime/securesms/database/EarlyDeliveryReceiptCache;->()V HSPLorg/thoughtcrime/securesms/database/EarlyDeliveryReceiptCache;->()V @@ -23612,6 +22969,7 @@ HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable$Companion;->(Lkot HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->()V HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->insert(Lorg/whispersystems/signalservice/api/push/ServiceId;ILorg/signal/libsignal/protocol/state/KyberPreKeyRecord;Z)V +HSPLorg/thoughtcrime/securesms/database/KyberPreKeyTable;->toAccountId(Lorg/whispersystems/signalservice/api/push/ServiceId;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/LocalMetricsDatabase$Companion;->()V HSPLorg/thoughtcrime/securesms/database/LocalMetricsDatabase$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/LocalMetricsDatabase$Companion;->getInstance(Landroid/app/Application;)Lorg/thoughtcrime/securesms/database/LocalMetricsDatabase; @@ -23767,6 +23125,7 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->close()V HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getCurrent()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getCursor()Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getFailures(Ljava/lang/String;)Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMediaMmsMessageRecord(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getMismatchedIdentities(Ljava/lang/String;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getNext()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable$MmsReader;->getQuote(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/Quote; @@ -23799,12 +23158,10 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable;->getConversationSnippetCur HSPLorg/thoughtcrime/securesms/database/MessageTable;->getExpirationStartedMessages()Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getMessageCountForThread(J)I HSPLorg/thoughtcrime/securesms/database/MessageTable;->getMessageRecord(J)Lorg/thoughtcrime/securesms/database/model/MessageRecord; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->getMessagesForNotificationState(Ljava/util/Collection;)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getNearestExpiringViewOnceMessage()Lorg/thoughtcrime/securesms/revealable/ViewOnceExpirationInfo; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getOldestScheduledSendTimestamp()Lorg/thoughtcrime/securesms/database/model/MessageRecord; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getOldestStorySendTimestamp(Z)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getReleaseChannelThreadId(Z)J -HSPLorg/thoughtcrime/securesms/database/MessageTable;->getScheduledMessageCountForThread(J)I HSPLorg/thoughtcrime/securesms/database/MessageTable;->getSerializedLinkPreviews(Ljava/util/Map;Ljava/util/List;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getSerializedSharedContacts(Ljava/util/Map;Ljava/util/List;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/MessageTable;->getStoryViewState(J)Lorg/thoughtcrime/securesms/database/model/StoryViewState; @@ -23818,6 +23175,7 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable;->hasFailedOutgoingStory()Z HSPLorg/thoughtcrime/securesms/database/MessageTable;->hasMeaningfulMessage(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMediaMessage(JLjava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Landroid/content/ContentValues;Lorg/thoughtcrime/securesms/database/MessageTable$InsertListener;ZZ)Lkotlin/Pair; HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMessageInbox$default(Lorg/thoughtcrime/securesms/database/MessageTable;Lorg/thoughtcrime/securesms/mms/IncomingMessage;JLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;ZILjava/lang/Object;)Lj$/util/Optional; +HSPLorg/thoughtcrime/securesms/database/MessageTable;->insertMessageInbox(Lorg/thoughtcrime/securesms/mms/IncomingMessage;JLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;Z)Lj$/util/Optional; HSPLorg/thoughtcrime/securesms/database/MessageTable;->isQuoted(Ljava/util/Collection;)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/MessageTable;->mmsReaderFor(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/MessageTable$MmsReader; HSPLorg/thoughtcrime/securesms/database/MessageTable;->rawQueryWithAttachments$default(Lorg/thoughtcrime/securesms/database/MessageTable;Ljava/lang/String;[Ljava/lang/String;ZJILjava/lang/Object;)Landroid/database/Cursor; @@ -23825,8 +23183,6 @@ HSPLorg/thoughtcrime/securesms/database/MessageTable;->rawQueryWithAttachments(L HSPLorg/thoughtcrime/securesms/database/MessageTable;->rawQueryWithAttachments([Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;ZJ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/MessageTable;->setAllMessagesRead()Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/MessageTable;->setMessagesRead(Ljava/lang/String;[Ljava/lang/String;)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->setMessagesReadSince(JJ)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/database/MessageTable;->setReactionsSeen(JJ)V HSPLorg/thoughtcrime/securesms/database/MessageTable;->toMessageType(Lorg/thoughtcrime/securesms/mms/IncomingMessage;)J HSPLorg/thoughtcrime/securesms/database/MessageTable;->updatePendingSelfData(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/thoughtcrime/securesms/recipients/RecipientId;)V HSPLorg/thoughtcrime/securesms/database/MessageType;->$values()[Lorg/thoughtcrime/securesms/database/MessageType; @@ -23860,6 +23216,7 @@ HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isIncomingVideoCall(J HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isJoinedType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isKeyExchangeType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isLegacyType(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isMessageRequestAccepted(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isMissedAudioCall(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isMissedVideoCall(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isNoRemoteSessionType(J)Z @@ -23875,6 +23232,7 @@ HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPendingSecureSmsFal HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isProfileChange(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isPushType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isRateLimited(J)Z +HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isReportedSpam(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSecureType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSessionSwitchoverType(J)Z HSPLorg/thoughtcrime/securesms/database/MessageTypes$-CC;->isSmsExport(J)Z @@ -24037,7 +23395,7 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable$getAndPossiblyMerge$3;->i HSPLorg/thoughtcrime/securesms/database/RecipientTable;->$r8$lambda$aWzIz5YHb9jNapMRCuQVry5PhmE()V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->buildContentValuesForNewUser(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;)Landroid/content/ContentValues; +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->buildContentValuesForNewUser(Ljava/lang/String;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Z)Landroid/content/ContentValues; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getAndPossiblyMerge$default(Lorg/thoughtcrime/securesms/database/RecipientTable;Lorg/whispersystems/signalservice/api/push/ServiceId;Ljava/lang/String;ZILjava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getAndPossiblyMerge(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;ZZ)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/RecipientTable;->getAndPossiblyMerge(Lorg/whispersystems/signalservice/api/push/ServiceId;Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/RecipientId; @@ -24071,33 +23429,33 @@ HSPLorg/thoughtcrime/securesms/database/RecipientTable;->setProfileSharing(Lorg/ HSPLorg/thoughtcrime/securesms/database/RecipientTable;->update(Lorg/signal/core/util/SqlUtil$Query;Landroid/content/ContentValues;)Z HSPLorg/thoughtcrime/securesms/database/RecipientTable;->update(Lorg/thoughtcrime/securesms/recipients/RecipientId;Landroid/content/ContentValues;)Z HSPLorg/thoughtcrime/securesms/database/RecipientTable;->updatePendingSelfData(Lorg/thoughtcrime/securesms/recipients/RecipientId;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTable;->writePnpChangeSetToDisk(Lorg/thoughtcrime/securesms/database/PnpChangeSet;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;)Lorg/thoughtcrime/securesms/recipients/RecipientId; +HSPLorg/thoughtcrime/securesms/database/RecipientTable;->writePnpChangeSetToDisk(Lorg/thoughtcrime/securesms/database/PnpChangeSet;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Z)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda1;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda2;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda3;->(Lkotlin/jvm/functions/Function1;)V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda3;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda4;->(Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getRecipientExtras$1;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getRecipientExtras$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->invoke(I)Ljava/lang/Boolean; -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$groupMasterKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$groupMasterKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityKey$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityStatus$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityStatus$1;->()V -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->$r8$lambda$3gC4IvWj9S7nLeLK-eONY0kYlPA(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$2;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$2;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$3;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$3;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$4;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$4;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$5;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$5;->()V +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$5;->invoke(I)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$5;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->$r8$lambda$SZDnYaDAB9DrkxazGttwF3vWx5o(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->()V HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/recipients/Recipient$Extras; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecipientExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtras; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecord(Landroid/content/Context;Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getRecord(Landroid/content/Context;Landroid/database/Cursor;Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord; -HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getSyncExtras$lambda$2(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; +HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getSyncExtras$lambda$6(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->getSyncExtras(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->parseBadgeList([B)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/RecipientTableCursorUtil;->readCapabilities(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities; @@ -24237,6 +23595,7 @@ HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->runPostSuccessfulTransa HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->setTransactionSuccessful()V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->trace(Ljava/lang/String;Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/SQLiteDatabase$Returnable;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;ZLjava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->traceSql(Ljava/lang/String;Ljava/lang/String;ZLorg/thoughtcrime/securesms/database/SQLiteDatabase$Returnable;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->update(Ljava/lang/String;ILandroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/Object;)I @@ -24288,6 +23647,7 @@ HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->reactions()Lo HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->recipients()Lorg/thoughtcrime/securesms/database/RecipientTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->remoteMegaphones()Lorg/thoughtcrime/securesms/database/RemoteMegaphoneTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->runPostSuccessfulTransaction(Ljava/lang/Runnable;)V +HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->runPostSuccessfulTransaction(Ljava/lang/String;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->senderKeyShared()Lorg/thoughtcrime/securesms/database/SenderKeySharedTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->senderKeys()Lorg/thoughtcrime/securesms/database/SenderKeyTable; HSPLorg/thoughtcrime/securesms/database/SignalDatabase$Companion;->sessions()Lorg/thoughtcrime/securesms/database/SessionTable; @@ -24354,6 +23714,7 @@ HSPLorg/thoughtcrime/securesms/database/SignedPreKeyTable$Companion;->(Lko HSPLorg/thoughtcrime/securesms/database/SignedPreKeyTable;->()V HSPLorg/thoughtcrime/securesms/database/SignedPreKeyTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/SignedPreKeyTable;->insert(Lorg/whispersystems/signalservice/api/push/ServiceId;ILorg/signal/libsignal/protocol/state/SignedPreKeyRecord;)V +HSPLorg/thoughtcrime/securesms/database/SignedPreKeyTable;->toAccountId(Lorg/whispersystems/signalservice/api/push/ServiceId;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/SqlCipherDatabaseHook;->()V HSPLorg/thoughtcrime/securesms/database/SqlCipherDatabaseHook;->postKey(Lnet/zetetic/database/sqlcipher/SQLiteConnection;)V HSPLorg/thoughtcrime/securesms/database/SqlCipherDatabaseHook;->preKey(Lnet/zetetic/database/sqlcipher/SQLiteConnection;)V @@ -24373,17 +23734,15 @@ HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/StorySendTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/StorySendTable;->()V HSPLorg/thoughtcrime/securesms/database/StorySendTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V -HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->(Ljava/lang/CharSequence;)V HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->(Ljava/lang/CharSequence;I)V HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->(Ljava/lang/CharSequence;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;->getBody()Ljava/lang/CharSequence; HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->()V -HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->format(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;I)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; +HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->format(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;ILjava/lang/CharSequence;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->format(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getBody(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; -HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getBodyOrDefault(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;I)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getFormattedBodyFor(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; -HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getFormattedBodyForMms(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; +HSPLorg/thoughtcrime/securesms/database/ThreadBodyUtil;->getFormattedBodyForMms(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;Ljava/lang/CharSequence;)Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody; HSPLorg/thoughtcrime/securesms/database/ThreadTable$Companion;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$ConversationMetadata;->()V @@ -24426,13 +23785,11 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable$WhenMappings;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable$getOrCreateThreadIdFor$1;->(Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/recipients/RecipientId;ZI)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$getOrCreateThreadIdFor$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/database/ThreadTable$getOrCreateThreadIdFor$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)Ljava/lang/Long; -HSPLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->(Ljava/util/Map;Lorg/thoughtcrime/securesms/database/ThreadTable;Ljava/util/List;ZLkotlin/jvm/internal/Ref$BooleanRef;)V -HSPLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$update$1$isPinned$2;->(Lorg/thoughtcrime/securesms/database/ThreadTable;J)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$update$1$shouldDelete$2;->(ZJLkotlin/Lazy;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$update$1;->(JLorg/thoughtcrime/securesms/database/ThreadTable;ZZZ)V HSPLorg/thoughtcrime/securesms/database/ThreadTable$update$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/database/ThreadTable$update$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->()V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$createThreadForRecipient(Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/recipients/RecipientId;ZI)J @@ -24440,9 +23797,8 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$getAttachmentUriFor HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$getContentTypeFor(Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$getExtrasFor(Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/ThreadBodyUtil$ThreadBody;)Lorg/thoughtcrime/securesms/database/ThreadTable$Extra; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$hasMoreRecentDraft(Lorg/thoughtcrime/securesms/database/ThreadTable;JJ)Z -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$updateThread(Lorg/thoughtcrime/securesms/database/ThreadTable;JZLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/ThreadTable$Extra;JIIJZJIII)V +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->access$updateThread(Lorg/thoughtcrime/securesms/database/ThreadTable;JZLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/ThreadTable$Extra;JIIJZJIIILorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras;)V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->allowedToUnarchive(J)Z -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/String;J)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/String;JJZ)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/String;Ljava/lang/String;JJ)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->createThreadForRecipient(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZI)J @@ -24461,7 +23817,6 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getRecipientForThreadId(J) HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getRecipientIdForThreadId(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadIdFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadIdIfExistsFor(Lorg/thoughtcrime/securesms/recipients/RecipientId;)J -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadRecord(Ljava/lang/Long;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnarchivedConversationList(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;ZJJ)Landroid/database/Cursor; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnarchivedConversationListCount(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)I HSPLorg/thoughtcrime/securesms/database/ThreadTable;->getUnreadMessageCount()J @@ -24470,13 +23825,10 @@ HSPLorg/thoughtcrime/securesms/database/ThreadTable;->incrementUnread(JII)V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->markAsActiveEarly(J)V HSPLorg/thoughtcrime/securesms/database/ThreadTable;->readerFor(Landroid/database/Cursor;)Lorg/thoughtcrime/securesms/database/ThreadTable$Reader; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->setLastScrolled(JJ)V -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(JZJ)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(Ljava/util/Map;Z)Ljava/util/List; -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;ZJ)Ljava/util/List; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->toQuery(Lorg/thoughtcrime/securesms/conversationlist/model/ConversationFilter;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZ)Z -HSPLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZZ)Z HSPLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZZZ)Z +HSPLorg/thoughtcrime/securesms/database/ThreadTable;->updateThread(JZLjava/lang/String;Landroid/net/Uri;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/ThreadTable$Extra;JIIJZJIIILorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras;)V HSPLorg/thoughtcrime/securesms/database/UnknownStorageIdTable;->()V HSPLorg/thoughtcrime/securesms/database/UnknownStorageIdTable;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/SignalDatabase;)V HSPLorg/thoughtcrime/securesms/database/helpers/migration/V149_LegacyMigrations$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;)Ljava/util/List; @@ -24525,6 +23877,7 @@ HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingAudioCal HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingVideoCall()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isJoined()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isKeyExchange()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMessageRequestAccepted()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedAudioCall()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedVideoCall()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoing()Z @@ -24536,6 +23889,7 @@ HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPaymentsRequestT HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPending()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPendingInsecureSmsFallback()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isProfileChange()Z +HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isReportedSpam()Z HSPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isViewed()Z HSPLorg/thoughtcrime/securesms/database/model/DistributionListId$1;->()V HSPLorg/thoughtcrime/securesms/database/model/DistributionListId;->()V @@ -24592,7 +23946,7 @@ HSPLorg/thoughtcrime/securesms/database/model/MessageId$Creator;->()V HSPLorg/thoughtcrime/securesms/database/model/MessageId;->()V HSPLorg/thoughtcrime/securesms/database/model/MessageId;->(J)V HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->()V -HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->(JLjava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJJIZJLjava/util/Set;Ljava/util/Set;IJJZZLjava/util/List;ZJZJLorg/thoughtcrime/securesms/database/model/MessageId;I)V +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->(JLjava/lang/String;Lorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJJIZJLjava/util/Set;Ljava/util/Set;IJJZZLjava/util/List;ZJZJLorg/thoughtcrime/securesms/database/model/MessageId;ILorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras;)V HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getExpireStarted()J @@ -24600,6 +23954,7 @@ HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getExpiresIn()J HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getFromDeviceId()I HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getId()J HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getIdentityKeyMismatches()Ljava/util/Set; +HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getMessageExtras()Lorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras; HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getNetworkFailures()Ljava/util/Set; HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getNotifiedTimestamp()J HSPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getOriginalMessageId()Lorg/thoughtcrime/securesms/database/model/MessageId; @@ -24647,7 +24002,7 @@ HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord$$ExternalSyntheti HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->$r8$lambda$61cfVwuT9NopES3EvrpU58ByOrs(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->$r8$lambda$yFErtnyhgG1o4FUJh3c90u9IkrI(Ljava/util/Set;Lorg/thoughtcrime/securesms/attachments/DatabaseAttachment;)Z HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->()V -HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->(JLorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJZJLjava/lang/String;Lorg/thoughtcrime/securesms/mms/SlideDeck;JLjava/util/Set;Ljava/util/Set;IJJZZLorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;Ljava/util/List;ZLjava/util/List;ZZJZJLorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;Lorg/thoughtcrime/securesms/payments/Payment;Lorg/thoughtcrime/securesms/database/CallTable$Call;JLorg/thoughtcrime/securesms/database/model/MessageId;Lorg/thoughtcrime/securesms/database/model/MessageId;IZ)V +HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->(JLorg/thoughtcrime/securesms/recipients/Recipient;ILorg/thoughtcrime/securesms/recipients/Recipient;JJJZJLjava/lang/String;Lorg/thoughtcrime/securesms/mms/SlideDeck;JLjava/util/Set;Ljava/util/Set;IJJZZLorg/thoughtcrime/securesms/database/model/Quote;Ljava/util/List;Ljava/util/List;ZLjava/util/List;ZZJZJLorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList;Lorg/thoughtcrime/securesms/database/model/StoryType;Lorg/thoughtcrime/securesms/database/model/ParentStoryId;Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge;Lorg/thoughtcrime/securesms/payments/Payment;Lorg/thoughtcrime/securesms/database/CallTable$Call;JLorg/thoughtcrime/securesms/database/model/MessageId;Lorg/thoughtcrime/securesms/database/model/MessageId;IZLorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras;)V HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getCall()Lorg/thoughtcrime/securesms/database/CallTable$Call; HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getDisplayBody(Landroid/content/Context;)Landroid/text/SpannableString; HSPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getGiftBadge()Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge; @@ -24689,7 +24044,7 @@ HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities$Compa HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;->()V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;->(JLorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;Lorg/thoughtcrime/securesms/recipients/Recipient$Capability;)V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;->()V -HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;->([BLorg/signal/libsignal/zkgroup/groups/GroupMasterKey;[BLorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZZJLjava/lang/String;)V +HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;->([BLorg/signal/libsignal/zkgroup/groups/GroupMasterKey;[BLorg/thoughtcrime/securesms/database/IdentityTable$VerifiedStatus;ZZJLjava/lang/String;Z)V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->()V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->(Lorg/thoughtcrime/securesms/recipients/RecipientId;Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/groups/GroupId;Lorg/thoughtcrime/securesms/database/model/DistributionListId;Lorg/thoughtcrime/securesms/database/RecipientTable$RecipientType;ZJLorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Lorg/thoughtcrime/securesms/database/RecipientTable$VibrateState;Landroid/net/Uri;Landroid/net/Uri;ILorg/thoughtcrime/securesms/database/RecipientTable$RegisteredState;[BLorg/signal/libsignal/zkgroup/profiles/ExpiringProfileKeyCredential;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/profiles/ProfileName;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;ZJLjava/lang/String;Lorg/thoughtcrime/securesms/database/RecipientTable$UnidentifiedAccessMode;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$Capabilities;[BLorg/thoughtcrime/securesms/database/RecipientTable$MentionSetting;Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor;Ljava/lang/String;Ljava/lang/String;Lorg/thoughtcrime/securesms/database/model/RecipientRecord$SyncExtras;Lorg/thoughtcrime/securesms/recipients/Recipient$Extras;ZLjava/util/List;ZLorg/thoughtcrime/securesms/recipients/Recipient$HiddenState;Lorg/thoughtcrime/securesms/service/webrtc/links/CallLinkRoomId;Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState;)V HSPLorg/thoughtcrime/securesms/database/model/RecipientRecord;->getAbout()Ljava/lang/String; @@ -24784,6 +24139,7 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fge HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetisPinned(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetlastSeen(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetmeaningfulMessages(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Z +HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetmessageExtras(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Lorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetrecipient(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetsnippetUri(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;->-$$Nest$fgetthreadId(Lorg/thoughtcrime/securesms/database/model/ThreadRecord$Builder;)J @@ -24828,7 +24184,6 @@ HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getThreadId()J HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getType()J HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->getUnreadCount()I HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isArchived()Z -HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isForcedUnread()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isMessageRequestAccepted()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isOutgoing()Z HSPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isRead()Z @@ -24837,8 +24192,6 @@ HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonat HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion;->()V HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation;->()V -HSPLorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding;->(Landroid/view/View;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/view/View;Landroidx/constraintlayout/widget/ConstraintLayout;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V -HSPLorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding; HSPLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->(Lorg/thoughtcrime/securesms/components/InputPanel;Landroid/widget/ImageButton;Landroidx/constraintlayout/widget/Barrier;Lorg/thoughtcrime/securesms/components/InputPanel;Lorg/thoughtcrime/securesms/components/AnimatingToggle;Landroid/view/View;Landroidx/constraintlayout/widget/Barrier;Lcom/google/android/material/imageview/ShapeableImageView;Landroidx/appcompat/widget/AppCompatTextView;Lorg/thoughtcrime/securesms/components/ComposeText;Lorg/thoughtcrime/securesms/components/emoji/EmojiToggle;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/components/HidingLinearLayout;Landroidx/appcompat/widget/AppCompatImageButton;Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/components/LinkPreviewView;Lorg/thoughtcrime/securesms/components/HidingLinearLayout;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/components/QuoteView;Lorg/thoughtcrime/securesms/components/MicrophoneRecorderView;Lorg/thoughtcrime/securesms/components/SendButton;Landroid/widget/ImageButton;Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;)V HSPLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding; HSPLorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputPanel; @@ -24849,17 +24202,18 @@ HSPLorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding;->bind(La HSPLorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding;->getRoot()Landroidx/constraintlayout/widget/ConstraintLayout; HSPLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;Landroidx/appcompat/widget/AppCompatImageView;Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;Landroid/widget/TextView;Lcom/pnikosis/materialishprogress/ProgressWheel;Landroidx/appcompat/widget/AppCompatImageView;)V HSPLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding; -HSPLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->getRoot()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; HSPLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->(Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/avatar/view/AvatarView;Lorg/thoughtcrime/securesms/conversation/ConversationTitleView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/components/FromTextView;Landroidx/appcompat/widget/AppCompatImageView;Landroid/widget/TextView;)V HSPLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding; HSPLorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;->getRoot()Lorg/thoughtcrime/securesms/conversation/ConversationTitleView; +HSPLorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding;->(Lcom/google/android/material/card/MaterialCardView;Landroid/widget/ImageView;Landroid/widget/ImageView;Landroid/widget/TextView;)V +HSPLorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding; +HSPLorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding;->getRoot()Lcom/google/android/material/card/MaterialCardView; HSPLorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding;->(Landroid/view/View;Landroidx/constraintlayout/widget/Guideline;Landroidx/appcompat/widget/AppCompatImageView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;Landroidx/constraintlayout/widget/Guideline;)V HSPLorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding; HSPLorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding;->inflate(Landroid/view/LayoutInflater;Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding; HSPLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;Landroid/view/ViewStub;Landroid/view/View;Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;Landroid/widget/FrameLayout;Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar;Landroidx/constraintlayout/widget/Barrier;Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;Lcom/google/android/material/button/MaterialButton;Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding;Landroidx/constraintlayout/widget/Barrier;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectRecyclerView;Landroid/widget/FrameLayout;Landroid/view/ViewStub;Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding;Landroid/widget/FrameLayout;Landroid/widget/ImageView;Landroid/view/View;Landroidx/fragment/app/FragmentContainerView;Landroidx/fragment/app/FragmentContainerView;Landroidx/fragment/app/FragmentContainerView;Landroid/widget/FrameLayout;Landroid/view/ViewStub;Landroid/view/ViewStub;Landroid/view/ViewStub;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/ConversationScrollToView;Lorg/thoughtcrime/securesms/components/ConversationScrollToView;Lorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;Landroid/view/View;Landroid/view/ViewStub;Landroid/view/ViewStub;)V HSPLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; -HSPLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; -HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/components/ExpirationTimerView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView;Lcom/google/android/material/imageview/ShapeableImageView;Landroid/widget/Space;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V +HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Lorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;Lorg/thoughtcrime/securesms/components/ExpirationTimerView;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView;Lcom/google/android/material/imageview/ShapeableImageView;Landroid/widget/Space;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding; HSPLorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding;->getRoot()Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout; HSPLorg/thoughtcrime/securesms/dependencies/ApplicationDependencies$$ExternalSyntheticLambda0;->()V @@ -25065,7 +24419,6 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->access$createPage(Lorg/thoughtcrime/securesms/emoji/EmojiJsonParser;Ljava/lang/String;Ljava/lang/String;Lcom/fasterxml/jackson/databind/JsonNode;Lkotlin/jvm/functions/Function2;)Lorg/thoughtcrime/securesms/components/emoji/EmojiPageModel; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->buildEmojiSourceFromNode(Lcom/fasterxml/jackson/databind/JsonNode;Lkotlin/jvm/functions/Function2;)Lorg/thoughtcrime/securesms/emoji/ParsedEmojiData; -HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->createPage(Ljava/lang/String;Ljava/lang/String;Lcom/fasterxml/jackson/databind/JsonNode;Lkotlin/jvm/functions/Function2;)Lorg/thoughtcrime/securesms/components/emoji/EmojiPageModel; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->getDataPages$lambda$0(Lkotlin/jvm/functions/Function2;Ljava/lang/Object;Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->getDataPages(Ljava/lang/String;Lcom/fasterxml/jackson/databind/JsonNode;Lkotlin/jvm/functions/Function2;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/emoji/EmojiJsonParser;->getJumboPages(Lcom/fasterxml/jackson/databind/JsonNode;)Ljava/util/Map; @@ -25176,9 +24529,7 @@ HSPLorg/thoughtcrime/securesms/emoji/EmojiSource;->refresh()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->()V HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$getAssetsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$getPAGE_EMOTICONS$p()Lorg/thoughtcrime/securesms/components/emoji/EmojiPageModel; -HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$maxOrZero(Ljava/util/List;)I HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->getAssetsUri(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; -HSPLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->maxOrZero(Ljava/util/List;)I HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/emoji/EmojiFiles$Version;)V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4;->run()V HSPLorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda5;->(Landroid/content/Context;)V @@ -25305,8 +24656,6 @@ HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->()V HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->cancelMayHaveMessagesNotification(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/gcm/FcmFetchManager;->onForeground(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->()V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -25315,8 +24664,6 @@ HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->setParentRecycl HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->(II)V -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->(Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->attach(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$Callback;I)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->findFirstVisibleItemPositions(Landroidx/recyclerview/widget/RecyclerView$LayoutManager;)[I @@ -25324,7 +24671,6 @@ HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->findLastVis HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSet(Ljava/util/Set;II)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSetForMaximumDistance(Ljava/util/Set;[I[I)Ljava/util/Set; HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onLayoutChange(Landroid/view/View;IIIIIIII)V -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->performPlaybackUpdate(Landroidx/recyclerview/widget/RecyclerView;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackPolicy;->maxSimultaneousPlaybackInConversation()I HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->()V @@ -25334,10 +24680,8 @@ HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onCreat HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onResume(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onStart(Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->getCurrentHolder(I)Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder; HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->stopAndReleaseAssignedVideos(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->update(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;Ljava/util/Set;)V -HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->updateVideoDisplayPositionAndSize(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->()V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4VideoPlayer;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V @@ -26000,7 +25344,6 @@ HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobCountForFactory(Ljava HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobCountForFactoryAndQueue(Ljava/lang/String;Ljava/lang/String;)I HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getJobSpec(Ljava/lang/String;)Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getMigrationJob()Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec; -HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getPendingJobsWithNoDependenciesInCreatedOrder(J)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->getSingleLayerOfDependencySpecsThatDependOnJob(Ljava/lang/String;)Ljava/util/List; HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->hasEligibleRunTime(Lorg/thoughtcrime/securesms/jobmanager/persistence/JobSpec;J)Z HSPLorg/thoughtcrime/securesms/jobs/FastJobStorage;->init()V @@ -26600,8 +25943,6 @@ HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getTheme()Lorg/thoughtc HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getUniversalExpireTimer()I HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getUseCompactNavigationBar()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isBackupEnabled()Z -HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isEnterKeySends()Z -HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isLinkPreviewsEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isMessageNotificationsEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isMessageVibrateEnabled()Z HSPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isPreferSystemContactPhotos()Z @@ -26692,28 +26033,6 @@ HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->(Lorg/thoughtcri HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->getCurrentWallpaper()Lorg/thoughtcrime/securesms/database/model/databaseprotos/Wallpaper; HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->getWallpaper()Lorg/thoughtcrime/securesms/wallpaper/ChatWallpaper; HSPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->hasWallpaperSet()Z -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->forNoLinks()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Creator;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLorg/thoughtcrime/securesms/linkpreview/LinkPreview;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLorg/thoughtcrime/securesms/linkpreview/LinkPreview;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasContent()Z -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->invoke()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->()V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Landroidx/lifecycle/SavedStateHandle;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;Z)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Landroidx/lifecycle/SavedStateHandle;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getLinkPreviewState()Lio/reactivex/rxjava3/core/Flowable; -HSPLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getSavedLinkPreviewState()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; HSPLorg/thoughtcrime/securesms/logging/CustomSignalProtocolLogger;->()V HSPLorg/thoughtcrime/securesms/logging/CustomSignalProtocolLogger;->log(ILjava/lang/String;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/logging/PersistentLogger$Companion;->()V @@ -26805,10 +26124,10 @@ HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetbuttonL HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetbuttonText(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/MegaphoneText; HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetcanSnooze(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetevent(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetimageRequest(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/mms/GlideRequest; HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetimageRes(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)I HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetlottieRes(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)I HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetonVisibleListener(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/Megaphone$EventListener; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetrequestBuilder(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lcom/bumptech/glide/RequestBuilder; HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetsecondaryButtonListener(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/Megaphone$EventListener; HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetsecondaryButtonText(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/MegaphoneText; HSPLorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;->-$$Nest$fgetsnoozeListener(Lorg/thoughtcrime/securesms/megaphone/Megaphone$Builder;)Lorg/thoughtcrime/securesms/megaphone/Megaphone$EventListener; @@ -26864,14 +26183,14 @@ HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneRepository;->resetDatabaseCach HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder$1;->()V HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder;->build(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;)Landroid/view/View; HSPLorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder;->buildOnboardingMegaphone(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/Megaphone;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;)Landroid/view/View; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18;->(Ljava/util/Map;J)V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18;->test(Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19;->()V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda17;->(Ljava/util/Map;J)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda17;->test(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18;->()V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19;->(Ljava/util/Map;)V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20;->(Ljava/util/Map;)V +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda21;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda21;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda2;->()V HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;)V @@ -26891,11 +26210,11 @@ HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->fromKey(Ljava/lang/S HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->getKey()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->hasKey(Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones$Event;->values()[Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$57Iylt9yWAB65XCua6kCFNHv3Ho(Ljava/util/Map$Entry;)Ljava/lang/Long; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$Jd3YY1Tctc615OoR-BunWBsX5AM(Ljava/lang/Long;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$StkmuqSPG82Z8-YWKFWZC31YUUs(Ljava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$bfAOsFTMV105nBLDPhyo5-_RYW0(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$7er3eAvNtTug89CSaqVr7SviZ90(Ljava/lang/Long;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$I70uX1Te7WxnEGzx3tWwyzNiUZA(Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$Rs6Jyq6dKzpIcD33grkTfugc0n4(Ljava/util/Map$Entry;)Ljava/lang/Long; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$jKOYs4kAlzGKOSd0Gb2wil_axMM(Ljava/util/Map;JLjava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$lDKTYWhRKrjSYBJT-OUhfMkGgvY(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->$r8$lambda$ya9b6y2SFOc06_b4NHtqa2lYZ44(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MegaphoneRecord;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$sfgetALWAYS()Lorg/thoughtcrime/securesms/megaphone/MegaphoneSchedule; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->-$$Nest$sfgetNEVER()Lorg/thoughtcrime/securesms/megaphone/MegaphoneSchedule; @@ -26914,10 +26233,10 @@ HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->forRecord(Landroid/content HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->getNextMegaphone(Landroid/content/Context;Ljava/util/Map;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$getNextMegaphone$0(Ljava/util/Map;JLjava/util/Map$Entry;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$getNextMegaphone$1(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MegaphoneRecord;)Lorg/thoughtcrime/securesms/megaphone/Megaphone; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$22(Ljava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$23(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$24(Ljava/util/Map$Entry;)Ljava/lang/Long; -HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$25(Ljava/lang/Long;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$21(Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$22(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map$Entry;)Z +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$23(Ljava/util/Map$Entry;)Ljava/lang/Long; +HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->lambda$timeSinceLastDonatePrompt$24(Ljava/lang/Long;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowAddAProfilePhotoMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowBackupSchedulePermissionMegaphone(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowGrantFullScreenIntentPermission(Landroid/content/Context;)Z @@ -26927,10 +26246,31 @@ HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowRemoteMegaphone( HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowSetUpYourUsernameMegaphone(Ljava/util/Map;)Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->shouldShowTurnOffCircumventionMegaphone()Z HSPLorg/thoughtcrime/securesms/megaphone/Megaphones;->timeSinceLastDonatePrompt(Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event;Ljava/util/Map;)J +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$AddPhotoCardViewHolder;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$AddPhotoCardViewHolder;->getBackgroundColor()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$AddPhotoCardViewHolder;->getButtonStringRes()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$AddPhotoCardViewHolder;->getImageRes()I HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;)V HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->buildData()Ljava/util/List; HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->getItemCount()I -HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView;->-$$Nest$sfgetTAG()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->getItemId(I)J +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->getItemViewType(I)I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->onBindViewHolder(Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder;I)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Landroidx/recyclerview/widget/RecyclerView$ViewHolder; +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter;->onCreateViewHolder(Landroid/view/ViewGroup;I)Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder; +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$ActionClickListener;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder;Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$ActionClickListener;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder;->bind(Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$ActionClickListener;Lorg/thoughtcrime/securesms/megaphone/MegaphoneActionController;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$GroupCardViewHolder;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$GroupCardViewHolder;->getBackgroundColor()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$GroupCardViewHolder;->getButtonStringRes()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$GroupCardViewHolder;->getImageRes()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$InviteCardViewHolder;->(Landroid/view/View;)V +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$InviteCardViewHolder;->getBackgroundColor()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$InviteCardViewHolder;->getButtonStringRes()I +HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$InviteCardViewHolder;->getImageRes()I HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView;->()V HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView;->initialize(Landroid/content/Context;)V @@ -26962,29 +26302,29 @@ HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository;->getRemoteMe HSPLorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository;->hasRemoteMegaphoneToShow(Z)Z HSPLorg/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule;->()V HSPLorg/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule;->shouldDisplay(IJJJ)Z -HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule$Companion;->()V -HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule;->()V -HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule;->shouldDisplay(IJJJ)Z HSPLorg/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver;->()V HSPLorg/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver;->startOrUpdateAlarm(Landroid/content/Context;)V +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo$Companion;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->()V -HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->(IILjava/lang/String;)V -HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->getDescription()Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->(IILjava/lang/String;Z)V +HSPLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->(IILjava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->()V HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/GroupInfo;Ljava/util/List;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;)V -HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component2()Lorg/thoughtcrime/securesms/messagerequests/GroupInfo; -HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component3()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component4()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->()V HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getMessageRequestState(Lorg/thoughtcrime/securesms/recipients/Recipient;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getRecipientInfo(Lorg/thoughtcrime/securesms/recipients/RecipientId;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; -HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->$values()[Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState$Companion;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State;->$values()[Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State; +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State;->()V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->()V -HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State;Z)V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->(Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->equals(Ljava/lang/Object;)Z +HSPLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->isAccepted()Z HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/messages/IncomingMessageObserver$2;->(Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver;)V @@ -27130,33 +26470,6 @@ HSPLorg/thoughtcrime/securesms/mms/AttachmentManager;->()V HSPLorg/thoughtcrime/securesms/mms/AttachmentManager;->(Landroid/content/Context;Landroid/view/View;Lorg/thoughtcrime/securesms/mms/AttachmentManager$AttachmentListener;)V HSPLorg/thoughtcrime/securesms/mms/AttachmentStreamUriLoader$Factory;->()V HSPLorg/thoughtcrime/securesms/mms/DecryptableStreamUriLoader$Factory;->(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/mms/GlideApp;->get(Landroid/content/Context;)Lcom/bumptech/glide/Glide; -HSPLorg/thoughtcrime/securesms/mms/GlideApp;->with(Landroid/content/Context;)Lorg/thoughtcrime/securesms/mms/GlideRequests; -HSPLorg/thoughtcrime/securesms/mms/GlideApp;->with(Landroid/view/View;)Lorg/thoughtcrime/securesms/mms/GlideRequests; -HSPLorg/thoughtcrime/securesms/mms/GlideApp;->with(Landroidx/fragment/app/Fragment;)Lorg/thoughtcrime/securesms/mms/GlideRequests; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->()V -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lorg/thoughtcrime/securesms/mms/GlideOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->autoClone()Lcom/bumptech/glide/request/BaseRequestOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->autoClone()Lorg/thoughtcrime/securesms/mms/GlideOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->clone()Lcom/bumptech/glide/request/BaseRequestOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->clone()Lorg/thoughtcrime/securesms/mms/GlideOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->lock()Lcom/bumptech/glide/request/BaseRequestOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideOptions;->lock()Lorg/thoughtcrime/securesms/mms/GlideOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/RequestManager;Ljava/lang/Class;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lcom/bumptech/glide/RequestBuilder; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->apply(Lcom/bumptech/glide/request/BaseRequestOptions;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->diskCacheStrategy(Lcom/bumptech/glide/load/engine/DiskCacheStrategy;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->error(Landroid/graphics/drawable/Drawable;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->load(Ljava/lang/Object;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->override(I)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->override(II)Lcom/bumptech/glide/request/BaseRequestOptions; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->override(II)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequest;->transform(Lcom/bumptech/glide/load/Transformation;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->(Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/manager/Lifecycle;Lcom/bumptech/glide/manager/RequestManagerTreeNode;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->as(Ljava/lang/Class;)Lcom/bumptech/glide/RequestBuilder; -HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->as(Ljava/lang/Class;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->asDrawable()Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/mms/GlideRequests;->setRequestOptions(Lcom/bumptech/glide/request/RequestOptions;)V HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->()V HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->(Lorg/thoughtcrime/securesms/attachments/Attachment;)V HSPLorg/thoughtcrime/securesms/mms/ImageSlide;->hasImage()Z @@ -27204,7 +26517,6 @@ HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule$Companion;->setRegisterGlid HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->()V HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->()V HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->applyOptions(Landroid/content/Context;Lcom/bumptech/glide/GlideBuilder;)V -HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->isManifestParsingEnabled()Z HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->registerComponents(Landroid/content/Context;Lcom/bumptech/glide/Glide;Lcom/bumptech/glide/Registry;)V HSPLorg/thoughtcrime/securesms/mms/SignalGlideModule;->setRegisterGlideComponents(Lorg/thoughtcrime/securesms/mms/RegisterGlideComponents;)V HSPLorg/thoughtcrime/securesms/mms/Slide;->(Lorg/thoughtcrime/securesms/attachments/Attachment;)V @@ -27301,12 +26613,6 @@ HSPLorg/thoughtcrime/securesms/notifications/Configuration;->getMinimumMessageLa HSPLorg/thoughtcrime/securesms/notifications/Configuration;->getMinimumServiceEventCount()I HSPLorg/thoughtcrime/securesms/notifications/Configuration;->getServiceStartFailurePercentage()F HSPLorg/thoughtcrime/securesms/notifications/Configuration;->getWeeklyFailedQueueDrains()I -HSPLorg/thoughtcrime/securesms/notifications/MarkReadReceiver;->()V -HSPLorg/thoughtcrime/securesms/notifications/MarkReadReceiver;->process(Ljava/util/List;)V -HSPLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;)[Landroid/service/notification/StatusBarNotification; -HSPLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->()V -HSPLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->cancelAllMessageNotifications(Landroid/content/Context;Ljava/util/Set;)V -HSPLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->cancelLegacy(Landroid/content/Context;I)V HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;Ljava/lang/String;)Landroid/app/NotificationChannelGroup; HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationChannelGroup;)Z HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationChannel;)Ljava/lang/String; @@ -27334,23 +26640,9 @@ HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->onUpgrade(La HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->setLedPreference(Landroid/app/NotificationChannel;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->setVibrationEnabled(Landroid/app/NotificationChannel;Z)V HSPLorg/thoughtcrime/securesms/notifications/NotificationChannels;->supported()Z -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11;->(Ljava/lang/Runnable;Ljava/lang/Throwable;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11;->run()V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6;->run()V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7;->run()V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$0MHafWJB8CwezqWVbncoEq_a3Xg(Ljava/lang/Runnable;Ljava/lang/Throwable;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$dClU2s1olLC6PkCR84cT7C2dqfA(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$mDf5wVelzwBtc0Vgo342P1gCo0c(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->(Landroid/app/Application;)V HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->getNotifier()Lorg/thoughtcrime/securesms/notifications/MessageNotifier; -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$runOnLimiter$11(Ljava/lang/Runnable;Ljava/lang/Throwable;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$3(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$4(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->runOnLimiter(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->setVisibleThread(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;)V -HSPLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->updateNotification(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->()V HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->()V HSPLorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics;->getConfiguration()Lorg/thoughtcrime/securesms/notifications/Configuration; @@ -27388,25 +26680,12 @@ HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion;->forCo HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId$Creator;->()V HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->()V HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->(JLjava/lang/Long;)V -HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->getGroupStoryId()Ljava/lang/Long; -HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->getThreadId()J HSPLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->hashCode()I HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->()V HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->access$updateBadge(Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;Landroid/content/Context;I)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->updateBadge(Landroid/content/Context;I)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$updateNotification$7;->(Ljava/util/Set;)V HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->()V HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->(Landroid/app/Application;)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->clearReminderInternal(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->setVisibleThread(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;)V -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt;->access$getDisplayedNotificationIds(Landroid/app/NotificationManager;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt;->getDisplayedNotificationIds(Landroid/app/NotificationManager;)Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->()V -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->()V -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent; HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->()V HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion;->getEMPTY()Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; @@ -27416,15 +26695,6 @@ HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationIt HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->()V HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->(Ljava/util/List;Ljava/util/List;Ljava/util/List;)V HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->access$getEMPTY$cp()Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getConversations()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getMuteFilteredMessages()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getProfileFilteredMessages()Ljava/util/List; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getThreadsWithMostRecentNotificationFromSelf()Ljava/util/Set; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->isEmpty()Z -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->toString()Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->()V -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->()V -HSPLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->constructNotificationState(Ljava/util/Map;Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfile;)Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; HSPLorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/permissions/Permissions;->$r8$lambda$Q0AcdMcPXUgr1QQ_HDTcoSx0sHo(Landroid/content/Context;Ljava/lang/String;)Z @@ -27432,26 +26702,15 @@ HSPLorg/thoughtcrime/securesms/permissions/Permissions;->()V HSPLorg/thoughtcrime/securesms/permissions/Permissions;->hasAll(Landroid/content/Context;[Ljava/lang/String;)Z HSPLorg/thoughtcrime/securesms/permissions/Permissions;->isRuntimePermissionsRequired()Z HSPLorg/thoughtcrime/securesms/permissions/Permissions;->lambda$hasAll$2(Landroid/content/Context;Ljava/lang/String;)Z -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->-$$Nest$fgetcountryCode(Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;)I -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->(Ljava/lang/String;ILjava/lang/String;)V -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->getCountryCode()I -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->()V -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->get(Landroid/content/Context;)Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter; -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->parseAreaCode(Ljava/lang/String;I)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrint(Ljava/lang/String;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrintFormat(Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/pin/SvrRepository;->()V HSPLorg/thoughtcrime/securesms/pin/SvrRepository;->()V HSPLorg/thoughtcrime/securesms/pin/SvrRepository;->onRegistrationComplete(Lorg/whispersystems/signalservice/api/kbs/MasterKey;Ljava/lang/String;ZZ)V HSPLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->(Ljava/lang/String;)V -HSPLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->toString()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->()V HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/io/InputStream; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarDirectory(Landroid/content/Context;)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/io/File; -HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFile(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/File; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getAvatarFileDetails(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->getOutputStream(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;Z)Ljava/io/OutputStream; HSPLorg/thoughtcrime/securesms/profiles/AvatarHelper;->hasAvatar(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/RecipientId;)Z @@ -27584,27 +26843,20 @@ HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->(Land HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->clear()V HSPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->init(Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->run()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;)V -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3;->onChanged(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4;->()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4;->contentsMatch(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda5;->()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda5;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda6;->()V -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$4o-q--s8xb4fbde9teliyQxlyww(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$bhowCzW_4HRIO1hvMslBpl08AJE(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$pGM0bNiB06y_fkMUloVDwF8BcLs(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->()V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->fetchAndCacheRecipientFromDisk(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->get()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->getId()Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->getLiveData()Landroidx/lifecycle/LiveData; -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$1(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$2(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Object;)Lorg/thoughtcrime/securesms/recipients/Recipient; -HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$observeForever$6(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->observable()Lio/reactivex/rxjava3/core/Observable; HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->observeForever(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V HSPLorg/thoughtcrime/securesms/recipients/LiveRecipient;->refresh()Lorg/thoughtcrime/securesms/recipients/LiveRecipient; @@ -27659,7 +26911,6 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getAutoChatColor()Lorg/tho HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getAvatarColor()Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getBadges()Ljava/util/List; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getCombinedAboutAndEmoji()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getContactPhoto()Lorg/thoughtcrime/securesms/contacts/avatars/ContactPhoto; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getDisplayName(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getDisplayNameOrUsername(Landroid/content/Context;)Ljava/lang/String; @@ -27670,7 +26921,6 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getFallbackContactPhotoDra HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getGroupName(Landroid/content/Context;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getId()Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getNameFromLocalData(Landroid/content/Context;)Ljava/lang/String; -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getPhoneNumberSharing()Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileAvatar()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileAvatarFileDetails()Lorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->getProfileKey()[B @@ -27684,7 +26934,6 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasSameContent(Lorg/though HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasServiceId()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hasWallpaper()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->hashCode()I -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isActiveGroup()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isBlocked()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isCallLink()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->isDistributionList()Z @@ -27714,7 +26963,6 @@ HSPLorg/thoughtcrime/securesms/recipients/Recipient;->resolvedList(Ljava/util/Co HSPLorg/thoughtcrime/securesms/recipients/Recipient;->self()Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/Recipient;->shouldBlurAvatar()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->shouldHideStory()Z -HSPLorg/thoughtcrime/securesms/recipients/Recipient;->shouldShowE164()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->showVerified()Z HSPLorg/thoughtcrime/securesms/recipients/Recipient;->trustedPush(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/whispersystems/signalservice/api/push/ServiceId$PNI;Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/Recipient; HSPLorg/thoughtcrime/securesms/recipients/RecipientDetails$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V @@ -27738,6 +26986,7 @@ HSPLorg/thoughtcrime/securesms/recipients/RecipientId$Serializer;->()V HSPLorg/thoughtcrime/securesms/recipients/RecipientId$Serializer;->(Lorg/thoughtcrime/securesms/recipients/RecipientId$Serializer-IA;)V HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->()V HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->(J)V +HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->equals(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(J)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Ljava/lang/String;)Lorg/thoughtcrime/securesms/recipients/RecipientId; HSPLorg/thoughtcrime/securesms/recipients/RecipientId;->from(Lorg/whispersystems/signalservice/api/push/ServiceId;)Lorg/thoughtcrime/securesms/recipients/RecipientId; @@ -27908,7 +27157,6 @@ HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->()V HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->getStickerFeatureAvailability(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->getStickerFeatureAvailabilitySync()Ljava/lang/Boolean; HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->lambda$getStickerFeatureAvailability$2(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository$Callback;)V -HSPLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->searchByEmoji(Ljava/lang/String;)Lio/reactivex/rxjava3/core/Single; HSPLorg/thoughtcrime/securesms/storage/StorageSyncHelper$$ExternalSyntheticLambda0;->()V HSPLorg/thoughtcrime/securesms/storage/StorageSyncHelper$$ExternalSyntheticLambda0;->generate()[B HSPLorg/thoughtcrime/securesms/storage/StorageSyncHelper;->$r8$lambda$Qu9GyOxIHYeSe2KLWGmWWrZGbxY()[B @@ -28083,12 +27331,9 @@ HSPLorg/thoughtcrime/securesms/util/AppStartup;->onCriticalRenderEventStart()V HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->()V HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->getFallback(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;I)Landroid/graphics/drawable/Drawable; HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->loadIconIntoImageView(Lorg/thoughtcrime/securesms/recipients/Recipient;Landroid/widget/ImageView;I)V -HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->request(Lorg/thoughtcrime/securesms/mms/GlideRequest;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;ILcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->request(Lorg/thoughtcrime/securesms/mms/GlideRequest;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;ZILcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->requestCircle(Lorg/thoughtcrime/securesms/mms/GlideRequest;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;I)Lorg/thoughtcrime/securesms/mms/GlideRequest; -HSPLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->$values()[Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState; -HSPLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->()V -HSPLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->(Ljava/lang/String;I)V +HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->request(Lcom/bumptech/glide/RequestBuilder;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;ILcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;)Lcom/bumptech/glide/RequestBuilder; +HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->request(Lcom/bumptech/glide/RequestBuilder;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;ZILcom/bumptech/glide/load/resource/bitmap/BitmapTransformation;)Lcom/bumptech/glide/RequestBuilder; +HSPLorg/thoughtcrime/securesms/util/AvatarUtil;->requestCircle(Lcom/bumptech/glide/RequestBuilder;Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;I)Lcom/bumptech/glide/RequestBuilder; HSPLorg/thoughtcrime/securesms/util/ByteUnit$1;->(Ljava/lang/String;I)V HSPLorg/thoughtcrime/securesms/util/ByteUnit$1;->(Ljava/lang/String;ILorg/thoughtcrime/securesms/util/ByteUnit$1-IA;)V HSPLorg/thoughtcrime/securesms/util/ByteUnit$2;->(Ljava/lang/String;I)V @@ -28123,9 +27368,6 @@ HSPLorg/thoughtcrime/securesms/util/CachedInflater;->cacheUntilLimit(ILandroid/v HSPLorg/thoughtcrime/securesms/util/CachedInflater;->clear()V HSPLorg/thoughtcrime/securesms/util/CachedInflater;->from(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/CachedInflater; HSPLorg/thoughtcrime/securesms/util/CachedInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View; -HSPLorg/thoughtcrime/securesms/util/CenteredImageSpan;->(Landroid/graphics/drawable/Drawable;)V -HSPLorg/thoughtcrime/securesms/util/CenteredImageSpan;->draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V -HSPLorg/thoughtcrime/securesms/util/CenteredImageSpan;->getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I HSPLorg/thoughtcrime/securesms/util/CharacterCalculator;->()V HSPLorg/thoughtcrime/securesms/util/ConfigurationUtil;->getFontScale(Landroid/content/res/Configuration;)F HSPLorg/thoughtcrime/securesms/util/ConfigurationUtil;->getNightModeConfiguration(Landroid/content/Context;)I @@ -28149,11 +27391,6 @@ HSPLorg/thoughtcrime/securesms/util/DateUtils;->isWithin-HG0u8IE(JJ)Z HSPLorg/thoughtcrime/securesms/util/Debouncer;->(J)V HSPLorg/thoughtcrime/securesms/util/Debouncer;->(JLjava/util/concurrent/TimeUnit;)V HSPLorg/thoughtcrime/securesms/util/Debouncer;->publish(Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->getLazyDefault()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->(Ljava/lang/Object;)V HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->getValue()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/DefaultValueLiveData;->postValue(Ljava/lang/Object;)V @@ -28194,6 +27431,7 @@ HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getDefaultMaxBackoff()J HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getInteger(Ljava/lang/String;I)I HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getLong(Ljava/lang/String;J)J HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->gifSearchAvailable()Z HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->groupLimits()Lorg/thoughtcrime/securesms/groups/SelectionLimits; HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->init()V HSPLorg/thoughtcrime/securesms/util/FeatureFlags;->instantVideoPlayback()Z @@ -28241,10 +27479,8 @@ HSPLorg/thoughtcrime/securesms/util/JsonUtils;->getMapper()Lcom/fasterxml/jackso HSPLorg/thoughtcrime/securesms/util/JsonUtils;->toJson(Ljava/lang/Object;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/LRUCache;->(I)V HSPLorg/thoughtcrime/securesms/util/LRUCache;->removeEldestEntry(Ljava/util/Map$Entry;)Z -HSPLorg/thoughtcrime/securesms/util/LeakyBucketLimiter$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter;)V HSPLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->()V HSPLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->(IJLandroid/os/Handler;)V -HSPLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->run(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/ListenableFutureTask$2;->(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;)V HSPLorg/thoughtcrime/securesms/util/ListenableFutureTask$2;->run()V HSPLorg/thoughtcrime/securesms/util/ListenableFutureTask;->-$$Nest$fgetlisteners(Lorg/thoughtcrime/securesms/util/ListenableFutureTask;)Ljava/util/List; @@ -28292,8 +27528,6 @@ HSPLorg/thoughtcrime/securesms/util/LocaleUtil;->getLocaleDefaults()Ljava/util/L HSPLorg/thoughtcrime/securesms/util/LongClickMovementMethod$1;->(Lorg/thoughtcrime/securesms/util/LongClickMovementMethod;)V HSPLorg/thoughtcrime/securesms/util/LongClickMovementMethod;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/util/LongClickMovementMethod;->getInstance(Landroid/content/Context;)Lorg/thoughtcrime/securesms/util/LongClickMovementMethod; -HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIII)V -HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1;->(Landroid/app/Activity;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1;->invoke(I)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; @@ -28312,7 +27546,6 @@ HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->getStatus HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet;->getToolbarColorRes()I HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$OnScrollListener;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$OnScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V -HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->$r8$lambda$T0JnL_tDtAWK4RNMpbrK8xUunio(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->()V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/app/Activity;Ljava/util/List;Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->(Landroid/app/Activity;Ljava/util/List;Ljava/util/List;Landroidx/lifecycle/LifecycleOwner;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -28323,7 +27556,6 @@ HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getActiveColorSet( HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getInactiveColorSet()Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$ColorSet; HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->setColorImmediate()V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->setToolbarColor(I)V -HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState$lambda$7$lambda$6(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V HSPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState(Z)V HSPLorg/thoughtcrime/securesms/util/MediaUtil$1;->()V HSPLorg/thoughtcrime/securesms/util/MediaUtil$SlideType;->$values()[Lorg/thoughtcrime/securesms/util/MediaUtil$SlideType; @@ -28366,7 +27598,6 @@ HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->getNetworkInfo(Landroid/conten HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->isConnected(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/NetworkUtil;->isConnectedWifi(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator;->()V -HSPLorg/thoughtcrime/securesms/util/NullableSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)V HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/recipients/Recipient;)V HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda2;->()V @@ -28396,28 +27627,17 @@ HSPLorg/thoughtcrime/securesms/util/ProjectionList;->()V HSPLorg/thoughtcrime/securesms/util/ProjectionList;->()V HSPLorg/thoughtcrime/securesms/util/ProjectionList;->(I)V HSPLorg/thoughtcrime/securesms/util/ProjectionList;->(IILkotlin/jvm/internal/DefaultConstructorMarker;)V -HSPLorg/thoughtcrime/securesms/util/ProjectionList;->close()V -HSPLorg/thoughtcrime/securesms/util/ProjectionList;->getSize()I -HSPLorg/thoughtcrime/securesms/util/ProjectionList;->size()I HSPLorg/thoughtcrime/securesms/util/PushCharacterCalculator$1;->()V HSPLorg/thoughtcrime/securesms/util/PushCharacterCalculator;->()V HSPLorg/thoughtcrime/securesms/util/PushCharacterCalculator;->()V HSPLorg/thoughtcrime/securesms/util/RemoteDeprecation;->()V HSPLorg/thoughtcrime/securesms/util/RemoteDeprecation;->getTimeUntilDeprecation()J HSPLorg/thoughtcrime/securesms/util/RemoteDeprecation;->getTimeUntilDeprecation(Ljava/lang/String;JLjava/lang/String;)J -HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt$delegate$1;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)Lkotlin/properties/ReadWriteProperty; -HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Ljava/lang/Object;)Lkotlin/properties/ReadWriteProperty; -HSPLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->invoke()Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory; HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion;->()V HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion;->factoryProducer(Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;)Lkotlin/jvm/functions/Function0; HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->()V -HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->(Lkotlin/jvm/functions/Function1;Landroidx/savedstate/SavedStateRegistryOwner;)V -HSPLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;Landroidx/lifecycle/SavedStateHandle;)Landroidx/lifecycle/ViewModel; HSPLorg/thoughtcrime/securesms/util/ScreenDensity$1;->()V HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->()V HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->(Ljava/lang/String;I)V @@ -28425,10 +27645,8 @@ HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->get(Landroid/content/Context HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->getBucket()Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->isKnownDensity()Z HSPLorg/thoughtcrime/securesms/util/ScreenDensity;->xhdpiRelativeDensityScaleFactor(Ljava/lang/String;)F -HSPLorg/thoughtcrime/securesms/util/SearchUtil;->getHighlightedSpan(Ljava/util/Locale;Lorg/thoughtcrime/securesms/util/SearchUtil$StyleFactory;Landroid/text/Spannable;Ljava/lang/String;I)Landroid/text/Spannable; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getActivityManager(Landroid/content/Context;)Landroid/app/ActivityManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getAlarmManager(Landroid/content/Context;)Landroid/app/AlarmManager; -HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getAudioManager(Landroid/content/Context;)Landroid/media/AudioManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getConnectivityManager(Landroid/content/Context;)Landroid/net/ConnectivityManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getNotificationManager(Landroid/content/Context;)Landroid/app/NotificationManager; HSPLorg/thoughtcrime/securesms/util/ServiceUtil;->getPowerManager(Landroid/content/Context;)Landroid/os/PowerManager; @@ -28444,7 +27662,6 @@ HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onData HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onDataPostedToMain()V HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onMetadataLoadStarted()V HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onMetadataLoaded()V -HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onRenderFinished()V HSPLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->start()V HSPLorg/thoughtcrime/securesms/util/SignalProxyUtil;->()V HSPLorg/thoughtcrime/securesms/util/SignalProxyUtil;->startListeningToWebsocket()V @@ -28485,9 +27702,6 @@ HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->get(Ljava/lang/Object;)Ljava/l HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->processQueue()V HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/SoftHashMap;->trimStrongReferencesIfNecessary()V -HSPLorg/thoughtcrime/securesms/util/SpanUtil;->()V -HSPLorg/thoughtcrime/securesms/util/SpanUtil;->buildCenteredImageSpan(Landroid/graphics/drawable/Drawable;)Ljava/lang/CharSequence; -HSPLorg/thoughtcrime/securesms/util/SpanUtil;->space(ILorg/signal/core/util/DimensionUnit;)Ljava/lang/CharSequence; HSPLorg/thoughtcrime/securesms/util/StorageUtil;->getCleanFileName(Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->$values()[Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode;->()V @@ -28529,7 +27743,6 @@ HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->getUnidentifiedAcces HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->hasPromptedPushRegistration(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->hasSeenStickerIntroTooltip(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isBackupEnabled(Landroid/content/Context;)Z -HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isEnterSendsEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isIncognitoKeyboardEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isNotificationVibrateEnabled(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isNotificationsEnabled(Landroid/content/Context;)Z @@ -28577,7 +27790,6 @@ HSPLorg/thoughtcrime/securesms/util/Util;->hasItems(Ljava/util/Collection;)Z HSPLorg/thoughtcrime/securesms/util/Util;->hashCode([Ljava/lang/Object;)I HSPLorg/thoughtcrime/securesms/util/Util;->isDefaultSmsProvider(Landroid/content/Context;)Z HSPLorg/thoughtcrime/securesms/util/Util;->isEmpty(Ljava/lang/CharSequence;)Z -HSPLorg/thoughtcrime/securesms/util/Util;->isEmpty(Ljava/util/Collection;)Z HSPLorg/thoughtcrime/securesms/util/Util;->join(Ljava/util/Collection;Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/Util;->join([Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLorg/thoughtcrime/securesms/util/Util;->uri(Ljava/lang/String;)Landroid/net/Uri; @@ -28586,7 +27798,6 @@ HSPLorg/thoughtcrime/securesms/util/VersionTracker;->()V HSPLorg/thoughtcrime/securesms/util/VersionTracker;->getDaysSinceFirstInstalled(Landroid/content/Context;)J HSPLorg/thoughtcrime/securesms/util/VersionTracker;->getLastSeenVersion(Landroid/content/Context;)I HSPLorg/thoughtcrime/securesms/util/VersionTracker;->updateLastSeenVersion(Landroid/content/Context;)V -HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->drawAsTopItemDecoration(Landroid/view/View;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;I)V HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->getLifecycle(Landroid/view/View;)Landroidx/lifecycle/Lifecycle; HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->getVisible(Landroid/view/View;)Z HSPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->layoutIn(Landroid/view/View;Landroid/view/View;)V @@ -28604,32 +27815,22 @@ HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->(Lkotlin/jvm/functi HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; HSPLorg/thoughtcrime/securesms/util/ViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->(Landroidx/fragment/app/Fragment;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->invoke()Landroidx/savedstate/SavedStateRegistryOwner; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->(Landroidx/fragment/app/Fragment;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->(Lkotlin/jvm/functions/Function0;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->(Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V -HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->(Landroidx/fragment/app/Fragment;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Landroidx/fragment/app/Fragment; HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$5;->(Lkotlin/jvm/functions/Function0;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$5;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$5;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$6;->(Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelStore; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$7;->(Lkotlin/jvm/functions/Function0;Lkotlin/Lazy;)V +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$7;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +HSPLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$7;->invoke()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/ViewUtil;->dpToPx(I)I HSPLorg/thoughtcrime/securesms/util/ViewUtil;->findStubById(Landroid/view/View;I)Lorg/thoughtcrime/securesms/util/views/Stub; HSPLorg/thoughtcrime/securesms/util/ViewUtil;->getLeftMargin(Landroid/view/View;)I @@ -28681,10 +27882,6 @@ HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewAttac HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->registerFactory(Ljava/lang/Class;Lj$/util/function/Function;I)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->registerFactory(Ljava/lang/Class;Lorg/thoughtcrime/securesms/util/adapter/mapping/Factory;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->()V -HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areContentsTheSame(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Z -HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z -HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areItemsTheSame(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Z HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingModelList;->(Ljava/util/Collection;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->(Landroid/view/View;)V HSPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->onAttachedToWindow()V @@ -28707,18 +27904,7 @@ HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->(Ljava/uti HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->execute(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->lambda$execute$0(Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/concurrent/SerialExecutor;->scheduleNext()V -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->run()V -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->$r8$lambda$axI96jKiGgASw-5DyS1pXfSexxk(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->(Ljava/util/concurrent/Executor;)V -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->enqueue(Ljava/lang/Runnable;)Z -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->execute(Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->lambda$enqueue$0(Ljava/lang/Runnable;)V -HSPLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->scheduleNext()V -HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->()V -HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->(Ljava/lang/Object;)V -HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->notifyAllListeners()V -HSPLorg/thoughtcrime/securesms/util/concurrent/SettableFuture;->set(Ljava/lang/Object;)Z HSPLorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat;->()V HSPLorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat;->(Landroid/content/Context;)V HSPLorg/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper;->getUsersSelectedLocale(Landroid/content/Context;)Ljava/util/Locale; @@ -28799,14 +27985,11 @@ HSPLorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;->(Landroid/ HSPLorg/thoughtcrime/securesms/util/views/DarkOverflowToolbar;->init()V HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->(Landroid/view/ViewStub;)V HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->get()Ljava/lang/Object; -HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->isResolvable()Z HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->require()Ljava/lang/Object; HSPLorg/thoughtcrime/securesms/util/views/NullableStub;->resolved()Z HSPLorg/thoughtcrime/securesms/util/views/SlideUpWithSnackbarBehavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLorg/thoughtcrime/securesms/util/views/Stub;->(Landroid/view/ViewStub;)V HSPLorg/thoughtcrime/securesms/util/views/Stub;->get()Landroid/view/View; -HSPLorg/thoughtcrime/securesms/util/views/Stub;->getVisibility()I -HSPLorg/thoughtcrime/securesms/util/views/Stub;->isVisible()Z HSPLorg/thoughtcrime/securesms/util/views/Stub;->resolved()Z HSPLorg/thoughtcrime/securesms/util/views/Stub;->setVisibility(I)V HSPLorg/thoughtcrime/securesms/video/exo/ExoPlayerPool$Companion;->()V @@ -28865,7 +28048,7 @@ HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->getSender HSPLorg/whispersystems/signalservice/api/SignalServiceAccountManager;->setAccountAttributes(Lorg/whispersystems/signalservice/api/account/AccountAttributes;)V HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver$$ExternalSyntheticLambda0;->()V HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->(Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration;Lorg/whispersystems/signalservice/api/util/CredentialsProvider;Ljava/lang/String;Lorg/signal/libsignal/zkgroup/profiles/ClientZkProfileOperations;Z)V -HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->retrieveProfile(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +HSPLorg/whispersystems/signalservice/api/SignalServiceMessageReceiver;->retrieveProfile(Lorg/whispersystems/signalservice/api/push/SignalServiceAddress;Lj$/util/Optional;Lj$/util/Optional;Lorg/whispersystems/signalservice/api/profiles/SignalServiceProfile$RequestType;Ljava/util/Locale;)Lorg/signal/core/util/concurrent/ListenableFuture; HSPLorg/whispersystems/signalservice/api/SignalWebSocket$$ExternalSyntheticLambda0;->(Lio/reactivex/rxjava3/subjects/BehaviorSubject;)V HSPLorg/whispersystems/signalservice/api/SignalWebSocket$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V HSPLorg/whispersystems/signalservice/api/SignalWebSocket;->()V @@ -29106,9 +28289,9 @@ HSPLorg/whispersystems/signalservice/internal/configuration/SignalUrl;->getTrust HSPLorg/whispersystems/signalservice/internal/configuration/SignalUrl;->getUrl()Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda10;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda11;->()V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda12;->()V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda14;->()V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;Lorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;)V +HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda13;->()V +HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda9;->()V +HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->(Lorg/whispersystems/signalservice/internal/push/PushServiceSocket;Lorg/signal/core/util/concurrent/SettableFuture;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$1;->onResponse(Lokhttp3/Call;Lokhttp3/Response;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$2;->()V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder;->(Lokhttp3/OkHttpClient;Ljava/lang/String;Lj$/util/Optional;)V @@ -29139,9 +28322,9 @@ HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->jsonReque HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHandler;Lj$/util/Optional;)Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->makeServiceRequest(Ljava/lang/String;Ljava/lang/String;Lokhttp3/RequestBody;Ljava/util/Map;Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ResponseCodeHandler;Lj$/util/Optional;Z)Lokhttp3/Response; -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->retrieveVersionedProfile(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;Lj$/util/Optional;Ljava/util/Locale;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->retrieveVersionedProfile(Lorg/whispersystems/signalservice/api/push/ServiceId$ACI;Lorg/signal/libsignal/zkgroup/profiles/ProfileKey;Lj$/util/Optional;Ljava/util/Locale;)Lorg/signal/core/util/concurrent/ListenableFuture; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->setAccountAttributes(Lorg/whispersystems/signalservice/api/account/AccountAttributes;)V -HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->submitServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lj$/util/Optional;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; +HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->submitServiceRequest(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lj$/util/Optional;)Lorg/signal/core/util/concurrent/ListenableFuture; HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->validateConfiguration(Ljava/util/Map;)V HSPLorg/whispersystems/signalservice/internal/push/PushServiceSocket;->validateServiceResponse(Lokhttp3/Response;)Lokhttp3/Response; HSPLorg/whispersystems/signalservice/internal/push/VerifyAccountResponse;->(Ljava/lang/String;Ljava/lang/String;Z)V @@ -29163,14 +28346,6 @@ HSPLorg/whispersystems/signalservice/internal/util/JsonUtil;->fromJson(Ljava/lan HSPLorg/whispersystems/signalservice/internal/util/JsonUtil;->toJson(Ljava/lang/Object;)Ljava/lang/String; HSPLorg/whispersystems/signalservice/internal/util/Util;->immutableList([Ljava/lang/Object;)Ljava/util/List; HSPLorg/whispersystems/signalservice/internal/util/Util;->wait(Ljava/lang/Object;J)V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer;->(Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture;Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer;)V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers;->map(Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture;Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer;)Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->()V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->get()Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->get(JLjava/util/concurrent/TimeUnit;)Ljava/lang/Object; -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->notifyAllListeners()V -HSPLorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture;->setException(Ljava/lang/Throwable;)Z HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder;->()V HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder;->build()Lorg/whispersystems/signalservice/internal/websocket/ErrorMapper; HSPLorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper;->()V @@ -29339,6 +28514,7 @@ Landroidx/activity/ComponentActivity$2; Landroidx/activity/ComponentActivity$3; Landroidx/activity/ComponentActivity$4; Landroidx/activity/ComponentActivity$5; +Landroidx/activity/ComponentActivity$6; Landroidx/activity/ComponentActivity$Api19Impl; Landroidx/activity/ComponentActivity$NonConfigurationInstances; Landroidx/activity/ComponentActivity$ReportFullyDrawnExecutor; @@ -29350,6 +28526,8 @@ Landroidx/activity/FullyDrawnReporterOwner; Landroidx/activity/OnBackPressedCallback; Landroidx/activity/OnBackPressedDispatcher$LifecycleOnBackPressedCancellable; Landroidx/activity/OnBackPressedDispatcher$OnBackPressedCancellable; +Landroidx/activity/OnBackPressedDispatcher$addCallback$1; +Landroidx/activity/OnBackPressedDispatcher$addCancellableCallback$1; Landroidx/activity/OnBackPressedDispatcher; Landroidx/activity/OnBackPressedDispatcherOwner; Landroidx/activity/R$id; @@ -29419,8 +28597,6 @@ Landroidx/appcompat/view/SupportMenuInflater$MenuState; Landroidx/appcompat/view/SupportMenuInflater; Landroidx/appcompat/view/WindowCallbackWrapper; Landroidx/appcompat/view/menu/ActionMenuItem; -Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback; -Landroidx/appcompat/view/menu/ActionMenuItemView; Landroidx/appcompat/view/menu/BaseMenuPresenter; Landroidx/appcompat/view/menu/MenuBuilder$Callback; Landroidx/appcompat/view/menu/MenuBuilder$ItemInvoker; @@ -29428,10 +28604,8 @@ Landroidx/appcompat/view/menu/MenuBuilder; Landroidx/appcompat/view/menu/MenuItemImpl; Landroidx/appcompat/view/menu/MenuPresenter$Callback; Landroidx/appcompat/view/menu/MenuPresenter; -Landroidx/appcompat/view/menu/MenuView$ItemView; Landroidx/appcompat/view/menu/MenuView; Landroidx/appcompat/widget/ActionBarOverlayLayout$ActionBarVisibilityCallback; -Landroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback; Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton$1; Landroidx/appcompat/widget/ActionMenuPresenter$OverflowMenuButton; Landroidx/appcompat/widget/ActionMenuPresenter$PopupPresenterCallback; @@ -29451,7 +28625,6 @@ Landroidx/appcompat/widget/AppCompatDrawableManager; Landroidx/appcompat/widget/AppCompatEditText; Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper; Landroidx/appcompat/widget/AppCompatEmojiTextHelper; -Landroidx/appcompat/widget/AppCompatHintHelper; Landroidx/appcompat/widget/AppCompatImageButton; Landroidx/appcompat/widget/AppCompatImageHelper; Landroidx/appcompat/widget/AppCompatImageView; @@ -29538,6 +28711,14 @@ Landroidx/asynclayoutinflater/view/AsyncLayoutInflater$OnInflateFinishedListener Landroidx/asynclayoutinflater/view/AsyncLayoutInflater; Landroidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl$OutputConfigurationParamsApi24$$ExternalSyntheticBackport1; Landroidx/camera/view/PreviewView$1$$ExternalSyntheticBackportWithForwarding0; +Landroidx/cardview/R$style; +Landroidx/cardview/R$styleable; +Landroidx/cardview/widget/CardView$1; +Landroidx/cardview/widget/CardView; +Landroidx/cardview/widget/CardViewApi21Impl; +Landroidx/cardview/widget/CardViewDelegate; +Landroidx/cardview/widget/CardViewImpl; +Landroidx/cardview/widget/RoundRectDrawable; Landroidx/collection/ArrayMap$EntrySet; Landroidx/collection/ArrayMap$MapIterator; Landroidx/collection/ArrayMap$ValueCollection; @@ -29574,7 +28755,6 @@ Landroidx/constraintlayout/core/LinearSystem; Landroidx/constraintlayout/core/Metrics; Landroidx/constraintlayout/core/Pools$Pool; Landroidx/constraintlayout/core/Pools$SimplePool; -Landroidx/constraintlayout/core/PriorityGoalRow$1; Landroidx/constraintlayout/core/PriorityGoalRow$GoalVariableAccessor; Landroidx/constraintlayout/core/PriorityGoalRow; Landroidx/constraintlayout/core/SolverVariable$Type; @@ -29695,17 +28875,11 @@ Landroidx/core/graphics/drawable/WrappedDrawable; Landroidx/core/internal/view/SupportMenu; Landroidx/core/internal/view/SupportMenuItem; Landroidx/core/math/MathUtils; -Landroidx/core/os/BuildCompat$Api30Impl$$ExternalSyntheticApiModelOutline0; -Landroidx/core/os/BuildCompat$Api30Impl; -Landroidx/core/os/BuildCompat; Landroidx/core/os/CancellationSignal$OnCancelListener; Landroidx/core/os/CancellationSignal; Landroidx/core/os/ConfigurationCompat$Api24Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/os/ConfigurationCompat$Api24Impl; Landroidx/core/os/ConfigurationCompat; -Landroidx/core/os/HandlerCompat$Api28Impl$$ExternalSyntheticApiModelOutline0; -Landroidx/core/os/HandlerCompat$Api28Impl; -Landroidx/core/os/HandlerCompat; Landroidx/core/os/LocaleListCompat$Api21Impl; Landroidx/core/os/LocaleListCompat$Api24Impl; Landroidx/core/os/LocaleListCompat; @@ -29785,6 +28959,8 @@ Landroidx/core/view/ViewCompat; Landroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline0; Landroidx/core/view/ViewConfigurationCompat$Api26Impl$$ExternalSyntheticApiModelOutline1; Landroidx/core/view/ViewConfigurationCompat$Api26Impl; +Landroidx/core/view/ViewConfigurationCompat$Api28Impl$$ExternalSyntheticApiModelOutline0; +Landroidx/core/view/ViewConfigurationCompat$Api28Impl; Landroidx/core/view/ViewConfigurationCompat; Landroidx/core/view/ViewGroupKt$children$1; Landroidx/core/view/ViewGroupKt$iterator$1; @@ -29857,11 +29033,6 @@ Landroidx/core/view/accessibility/AccessibilityViewCommand$SetTextArguments; Landroidx/core/view/accessibility/AccessibilityViewCommand; Landroidx/core/view/animation/PathInterpolatorCompat$Api21Impl; Landroidx/core/view/animation/PathInterpolatorCompat; -Landroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0; -Landroidx/core/view/inputmethod/EditorInfoCompat; -Landroidx/core/view/inputmethod/InputConnectionCompat$1; -Landroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener; -Landroidx/core/view/inputmethod/InputConnectionCompat; Landroidx/core/widget/ImageViewCompat$Api21Impl; Landroidx/core/widget/ImageViewCompat; Landroidx/core/widget/NestedScrollView$OnScrollChangeListener; @@ -29913,8 +29084,6 @@ Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19; Landroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal; Landroidx/emoji2/viewsintegration/EmojiEditTextHelper; Landroidx/emoji2/viewsintegration/EmojiEditableFactory; -Landroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper; -Landroidx/emoji2/viewsintegration/EmojiInputConnection; Landroidx/emoji2/viewsintegration/EmojiInputFilter; Landroidx/emoji2/viewsintegration/EmojiKeyListener$EmojiCompatHandleKeyDownHelper; Landroidx/emoji2/viewsintegration/EmojiKeyListener; @@ -29965,12 +29134,10 @@ Landroidx/fragment/app/FragmentManager$2; Landroidx/fragment/app/FragmentManager$3; Landroidx/fragment/app/FragmentManager$4; Landroidx/fragment/app/FragmentManager$5; -Landroidx/fragment/app/FragmentManager$6; Landroidx/fragment/app/FragmentManager$7; Landroidx/fragment/app/FragmentManager$8; Landroidx/fragment/app/FragmentManager$9; Landroidx/fragment/app/FragmentManager$FragmentIntentSenderContract; -Landroidx/fragment/app/FragmentManager$LifecycleAwareResultListener; Landroidx/fragment/app/FragmentManager$OnBackStackChangedListener; Landroidx/fragment/app/FragmentManager$OpGenerator; Landroidx/fragment/app/FragmentManager; @@ -29978,7 +29145,6 @@ Landroidx/fragment/app/FragmentManagerImpl; Landroidx/fragment/app/FragmentManagerViewModel$1; Landroidx/fragment/app/FragmentManagerViewModel; Landroidx/fragment/app/FragmentOnAttachListener; -Landroidx/fragment/app/FragmentResultListener; Landroidx/fragment/app/FragmentStateManager$1; Landroidx/fragment/app/FragmentStateManager$2; Landroidx/fragment/app/FragmentStateManager; @@ -30018,7 +29184,6 @@ Landroidx/lifecycle/DefaultLifecycleObserverAdapter$WhenMappings; Landroidx/lifecycle/DefaultLifecycleObserverAdapter; Landroidx/lifecycle/EmptyActivityLifecycleCallbacks; Landroidx/lifecycle/HasDefaultViewModelProviderFactory; -Landroidx/lifecycle/LegacySavedStateHandleController$OnRecreation; Landroidx/lifecycle/LegacySavedStateHandleController; Landroidx/lifecycle/Lifecycle$Event$Companion$WhenMappings; Landroidx/lifecycle/Lifecycle$Event$Companion; @@ -30060,15 +29225,13 @@ Landroidx/lifecycle/ReportFragment$Companion; Landroidx/lifecycle/ReportFragment$LifecycleCallbacks$Companion; Landroidx/lifecycle/ReportFragment$LifecycleCallbacks; Landroidx/lifecycle/ReportFragment; -Landroidx/lifecycle/SavedStateHandle$$ExternalSyntheticLambda0; -Landroidx/lifecycle/SavedStateHandle$Companion; Landroidx/lifecycle/SavedStateHandle; Landroidx/lifecycle/SavedStateHandleAttacher; Landroidx/lifecycle/SavedStateHandleController; Landroidx/lifecycle/SavedStateHandleSupport$DEFAULT_ARGS_KEY$1; Landroidx/lifecycle/SavedStateHandleSupport$SAVED_STATE_REGISTRY_OWNER_KEY$1; Landroidx/lifecycle/SavedStateHandleSupport$VIEW_MODEL_STORE_OWNER_KEY$1; -Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1$1; +Landroidx/lifecycle/SavedStateHandleSupport$savedStateHandlesVM$1; Landroidx/lifecycle/SavedStateHandleSupport; Landroidx/lifecycle/SavedStateHandlesProvider$viewModel$2; Landroidx/lifecycle/SavedStateHandlesProvider; @@ -30077,7 +29240,7 @@ Landroidx/lifecycle/SavedStateViewModelFactory; Landroidx/lifecycle/SavedStateViewModelFactoryKt; Landroidx/lifecycle/Transformations$map$1; Landroidx/lifecycle/Transformations$sam$androidx_lifecycle_Observer$0; -Landroidx/lifecycle/Transformations$switchMap$1$onChanged$1; +Landroidx/lifecycle/Transformations$switchMap$1$1; Landroidx/lifecycle/Transformations$switchMap$1; Landroidx/lifecycle/Transformations; Landroidx/lifecycle/ViewModel; @@ -30262,11 +29425,6 @@ Landroidx/media3/decoder/DecoderInputBuffer; Landroidx/media3/exoplayer/AudioBecomingNoisyManager$AudioBecomingNoisyReceiver; Landroidx/media3/exoplayer/AudioBecomingNoisyManager$EventListener; Landroidx/media3/exoplayer/AudioBecomingNoisyManager; -Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline1; -Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline2; -Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline3; -Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline5; -Landroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline6; Landroidx/media3/exoplayer/AudioFocusManager$AudioFocusListener; Landroidx/media3/exoplayer/AudioFocusManager$PlayerControl; Landroidx/media3/exoplayer/AudioFocusManager; @@ -30493,7 +29651,6 @@ Landroidx/media3/session/CacheBitmapLoader; Landroidx/media3/session/CommandButton$$ExternalSyntheticLambda0; Landroidx/media3/session/CommandButton$Builder; Landroidx/media3/session/CommandButton; -Landroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0; Landroidx/media3/session/ConnectedControllersManager$ConnectedControllerRecord; Landroidx/media3/session/ConnectedControllersManager; Landroidx/media3/session/ConnectionRequest$$ExternalSyntheticLambda0; @@ -30513,7 +29670,6 @@ Landroidx/media3/session/IMediaSession; Landroidx/media3/session/IMediaSessionService$Stub; Landroidx/media3/session/IMediaSessionService; Landroidx/media3/session/LegacyConversions; -Landroidx/media3/session/MediaController$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaController$Builder$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaController$Builder$1; Landroidx/media3/session/MediaController$Builder; @@ -30525,7 +29681,6 @@ Landroidx/media3/session/MediaController; Landroidx/media3/session/MediaControllerHolder$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaControllerHolder$$ExternalSyntheticLambda1; Landroidx/media3/session/MediaControllerHolder; -Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda103; Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda104; Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda108; Landroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda114; @@ -30554,7 +29709,6 @@ Landroidx/media3/session/MediaNotificationManager; Landroidx/media3/session/MediaSession$Builder$1; Landroidx/media3/session/MediaSession$Builder; Landroidx/media3/session/MediaSession$BuilderBase; -Landroidx/media3/session/MediaSession$Callback$-CC; Landroidx/media3/session/MediaSession$Callback; Landroidx/media3/session/MediaSession$ConnectionResult$AcceptedResultBuilder; Landroidx/media3/session/MediaSession$ConnectionResult; @@ -30586,7 +29740,6 @@ Landroidx/media3/session/MediaSessionService$MediaSessionListener; Landroidx/media3/session/MediaSessionService$MediaSessionServiceStub$$ExternalSyntheticLambda0; Landroidx/media3/session/MediaSessionService$MediaSessionServiceStub; Landroidx/media3/session/MediaSessionService; -Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11; Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda24; Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda56; Landroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda70; @@ -30650,7 +29803,7 @@ Landroidx/navigation/NavController$NavControllerNavigatorState; Landroidx/navigation/NavController$OnDestinationChangedListener; Landroidx/navigation/NavController$activity$1; Landroidx/navigation/NavController$navInflater$2; -Landroidx/navigation/NavController$navigate$4; +Landroidx/navigation/NavController$navigate$5; Landroidx/navigation/NavController$onBackPressedCallback$1; Landroidx/navigation/NavController; Landroidx/navigation/NavControllerViewModel$Companion$FACTORY$1; @@ -30765,7 +29918,6 @@ Landroidx/recyclerview/widget/DiffUtil$Diagonal; Landroidx/recyclerview/widget/DiffUtil$DiffResult; Landroidx/recyclerview/widget/DiffUtil$ItemCallback; Landroidx/recyclerview/widget/DiffUtil$Range; -Landroidx/recyclerview/widget/DiffUtil$Snake; Landroidx/recyclerview/widget/DiffUtil; Landroidx/recyclerview/widget/GapWorker$1; Landroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl; @@ -30823,7 +29975,6 @@ Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool$ScrapData; Landroidx/recyclerview/widget/RecyclerView$RecycledViewPool; Landroidx/recyclerview/widget/RecyclerView$Recycler; Landroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver; -Landroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener; Landroidx/recyclerview/widget/RecyclerView$SmoothScroller$ScrollVectorProvider; Landroidx/recyclerview/widget/RecyclerView$State; Landroidx/recyclerview/widget/RecyclerView$StretchEdgeEffectFactory; @@ -30850,10 +30001,8 @@ Landroidx/recyclerview/widget/ViewTypeStorage$ViewTypeLookup; Landroidx/recyclerview/widget/ViewTypeStorage; Landroidx/savedstate/R$id; Landroidx/savedstate/Recreator$Companion; -Landroidx/savedstate/Recreator$SavedStateProvider; Landroidx/savedstate/Recreator; Landroidx/savedstate/SavedStateRegistry$$ExternalSyntheticLambda0; -Landroidx/savedstate/SavedStateRegistry$AutoRecreated; Landroidx/savedstate/SavedStateRegistry$Companion; Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; Landroidx/savedstate/SavedStateRegistry; @@ -31043,9 +30192,6 @@ Lcom/annimon/stream/Stream$3; Lcom/annimon/stream/Stream; Lcom/annimon/stream/function/BiConsumer; Lcom/annimon/stream/function/BiFunction; -Lcom/annimon/stream/function/BinaryOperator$Util$2; -Lcom/annimon/stream/function/BinaryOperator$Util; -Lcom/annimon/stream/function/BinaryOperator; Lcom/annimon/stream/function/Consumer; Lcom/annimon/stream/function/Function; Lcom/annimon/stream/function/IndexedFunction; @@ -31063,7 +30209,6 @@ Lcom/annimon/stream/iterator/LsaExtIterator; Lcom/annimon/stream/iterator/LsaIterator; Lcom/annimon/stream/iterator/PrimitiveIterator$OfInt; Lcom/annimon/stream/operator/IntArray; -Lcom/annimon/stream/operator/IntRangeClosed; Lcom/annimon/stream/operator/ObjArray; Lcom/annimon/stream/operator/ObjFilter; Lcom/annimon/stream/operator/ObjLimit; @@ -31072,7 +30217,6 @@ Lcom/annimon/stream/operator/ObjMapIndexed; Lcom/annimon/stream/operator/ObjSorted; Lcom/bumptech/glide/GeneratedAppGlideModule; Lcom/bumptech/glide/GeneratedAppGlideModuleImpl; -Lcom/bumptech/glide/GeneratedRequestManagerFactory; Lcom/bumptech/glide/GenericTransitionOptions; Lcom/bumptech/glide/Glide$RequestOptionsFactory; Lcom/bumptech/glide/Glide; @@ -31638,6 +30782,7 @@ Lcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators$LinkedHashMapIn Lcom/fasterxml/jackson/databind/deser/impl/JDKValueInstantiators; Lcom/fasterxml/jackson/databind/deser/impl/ManagedReferenceProperty; Lcom/fasterxml/jackson/databind/deser/impl/NullsConstantProvider; +Lcom/fasterxml/jackson/databind/deser/impl/ObjectIdReader; Lcom/fasterxml/jackson/databind/deser/impl/PropertyBasedCreator; Lcom/fasterxml/jackson/databind/deser/impl/PropertyValueBuffer; Lcom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer; @@ -32053,6 +31198,10 @@ Lcom/google/android/material/appbar/ViewOffsetHelper; Lcom/google/android/material/appbar/ViewUtilsLollipop; Lcom/google/android/material/button/MaterialButton; Lcom/google/android/material/button/MaterialButtonHelper; +Lcom/google/android/material/card/MaterialCardView; +Lcom/google/android/material/card/MaterialCardViewHelper$$ExternalSyntheticApiModelOutline0; +Lcom/google/android/material/card/MaterialCardViewHelper$1; +Lcom/google/android/material/card/MaterialCardViewHelper; Lcom/google/android/material/chip/Chip$$ExternalSyntheticLambda0; Lcom/google/android/material/chip/Chip$1; Lcom/google/android/material/chip/Chip$ChipTouchHelper; @@ -32446,9 +31595,7 @@ Lio/reactivex/rxjava3/core/FlowableEmitter; Lio/reactivex/rxjava3/core/FlowableOnSubscribe; Lio/reactivex/rxjava3/core/FlowableSubscriber; Lio/reactivex/rxjava3/core/Maybe; -Lio/reactivex/rxjava3/core/MaybeEmitter; Lio/reactivex/rxjava3/core/MaybeObserver; -Lio/reactivex/rxjava3/core/MaybeOnSubscribe; Lio/reactivex/rxjava3/core/MaybeSource; Lio/reactivex/rxjava3/core/Observable$1; Lio/reactivex/rxjava3/core/Observable; @@ -32580,23 +31727,9 @@ Lio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest$Throttl Lio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest; Lio/reactivex/rxjava3/internal/operators/maybe/AbstractMaybeWithUpstream; Lio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty; Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter$FilterMaybeObserver; Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFilter; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn; Lio/reactivex/rxjava3/internal/operators/maybe/MaybeOnErrorComplete$OnErrorCompleteMultiObserver; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver; -Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek; -Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver; -Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber; -Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle; Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver$SwitchMapSingleObserver; Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver; Lio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle; @@ -32623,8 +31756,6 @@ Lio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle$El Lio/reactivex/rxjava3/internal/operators/observable/ObservableElementAtSingle; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFilter$FilterObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFilter; -Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver; -Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver; @@ -32632,7 +31763,6 @@ Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromFuture; -Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber; Lio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher; Lio/reactivex/rxjava3/internal/operators/observable/ObservableJust; Lio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver; @@ -32894,7 +32024,6 @@ Lj$/util/function/ToDoubleFunction; Lj$/util/function/ToIntFunction; Lj$/util/function/ToLongFunction; Lj$/util/function/Z; -Lj$/util/function/b; Lj$/util/function/g0; Lj$/util/function/h; Lj$/util/function/j0; @@ -32904,7 +32033,6 @@ Lj$/util/function/p0; Lj$/util/function/t; Lj$/util/g; Lj$/util/m; -Lj$/util/stream/A1; Lj$/util/stream/B0; Lj$/util/stream/B2; Lj$/util/stream/C0; @@ -32914,7 +32042,6 @@ Lj$/util/stream/Collector; Lj$/util/stream/Collectors; Lj$/util/stream/D0; Lj$/util/stream/E0; -Lj$/util/stream/E1; Lj$/util/stream/F0; Lj$/util/stream/F1; Lj$/util/stream/F3; @@ -32949,8 +32076,6 @@ Lj$/util/stream/b; Lj$/util/stream/c2; Lj$/util/stream/c; Lj$/util/stream/g2; -Lj$/util/stream/h2; -Lj$/util/stream/i2; Lj$/util/stream/i; Lj$/util/stream/l; Lj$/util/stream/n; @@ -33060,7 +32185,12 @@ Lkotlin/coroutines/jvm/internal/CoroutineStackFrame; Lkotlin/coroutines/jvm/internal/DebugProbesKt; Lkotlin/coroutines/jvm/internal/RestrictedContinuationImpl; Lkotlin/coroutines/jvm/internal/RestrictedSuspendLambda; +Lkotlin/internal/PlatformImplementations; +Lkotlin/internal/PlatformImplementationsKt; Lkotlin/internal/ProgressionUtilKt; +Lkotlin/internal/jdk7/JDK7PlatformImplementations; +Lkotlin/internal/jdk8/JDK8PlatformImplementations$ReflectSdkVersion; +Lkotlin/internal/jdk8/JDK8PlatformImplementations; Lkotlin/io/CloseableKt; Lkotlin/jvm/JvmClassMappingKt; Lkotlin/jvm/JvmStatic; @@ -33124,6 +32254,11 @@ Lkotlin/properties/Delegates; Lkotlin/properties/ObservableProperty; Lkotlin/properties/ReadOnlyProperty; Lkotlin/properties/ReadWriteProperty; +Lkotlin/random/AbstractPlatformRandom; +Lkotlin/random/FallbackThreadLocalRandom$implStorage$1; +Lkotlin/random/FallbackThreadLocalRandom; +Lkotlin/random/Random$Default; +Lkotlin/random/Random; Lkotlin/ranges/CharProgression; Lkotlin/ranges/CharRange; Lkotlin/ranges/ClosedRange; @@ -34289,24 +33424,6 @@ Lkotlinx/coroutines/flow/internal/AbstractSharedFlowSlot; Lkotlinx/coroutines/flow/internal/FusibleFlow; Lkotlinx/coroutines/flow/internal/NullSurrogateKt; Lkotlinx/coroutines/internal/Symbol; -Lme/leolin/shortcutbadger/Badger; -Lme/leolin/shortcutbadger/ShortcutBadgeException; -Lme/leolin/shortcutbadger/ShortcutBadger; -Lme/leolin/shortcutbadger/impl/AdwHomeBadger; -Lme/leolin/shortcutbadger/impl/ApexHomeBadger; -Lme/leolin/shortcutbadger/impl/AsusHomeBadger; -Lme/leolin/shortcutbadger/impl/DefaultBadger; -Lme/leolin/shortcutbadger/impl/EverythingMeHomeBadger; -Lme/leolin/shortcutbadger/impl/HuaweiHomeBadger; -Lme/leolin/shortcutbadger/impl/NewHtcHomeBadger; -Lme/leolin/shortcutbadger/impl/NovaHomeBadger; -Lme/leolin/shortcutbadger/impl/OPPOHomeBader; -Lme/leolin/shortcutbadger/impl/SamsungHomeBadger; -Lme/leolin/shortcutbadger/impl/SonyHomeBadger; -Lme/leolin/shortcutbadger/impl/VivoHomeBadger; -Lme/leolin/shortcutbadger/impl/ZTEHomeBadger; -Lme/leolin/shortcutbadger/impl/ZukHomeBadger; -Lme/leolin/shortcutbadger/util/BroadcastHelper; Lnet/zetetic/database/DatabaseErrorHandler; Lnet/zetetic/database/DatabaseUtils; Lnet/zetetic/database/sqlcipher/CloseGuard$DefaultReporter; @@ -34601,7 +33718,6 @@ Lorg/conscrypt/SSLParametersImpl$PSKCallbacks; Lorg/conscrypt/SSLParametersImpl; Lorg/conscrypt/SSLUtils; Lorg/conscrypt/ServerSessionContext; -Lorg/conscrypt/ShortBufferWithoutStackTraceException; Lorg/greenrobot/eventbus/AsyncPoster; Lorg/greenrobot/eventbus/BackgroundPoster; Lorg/greenrobot/eventbus/EventBus$1; @@ -34705,15 +33821,18 @@ Lorg/signal/core/util/concurrent/DeadlockDetector$$ExternalSyntheticLambda0; Lorg/signal/core/util/concurrent/DeadlockDetector$Companion; Lorg/signal/core/util/concurrent/DeadlockDetector$ExecutorInfo; Lorg/signal/core/util/concurrent/DeadlockDetector; +Lorg/signal/core/util/concurrent/FutureMapTransformer; +Lorg/signal/core/util/concurrent/FutureTransformers$Transformer; +Lorg/signal/core/util/concurrent/FutureTransformers; Lorg/signal/core/util/concurrent/LatestPrioritizedSerialExecutor; Lorg/signal/core/util/concurrent/LifecycleDisposable; Lorg/signal/core/util/concurrent/LifecycleDisposableKt; -Lorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0; -Lorg/signal/core/util/concurrent/MaybeCompat; +Lorg/signal/core/util/concurrent/ListenableFuture; Lorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$1; Lorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$2; Lorg/signal/core/util/concurrent/RxExtensions$subscribeWithSubject$3; Lorg/signal/core/util/concurrent/RxExtensions; +Lorg/signal/core/util/concurrent/SettableFuture; Lorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda0; Lorg/signal/core/util/concurrent/SignalExecutors$$ExternalSyntheticLambda1; Lorg/signal/core/util/concurrent/SignalExecutors$1; @@ -34957,11 +34076,6 @@ Lorg/thoughtcrime/securesms/attachments/PointerAttachment$Companion; Lorg/thoughtcrime/securesms/attachments/PointerAttachment; Lorg/thoughtcrime/securesms/audio/AudioFileInfo; Lorg/thoughtcrime/securesms/audio/AudioHash; -Lorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/audio/AudioRecorder; -Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion; -Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager26; -Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler; Lorg/thoughtcrime/securesms/avatar/Avatar$Companion; Lorg/thoughtcrime/securesms/avatar/Avatar$DatabaseId$DoNotPersist; @@ -35017,7 +34131,6 @@ Lorg/thoughtcrime/securesms/components/AvatarImageView$RecipientContactPhoto; Lorg/thoughtcrime/securesms/components/AvatarImageView$RedownloadRequestListener; Lorg/thoughtcrime/securesms/components/AvatarImageView; Lorg/thoughtcrime/securesms/components/ComposeText$1; -Lorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener; Lorg/thoughtcrime/securesms/components/ComposeText$CursorPositionChangedListener; Lorg/thoughtcrime/securesms/components/ComposeText$QueryStart; Lorg/thoughtcrime/securesms/components/ComposeText$StylingChangedListener; @@ -35036,7 +34149,6 @@ Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailV Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState; Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState; Lorg/thoughtcrime/securesms/components/ConversationScrollToView; -Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar$EventListener; Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; Lorg/thoughtcrime/securesms/components/CornerMask; Lorg/thoughtcrime/securesms/components/DeliveryStatusView$State; @@ -35044,16 +34156,12 @@ Lorg/thoughtcrime/securesms/components/DeliveryStatusView; Lorg/thoughtcrime/securesms/components/ExpirationTimerView; Lorg/thoughtcrime/securesms/components/FromTextView; Lorg/thoughtcrime/securesms/components/HidingLinearLayout; -Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout$Listener; Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; -Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda6; Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda8; -Lorg/thoughtcrime/securesms/components/InputPanel$Listener; Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener; Lorg/thoughtcrime/securesms/components/InputPanel$RecordTime; Lorg/thoughtcrime/securesms/components/InputPanel$SlideToCancel; @@ -35061,7 +34169,6 @@ Lorg/thoughtcrime/securesms/components/InputPanel; Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$Companion; Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardInsetAnimator; -Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardStateListener; Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$keyboardGuideline$2; Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$navigationBarGuideline$2; Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$parentEndGuideline$2; @@ -35102,7 +34209,6 @@ Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollStrategy; Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest; Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$scrollPositionRequests$1; Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate; -Lorg/thoughtcrime/securesms/components/SendButton$ScheduledSendListener; Lorg/thoughtcrime/securesms/components/SendButton; Lorg/thoughtcrime/securesms/components/SharedContactView$EventListener; Lorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport0; @@ -35132,8 +34238,6 @@ Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$1; Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable; Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider; Lorg/thoughtcrime/securesms/components/emoji/EmojiSpan; -Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView; @@ -35153,14 +34257,11 @@ Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree$EmojiTreeNode; Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree$Matches; Lorg/thoughtcrime/securesms/components/emoji/parsing/EmojiTree; Lorg/thoughtcrime/securesms/components/emoji/parsing/Fitzpatrick; -Lorg/thoughtcrime/securesms/components/mention/MentionAnnotation$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/components/mention/MentionAnnotation; Lorg/thoughtcrime/securesms/components/mention/MentionDeleter; Lorg/thoughtcrime/securesms/components/mention/MentionRenderer$MultiLineMentionRenderer; Lorg/thoughtcrime/securesms/components/mention/MentionRenderer$SingleLineMentionRenderer; Lorg/thoughtcrime/securesms/components/mention/MentionRenderer; Lorg/thoughtcrime/securesms/components/mention/MentionRendererDelegate; -Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator; Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher; Lorg/thoughtcrime/securesms/components/menu/ActionItem; Lorg/thoughtcrime/securesms/components/menu/SignalBottomActionBar$enterAnimation$2; @@ -35338,7 +34439,6 @@ Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge; Lorg/thoughtcrime/securesms/conversation/ConversationBottomSheetCallback; Lorg/thoughtcrime/securesms/conversation/ConversationData$MessageRequestData; Lorg/thoughtcrime/securesms/conversation/ConversationData; -Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider; Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView; Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args; Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Builder; @@ -35371,18 +34471,13 @@ Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Detailed; Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$EditHistory; Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode$Standard; Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode; -Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$OnSwipeListener; -Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$SwipeAvailabilityProvider; -Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback; -Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener$Callback; -Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener; Lorg/thoughtcrime/securesms/conversation/ConversationMessage$ComputedProperties; Lorg/thoughtcrime/securesms/conversation/ConversationMessage$ConversationMessageFactory; Lorg/thoughtcrime/securesms/conversation/ConversationMessage; Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Callback; Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider; Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Snapshot; +Lorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu; Lorg/thoughtcrime/securesms/conversation/ConversationReactionDelegate; Lorg/thoughtcrime/securesms/conversation/ConversationReactionOverlay$OnActionSelectedListener; Lorg/thoughtcrime/securesms/conversation/ConversationReactionOverlay$OnHideListener; @@ -35390,9 +34485,6 @@ Lorg/thoughtcrime/securesms/conversation/ConversationRepository; Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter$EventListener; Lorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter; -Lorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator; -Lorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator; -Lorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper; Lorg/thoughtcrime/securesms/conversation/ConversationTitleView$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/conversation/ConversationTitleView; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$$ExternalSyntheticLambda0; @@ -35404,15 +34496,6 @@ Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$PresentOnChange; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$RecipientObserverManager; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem$UpdateObserver; Lorg/thoughtcrime/securesms/conversation/ConversationUpdateItem; -Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1; -Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion; -Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$OnTickListener; -Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick; -Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2; -Lorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/conversation/MarkReadHelper; Lorg/thoughtcrime/securesms/conversation/MessageSendType$Companion; Lorg/thoughtcrime/securesms/conversation/MessageSendType$SignalMessageSendType$Creator; @@ -35424,15 +34507,10 @@ Lorg/thoughtcrime/securesms/conversation/MessageStyler$Result; Lorg/thoughtcrime/securesms/conversation/MessageStyler; Lorg/thoughtcrime/securesms/conversation/ScheduleMessageDialogCallback; Lorg/thoughtcrime/securesms/conversation/ScheduleMessageTimePickerBottomSheet$ScheduleCallback; -Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda3; -Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4; -Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository; Lorg/thoughtcrime/securesms/conversation/SelectedConversationModel; Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$Listener; Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView; -Lorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock; Lorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener$Companion; Lorg/thoughtcrime/securesms/conversation/clicklisteners/AttachmentCancelClickListener; Lorg/thoughtcrime/securesms/conversation/colors/AvatarColor; @@ -35461,18 +34539,8 @@ Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$edgeEffect Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1; Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1; Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft; Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$ShareOrDraftData; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1; -Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2; Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; -Lorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$Companion; Lorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator; Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselect; @@ -35491,18 +34559,10 @@ Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselectable; Lorg/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardBottomSheet$Callback; Lorg/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragmentArgs; Lorg/thoughtcrime/securesms/conversation/ui/error/EnableCallNotificationSettingsDialog$Callback; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryChangedListener; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$1; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1; Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup$Callback; Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$1; Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Companion; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None; -Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Results; Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; Lorg/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepositoryV2; Lorg/thoughtcrime/securesms/conversation/v2/AddToContactsContract$Companion; @@ -35551,75 +34611,35 @@ Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationVi Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder; Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder; Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$OnScrollStateChangedListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder; Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$Listener; Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda11; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda12; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda13; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda14; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda15; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda16; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda17; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda18; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda19; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda8; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda9; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda24; +Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActionModeCallback; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ActivityResultCallbacks; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentKeyboardFragmentListener; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentManagerListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$BackPressedDelegate; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$Companion; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationBannerListener; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationItemClickListener; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DisabledInputListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelListener; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelMediaListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$KeyboardEvents; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$MotionEventRelayDrain; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SearchEventListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SendButtonListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SwipeAvailabilityProvider; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ToolbarDependentMarginListener; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$VoiceMessageRecordingSessionCallbacks; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$WhenMappings; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$args$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationGroupViewModel$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$conversationRecipientRepository$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$14; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$4; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$attachListener$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$groupCallViewModel$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$1; @@ -35630,12 +34650,6 @@ Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConve Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$1$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$jumpAndPulseScrollStrategy$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2; @@ -35647,21 +34661,16 @@ Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversa Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$3; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$$ExternalSyntheticLambda0; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$$inlined$createActivityViewModel$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$onViewCreated$conversationToolbarOnScrollHelper$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentStoryRing$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$reactionDelegate$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$recentEmojis$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$registerForResults$1; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$1; @@ -35682,7 +34691,6 @@ Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewMode Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$viewModel$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$voiceNotePlayerListener$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder; Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$CompleteUnreadState; Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$InitialUnreadState; Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$UnreadState$None; @@ -35696,8 +34704,6 @@ Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$grou Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository$groupRecord$2; Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository; Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda11; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19; Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$Companion; Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$MessageCounts; @@ -35744,26 +34750,19 @@ Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$chatColorsDataObservable$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$chatColorsDataObservable$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$2; -Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$storyRingState$1; Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel; -Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$Listener; Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$inflater$2; Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView; Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState; Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState; Lorg/thoughtcrime/securesms/conversation/v2/MessageRequestViewModel; -Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay$Drain; Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay; Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; Lorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel; -Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1; Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; -Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion; -Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$SessionCallback; Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate; Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate; Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource$Companion; @@ -35816,6 +34815,7 @@ Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsI Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration; Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable; Lorg/thoughtcrime/securesms/conversation/v2/items/InteractiveConversationElement; +Lorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnDispatchTouchEventListener; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout$OnMeasureListener; @@ -35830,7 +34830,7 @@ Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyView Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda4; -Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda6; +Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$Companion; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$PassthroughClickListener; Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$ReactionMeasureListener; @@ -35910,11 +34910,11 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ArchiveLis Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$Callback; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment$ContactSearchClickCallbacks; Lorg/thoughtcrime/securesms/conversationlist/ConversationListFragment; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda12; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda4; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda10; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda13; +Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda6; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItem; Lorg/thoughtcrime/securesms/conversationlist/ConversationListItemAnimator; Lorg/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter$$ExternalSyntheticLambda0; @@ -35944,7 +34944,6 @@ Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$Factory; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$conversationsState$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$filterRequestState$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$megaphoneState$1; -Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onMegaphoneCompleted$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$onVisible$1$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$pagedData$1; Lorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel$pagedData$2; @@ -36041,7 +35040,6 @@ Lorg/thoughtcrime/securesms/database/ChatColorsTable; Lorg/thoughtcrime/securesms/database/DatabaseMonitor; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda10; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda11; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda20; @@ -36054,7 +35052,6 @@ Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda37 Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda40; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda5; -Lorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6; Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver; Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer; Lorg/thoughtcrime/securesms/database/DatabaseObserver; @@ -36207,10 +35204,10 @@ Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSynthetic Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getRecipientExtras$1; -Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$forcedUnread$1; -Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$groupMasterKey$1; -Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityKey$1; -Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$identityStatus$1; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$2; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$3; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$4; +Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil$getSyncExtras$5; Lorg/thoughtcrime/securesms/database/RecipientTableCursorUtil; Lorg/thoughtcrime/securesms/database/RemappedRecordTables$Companion; Lorg/thoughtcrime/securesms/database/RemappedRecordTables; @@ -36279,7 +35276,6 @@ Lorg/thoughtcrime/securesms/database/ThreadTable$Reader; Lorg/thoughtcrime/securesms/database/ThreadTable$StaticReader; Lorg/thoughtcrime/securesms/database/ThreadTable$WhenMappings; Lorg/thoughtcrime/securesms/database/ThreadTable$getOrCreateThreadIdFor$1; -Lorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1; Lorg/thoughtcrime/securesms/database/ThreadTable$update$1$isPinned$2; Lorg/thoughtcrime/securesms/database/ThreadTable$update$1$shouldDelete$2; Lorg/thoughtcrime/securesms/database/ThreadTable$update$1; @@ -36360,17 +35356,18 @@ Lorg/thoughtcrime/securesms/database/model/databaseprotos/BodyRangeList; Lorg/thoughtcrime/securesms/database/model/databaseprotos/ChatColor; Lorg/thoughtcrime/securesms/database/model/databaseprotos/ExpiringProfileKeyCredentialColumnData; Lorg/thoughtcrime/securesms/database/model/databaseprotos/GiftBadge; +Lorg/thoughtcrime/securesms/database/model/databaseprotos/MessageExtras; Lorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion$ADAPTER$1; Lorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation$Companion; Lorg/thoughtcrime/securesms/database/model/databaseprotos/PendingOneTimeDonation; Lorg/thoughtcrime/securesms/database/model/databaseprotos/RecipientExtras; Lorg/thoughtcrime/securesms/database/model/databaseprotos/Wallpaper; -Lorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding; Lorg/thoughtcrime/securesms/databinding/ConversationInputPanelBinding; Lorg/thoughtcrime/securesms/databinding/ConversationListFilterPullViewBinding; Lorg/thoughtcrime/securesms/databinding/ConversationListTabsBinding; Lorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding; Lorg/thoughtcrime/securesms/databinding/ConversationTitleViewBinding; +Lorg/thoughtcrime/securesms/databinding/OnboardingMegaphoneCardBinding; Lorg/thoughtcrime/securesms/databinding/TransferControlsViewBinding; Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding; Lorg/thoughtcrime/securesms/databinding/V2ConversationItemTextOnlyIncomingBinding; @@ -36437,7 +35434,6 @@ Lorg/thoughtcrime/securesms/emoji/EmojiSourceKt; Lorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/emoji/JumboEmoji$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/emoji/JumboEmoji; -Lorg/thoughtcrime/securesms/emoji/ObsoleteEmoji; Lorg/thoughtcrime/securesms/emoji/ParsedEmojiData; Lorg/thoughtcrime/securesms/events/GroupCallPeekEvent; Lorg/thoughtcrime/securesms/events/PartProgressEvent; @@ -36508,8 +35504,6 @@ Lorg/thoughtcrime/securesms/groups/GroupId; Lorg/thoughtcrime/securesms/groups/GroupNotAMemberException; Lorg/thoughtcrime/securesms/groups/SelectionLimits$1; Lorg/thoughtcrime/securesms/groups/SelectionLimits; -Lorg/thoughtcrime/securesms/groups/v2/GroupInviteLinkUrl$InvalidGroupLinkException; -Lorg/thoughtcrime/securesms/groups/v2/GroupInviteLinkUrl$UnknownGroupLinkVersionException; Lorg/thoughtcrime/securesms/groups/v2/GroupManagementRepository; Lorg/thoughtcrime/securesms/jobmanager/AlarmManagerScheduler$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/jobmanager/CompositeScheduler; @@ -36908,13 +35902,6 @@ Lorg/thoughtcrime/securesms/keyvalue/TooltipValues; Lorg/thoughtcrime/securesms/keyvalue/UiHints; Lorg/thoughtcrime/securesms/keyvalue/WallpaperValues; Lorg/thoughtcrime/securesms/linkpreview/LinkPreview; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Creator; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2; -Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1; Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; Lorg/thoughtcrime/securesms/logging/CustomSignalProtocolLogger; Lorg/thoughtcrime/securesms/logging/PersistentLogger$Companion; @@ -36959,10 +35946,10 @@ Lorg/thoughtcrime/securesms/megaphone/MegaphoneRepository; Lorg/thoughtcrime/securesms/megaphone/MegaphoneSchedule; Lorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder$1; Lorg/thoughtcrime/securesms/megaphone/MegaphoneViewBuilder; +Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda18; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda19; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda20; -Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda21; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/megaphone/Megaphones$$ExternalSyntheticLambda4; @@ -36973,7 +35960,13 @@ Lorg/thoughtcrime/securesms/megaphone/Megaphones$3; Lorg/thoughtcrime/securesms/megaphone/Megaphones$Event; Lorg/thoughtcrime/securesms/megaphone/Megaphones; Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$ActionClickListener; +Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$AddPhotoCardViewHolder; Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardAdapter; +Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder$$ExternalSyntheticLambda0; +Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder$$ExternalSyntheticLambda1; +Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$CardViewHolder; +Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$GroupCardViewHolder; +Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView$InviteCardViewHolder; Lorg/thoughtcrime/securesms/megaphone/OnboardingMegaphoneView; Lorg/thoughtcrime/securesms/megaphone/PinsForAllSchedule; Lorg/thoughtcrime/securesms/megaphone/RecurringSchedule; @@ -36988,12 +35981,13 @@ Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$getRemoteMegapho Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository$snooze$1; Lorg/thoughtcrime/securesms/megaphone/RemoteMegaphoneRepository; Lorg/thoughtcrime/securesms/megaphone/SignalPinReminderSchedule; -Lorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule$Companion; -Lorg/thoughtcrime/securesms/megaphone/SmsExportReminderSchedule; Lorg/thoughtcrime/securesms/messageprocessingalarm/RoutineMessageFetchReceiver; +Lorg/thoughtcrime/securesms/messagerequests/GroupInfo$Companion; Lorg/thoughtcrime/securesms/messagerequests/GroupInfo; Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository; +Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState$Companion; +Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State; Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/messages/IncomingMessageObserver$2; @@ -37072,10 +36066,6 @@ Lorg/thoughtcrime/securesms/mms/AudioSlide; Lorg/thoughtcrime/securesms/mms/DecryptableStreamUriLoader$DecryptableUri; Lorg/thoughtcrime/securesms/mms/DecryptableStreamUriLoader$Factory; Lorg/thoughtcrime/securesms/mms/GifSlide; -Lorg/thoughtcrime/securesms/mms/GlideApp; -Lorg/thoughtcrime/securesms/mms/GlideOptions; -Lorg/thoughtcrime/securesms/mms/GlideRequest; -Lorg/thoughtcrime/securesms/mms/GlideRequests; Lorg/thoughtcrime/securesms/mms/ImageSlide; Lorg/thoughtcrime/securesms/mms/IncomingMessage$Companion; Lorg/thoughtcrime/securesms/mms/IncomingMessage; @@ -37118,11 +36108,7 @@ Lorg/thoughtcrime/securesms/net/StandardUserAgentInterceptor; Lorg/thoughtcrime/securesms/net/StaticDns; Lorg/thoughtcrime/securesms/net/UserAgentInterceptor; Lorg/thoughtcrime/securesms/notifications/Configuration; -Lorg/thoughtcrime/securesms/notifications/MarkReadReceiver; -Lorg/thoughtcrime/securesms/notifications/MessageNotifier$ReminderReceiver; Lorg/thoughtcrime/securesms/notifications/MessageNotifier; -Lorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper$$ExternalSyntheticApiModelOutline0; -Lorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline0; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline1; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticApiModelOutline2; @@ -37133,9 +36119,6 @@ Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheti Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticLambda11; Lorg/thoughtcrime/securesms/notifications/NotificationChannels$$ExternalSyntheticLambda17; Lorg/thoughtcrime/securesms/notifications/NotificationChannels; -Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11; -Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6; -Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7; Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier; Lorg/thoughtcrime/securesms/notifications/SlowNotificationHeuristics; Lorg/thoughtcrime/securesms/notifications/VitalsViewModel$$ExternalSyntheticLambda0; @@ -37149,22 +36132,16 @@ Lorg/thoughtcrime/securesms/notifications/v2/ConversationId$Companion; Lorg/thoughtcrime/securesms/notifications/v2/ConversationId$Creator; Lorg/thoughtcrime/securesms/notifications/v2/ConversationId; Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion; -Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$updateNotification$7; Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier; -Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt; -Lorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper; Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$Companion; Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$messageCount$2; Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationIds$2; Lorg/thoughtcrime/securesms/notifications/v2/NotificationState$notificationItems$2; Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; -Lorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider; Lorg/thoughtcrime/securesms/payments/Payment; Lorg/thoughtcrime/securesms/payments/PaymentsAddressException; Lorg/thoughtcrime/securesms/permissions/Permissions$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/permissions/Permissions; -Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber; -Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter; Lorg/thoughtcrime/securesms/pin/SvrRepository; Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference; Lorg/thoughtcrime/securesms/profiles/AvatarHelper; @@ -37206,7 +36183,6 @@ Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda4; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda5; Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda6; -Lorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9; Lorg/thoughtcrime/securesms/recipients/LiveRecipient; Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/recipients/LiveRecipientCache$$ExternalSyntheticLambda2; @@ -37341,7 +36317,6 @@ Lorg/thoughtcrime/securesms/util/AppStartup$Task; Lorg/thoughtcrime/securesms/util/AppStartup; Lorg/thoughtcrime/securesms/util/AvatarUtil; Lorg/thoughtcrime/securesms/util/BitmapDecodingException; -Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState; Lorg/thoughtcrime/securesms/util/ByteUnit$1; Lorg/thoughtcrime/securesms/util/ByteUnit$2; Lorg/thoughtcrime/securesms/util/ByteUnit$3; @@ -37351,7 +36326,6 @@ Lorg/thoughtcrime/securesms/util/CachedInflater$ViewCache$$ExternalSyntheticLamb Lorg/thoughtcrime/securesms/util/CachedInflater$ViewCache$$ExternalSyntheticLambda1; Lorg/thoughtcrime/securesms/util/CachedInflater$ViewCache; Lorg/thoughtcrime/securesms/util/CachedInflater; -Lorg/thoughtcrime/securesms/util/CenteredImageSpan; Lorg/thoughtcrime/securesms/util/CharacterCalculator; Lorg/thoughtcrime/securesms/util/ConfigurationUtil; Lorg/thoughtcrime/securesms/util/ContextUtil; @@ -37360,8 +36334,6 @@ Lorg/thoughtcrime/securesms/util/ConversationShortcutPhoto; Lorg/thoughtcrime/securesms/util/DateUtils$sameDayDateFormat$2; Lorg/thoughtcrime/securesms/util/DateUtils; Lorg/thoughtcrime/securesms/util/Debouncer; -Lorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2; -Lorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate; Lorg/thoughtcrime/securesms/util/DefaultValueLiveData; Lorg/thoughtcrime/securesms/util/Deferred; Lorg/thoughtcrime/securesms/util/DeviceProperties; @@ -37385,7 +36357,6 @@ Lorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt; Lorg/thoughtcrime/securesms/util/JsonUtils$SaneJSONObject; Lorg/thoughtcrime/securesms/util/JsonUtils; Lorg/thoughtcrime/securesms/util/LRUCache; -Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter; Lorg/thoughtcrime/securesms/util/ListenableFutureTask$2; Lorg/thoughtcrime/securesms/util/ListenableFutureTask; @@ -37398,7 +36369,6 @@ Lorg/thoughtcrime/securesms/util/LocalMetrics; Lorg/thoughtcrime/securesms/util/LocaleUtil; Lorg/thoughtcrime/securesms/util/LongClickMovementMethod$1; Lorg/thoughtcrime/securesms/util/LongClickMovementMethod; -Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$1; Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$2; Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3; @@ -37412,7 +36382,6 @@ Lorg/thoughtcrime/securesms/util/MessageRecordUtil; Lorg/thoughtcrime/securesms/util/NameUtil; Lorg/thoughtcrime/securesms/util/NetworkUtil; Lorg/thoughtcrime/securesms/util/NoCrossfadeChangeDefaultAnimator; -Lorg/thoughtcrime/securesms/util/NullableSavedStateHandleDelegate; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda2; Lorg/thoughtcrime/securesms/util/ProfileUtil$$ExternalSyntheticLambda3; @@ -37425,15 +36394,12 @@ Lorg/thoughtcrime/securesms/util/ProjectionList; Lorg/thoughtcrime/securesms/util/PushCharacterCalculator$1; Lorg/thoughtcrime/securesms/util/PushCharacterCalculator; Lorg/thoughtcrime/securesms/util/RemoteDeprecation; -Lorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt$delegate$1; -Lorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt; Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1; Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion; Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory; Lorg/thoughtcrime/securesms/util/ScreenDensity$1; Lorg/thoughtcrime/securesms/util/ScreenDensity; Lorg/thoughtcrime/securesms/util/SearchUtil$StyleFactory; -Lorg/thoughtcrime/securesms/util/SearchUtil; Lorg/thoughtcrime/securesms/util/ServiceUtil; Lorg/thoughtcrime/securesms/util/SignalLocalMetrics$ColdStart; Lorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen; @@ -37449,7 +36415,6 @@ Lorg/thoughtcrime/securesms/util/SnapToTopDataObserver$ScrollToTop; Lorg/thoughtcrime/securesms/util/SnapToTopDataObserver; Lorg/thoughtcrime/securesms/util/SoftHashMap$SoftValue; Lorg/thoughtcrime/securesms/util/SoftHashMap; -Lorg/thoughtcrime/securesms/util/SpanUtil; Lorg/thoughtcrime/securesms/util/StorageUtil; Lorg/thoughtcrime/securesms/util/TextSecurePreferences$MediaKeyboardMode; Lorg/thoughtcrime/securesms/util/TextSecurePreferences; @@ -37468,10 +36433,10 @@ Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3; Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4; Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1; -Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$1; -Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$2; -Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$3; Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$4; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$5; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$6; +Lorg/thoughtcrime/securesms/util/ViewModelFactoryKt$viewModel$$inlined$viewModels$default$7; Lorg/thoughtcrime/securesms/util/ViewUtil; Lorg/thoughtcrime/securesms/util/WakeLockUtil; Lorg/thoughtcrime/securesms/util/WindowUtil; @@ -37488,12 +36453,9 @@ Lorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter; Lorg/thoughtcrime/securesms/util/cjkv/CJKVUtil; Lorg/thoughtcrime/securesms/util/concurrent/FilteredExecutor$Filter; Lorg/thoughtcrime/securesms/util/concurrent/FilteredExecutor; -Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; Lorg/thoughtcrime/securesms/util/concurrent/SerialExecutor$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/concurrent/SerialExecutor; -Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0; Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor; -Lorg/thoughtcrime/securesms/util/concurrent/SettableFuture; Lorg/thoughtcrime/securesms/util/dualsim/SubscriptionManagerCompat; Lorg/thoughtcrime/securesms/util/dynamiclanguage/DynamicLanguageContextWrapper; Lorg/thoughtcrime/securesms/util/dynamiclanguage/LanguageString; @@ -37572,7 +36534,6 @@ Lorg/whispersystems/signalservice/api/account/PreKeyCollection; Lorg/whispersystems/signalservice/api/crypto/InvalidCiphertextException; Lorg/whispersystems/signalservice/api/crypto/UnidentifiedAccess; Lorg/whispersystems/signalservice/api/groupsv2/ClientZkOperations; -Lorg/whispersystems/signalservice/api/groupsv2/GroupLinkNotActiveException; Lorg/whispersystems/signalservice/api/groupsv2/GroupsV2Operations; Lorg/whispersystems/signalservice/api/kbs/MasterKey; Lorg/whispersystems/signalservice/api/messages/SignalServiceAttachment; @@ -37635,7 +36596,6 @@ Lorg/whispersystems/signalservice/internal/ServiceResponseProcessor; Lorg/whispersystems/signalservice/internal/configuration/SignalCdnUrl; Lorg/whispersystems/signalservice/internal/configuration/SignalCdsiUrl; Lorg/whispersystems/signalservice/internal/configuration/SignalKeyBackupServiceUrl; -Lorg/whispersystems/signalservice/internal/configuration/SignalProxy; Lorg/whispersystems/signalservice/internal/configuration/SignalServiceConfiguration; Lorg/whispersystems/signalservice/internal/configuration/SignalServiceUrl; Lorg/whispersystems/signalservice/internal/configuration/SignalStorageUrl; @@ -37643,8 +36603,8 @@ Lorg/whispersystems/signalservice/internal/configuration/SignalSvr2Url; Lorg/whispersystems/signalservice/internal/configuration/SignalUrl; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda10; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda11; -Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda12; -Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda14; +Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda13; +Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$$ExternalSyntheticLambda9; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$1; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$2; Lorg/whispersystems/signalservice/internal/push/PushServiceSocket$ConnectionHolder; @@ -37659,11 +36619,6 @@ Lorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager$1; Lorg/whispersystems/signalservice/internal/util/BlacklistingTrustManager; Lorg/whispersystems/signalservice/internal/util/JsonUtil; Lorg/whispersystems/signalservice/internal/util/Util; -Lorg/whispersystems/signalservice/internal/util/concurrent/FutureMapTransformer; -Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers$Transformer; -Lorg/whispersystems/signalservice/internal/util/concurrent/FutureTransformers; -Lorg/whispersystems/signalservice/internal/util/concurrent/ListenableFuture; -Lorg/whispersystems/signalservice/internal/util/concurrent/SettableFuture; Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper$Builder; Lorg/whispersystems/signalservice/internal/websocket/DefaultErrorMapper; Lorg/whispersystems/signalservice/internal/websocket/DefaultResponseMapper$Builder; @@ -37724,26 +36679,47 @@ PLandroidx/appcompat/app/AppCompatDelegateImpl;->onSaveInstanceState(Landroid/os PLandroidx/appcompat/app/ToolbarActionBar;->onDestroy()V PLandroidx/appcompat/view/SupportMenuInflater$MenuState;->addSubMenuItem()Landroid/view/SubMenu; PLandroidx/appcompat/view/SupportMenuInflater$MenuState;->newInstance(Ljava/lang/String;[Ljava/lang/Class;[Ljava/lang/Object;)Ljava/lang/Object; +PLandroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;->()V +PLandroidx/appcompat/view/menu/ActionMenuItemView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/view/menu/ActionMenuItemView;->getAccessibilityClassName()Ljava/lang/CharSequence; +PLandroidx/appcompat/view/menu/ActionMenuItemView;->getItemData()Landroidx/appcompat/view/menu/MenuItemImpl; +PLandroidx/appcompat/view/menu/ActionMenuItemView;->hasText()Z +PLandroidx/appcompat/view/menu/ActionMenuItemView;->prefersCondensedTitle()Z +PLandroidx/appcompat/view/menu/ActionMenuItemView;->setPopupCallback(Landroidx/appcompat/view/menu/ActionMenuItemView$PopupCallback;)V +PLandroidx/appcompat/view/menu/BaseMenuPresenter;->addItemView(Landroid/view/View;I)V +PLandroidx/appcompat/view/menu/BaseMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z PLandroidx/appcompat/view/menu/MenuBuilder;->addSubMenu(IIILjava/lang/CharSequence;)Landroid/view/SubMenu; PLandroidx/appcompat/view/menu/MenuBuilder;->clearHeader()V +PLandroidx/appcompat/view/menu/MenuBuilder;->findItemIndex(I)I +PLandroidx/appcompat/view/menu/MenuBuilder;->getContext()Landroid/content/Context; +PLandroidx/appcompat/view/menu/MenuBuilder;->getItem(I)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuBuilder;->getResources()Landroid/content/res/Resources; +PLandroidx/appcompat/view/menu/MenuBuilder;->onItemActionRequestChanged(Landroidx/appcompat/view/menu/MenuItemImpl;)V +PLandroidx/appcompat/view/menu/MenuBuilder;->removeItem(I)V +PLandroidx/appcompat/view/menu/MenuBuilder;->removeItemAtInt(IZ)V PLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderInternal(ILjava/lang/CharSequence;ILandroid/graphics/drawable/Drawable;Landroid/view/View;)V PLandroidx/appcompat/view/menu/MenuBuilder;->setHeaderTitleInt(Ljava/lang/CharSequence;)Landroidx/appcompat/view/menu/MenuBuilder; +PLandroidx/appcompat/view/menu/MenuItemImpl;->getContentDescription()Ljava/lang/CharSequence; +PLandroidx/appcompat/view/menu/MenuItemImpl;->getGroupId()I PLandroidx/appcompat/view/menu/MenuItemImpl;->getSubMenu()Landroid/view/SubMenu; PLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setActionView(Landroid/view/View;)Landroidx/core/internal/view/SupportMenuItem; PLandroidx/appcompat/view/menu/MenuItemImpl;->setOnActionExpandListener(Landroid/view/MenuItem$OnActionExpandListener;)Landroid/view/MenuItem; +PLandroidx/appcompat/view/menu/MenuItemImpl;->setShowAsAction(I)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setSubMenu(Landroidx/appcompat/view/menu/SubMenuBuilder;)V PLandroidx/appcompat/view/menu/MenuItemImpl;->setTitle(Ljava/lang/CharSequence;)Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/SubMenuBuilder;->(Landroid/content/Context;Landroidx/appcompat/view/menu/MenuBuilder;Landroidx/appcompat/view/menu/MenuItemImpl;)V PLandroidx/appcompat/view/menu/SubMenuBuilder;->getItem()Landroid/view/MenuItem; PLandroidx/appcompat/view/menu/SubMenuBuilder;->setHeaderTitle(Ljava/lang/CharSequence;)Landroid/view/SubMenu; +PLandroidx/appcompat/widget/ActionMenuPresenter$ActionMenuPopupCallback;->(Landroidx/appcompat/widget/ActionMenuPresenter;)V PLandroidx/appcompat/widget/ActionMenuPresenter;->dismissPopupMenus()Z +PLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z PLandroidx/appcompat/widget/ActionMenuPresenter;->hideOverflowMenu()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->hideSubMenus()Z PLandroidx/appcompat/widget/ActionMenuPresenter;->isOverflowMenuShowing()Z +PLandroidx/appcompat/widget/ActionMenuView$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLandroidx/appcompat/widget/ActionMenuView;->dismissPopupMenus()V +PLandroidx/appcompat/widget/ActionMenuView;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; PLandroidx/appcompat/widget/ActionMenuView;->isOverflowMenuShowing()Z PLandroidx/appcompat/widget/ActionMenuView;->onDetachedFromWindow()V PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->()V @@ -37751,6 +36727,10 @@ PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->(Landroid/cont PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->initEmojiKeyListener(Landroidx/appcompat/widget/AppCompatEmojiEditTextHelper;)V PLandroidx/appcompat/widget/AppCompatAutoCompleteTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V PLandroidx/appcompat/widget/AppCompatDrawableManager$1;->getTintModeForDrawableRes(I)Landroid/graphics/PorterDuff$Mode; +PLandroidx/appcompat/widget/AppCompatEditText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; +PLandroidx/appcompat/widget/AppCompatEmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; +PLandroidx/appcompat/widget/AppCompatHintHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroid/view/View;)Landroid/view/inputmethod/InputConnection; +PLandroidx/appcompat/widget/AppCompatTextHelper;->populateSurroundingTextIfNeeded(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V PLandroidx/appcompat/widget/ForwardingListener;->onViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/appcompat/widget/ResourceManagerInternal;->addTintListToCache(Landroid/content/Context;ILandroid/content/res/ColorStateList;)V PLandroidx/appcompat/widget/ResourceManagerInternal;->getTintMode(I)Landroid/graphics/PorterDuff$Mode; @@ -37820,12 +36800,21 @@ PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->(Landro PLandroidx/coordinatorlayout/widget/CoordinatorLayout$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onDetachedFromWindow()V PLandroidx/coordinatorlayout/widget/CoordinatorLayout;->onSaveInstanceState()Landroid/os/Parcelable; +PLandroidx/core/app/ActivityCompat$Api21Impl;->startPostponedEnterTransition(Landroid/app/Activity;)V +PLandroidx/core/app/ActivityCompat;->startPostponedEnterTransition(Landroid/app/Activity;)V PLandroidx/core/app/ComponentActivity;->onSaveInstanceState(Landroid/os/Bundle;)V +PLandroidx/core/app/NotificationManagerCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationManager;)[Landroid/service/notification/StatusBarNotification; PLandroidx/core/os/BundleKt;->bundleOf([Lkotlin/Pair;)Landroid/os/Bundle; +PLandroidx/core/os/HandlerCompat$Api28Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z +PLandroidx/core/os/HandlerCompat$Api28Impl;->postDelayed(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z +PLandroidx/core/os/HandlerCompat;->postDelayed(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;J)Z +PLandroidx/core/view/MenuItemCompat;->setIconTintList(Landroid/view/MenuItem;Landroid/content/res/ColorStateList;)V +PLandroidx/core/view/NestedScrollingChildHelper;->stopNestedScroll()V PLandroidx/core/view/ViewCompat$Api16Impl;->hasTransientState(Landroid/view/View;)Z PLandroidx/core/view/ViewCompat;->hasTransientState(Landroid/view/View;)Z PLandroidx/core/view/ViewGroupKt$descendants$1;->(Landroid/view/ViewGroup;Lkotlin/coroutines/Continuation;)V PLandroidx/core/view/ViewGroupKt$descendants$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; +PLandroidx/core/view/ViewGroupKt;->getDescendants(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence; PLandroidx/core/view/ViewKt$allViews$1;->(Landroid/view/View;Lkotlin/coroutines/Continuation;)V PLandroidx/core/view/ViewKt$allViews$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation; PLandroidx/core/view/ViewKt$allViews$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object; @@ -37834,6 +36823,13 @@ PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api19Impl;->getConte PLandroidx/core/view/accessibility/AccessibilityEventCompat$Api19Impl;->setContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;I)V PLandroidx/core/view/accessibility/AccessibilityEventCompat;->getContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;)I PLandroidx/core/view/accessibility/AccessibilityEventCompat;->setContentChangeTypes(Landroid/view/accessibility/AccessibilityEvent;I)V +PLandroidx/core/view/inputmethod/EditorInfoCompat$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V +PLandroidx/core/view/inputmethod/EditorInfoCompat;->()V +PLandroidx/core/view/inputmethod/EditorInfoCompat;->setContentMimeTypes(Landroid/view/inputmethod/EditorInfo;[Ljava/lang/String;)V +PLandroidx/core/view/inputmethod/InputConnectionCompat$1;->(Landroid/view/inputmethod/InputConnection;ZLandroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)V +PLandroidx/core/view/inputmethod/InputConnectionCompat;->createWrapper(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/core/view/inputmethod/InputConnectionCompat$OnCommitContentListener;)Landroid/view/inputmethod/InputConnection; +PLandroidx/customview/poolingcontainer/PoolingContainer;->callPoolingContainerOnReleaseForChildren(Landroid/view/ViewGroup;)V +PLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->()V PLandroidx/customview/poolingcontainer/PoolingContainerListenerHolder;->onRelease()V PLandroidx/customview/view/AbsSavedState$1;->()V PLandroidx/customview/view/AbsSavedState$2;->()V @@ -37842,7 +36838,14 @@ PLandroidx/customview/view/AbsSavedState;->()V PLandroidx/customview/view/AbsSavedState;->(Landroid/os/Parcelable;)V PLandroidx/customview/view/AbsSavedState;->(Landroidx/customview/view/AbsSavedState$1;)V PLandroidx/customview/view/AbsSavedState;->writeToParcel(Landroid/os/Parcel;I)V +PLandroidx/emoji2/text/EmojiCompat;->updateEditorInfo(Landroid/view/inputmethod/EditorInfo;)V PLandroidx/emoji2/text/SpannableBuilder;->getSpanEnd(Ljava/lang/Object;)I +PLandroidx/emoji2/viewsintegration/EmojiEditTextHelper$HelperInternal19;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; +PLandroidx/emoji2/viewsintegration/EmojiEditTextHelper;->onCreateInputConnection(Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; +PLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->()V +PLandroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;->updateEditorInfoAttrs(Landroid/view/inputmethod/EditorInfo;)V +PLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;)V +PLandroidx/emoji2/viewsintegration/EmojiInputConnection;->(Landroid/widget/TextView;Landroid/view/inputmethod/InputConnection;Landroid/view/inputmethod/EditorInfo;Landroidx/emoji2/viewsintegration/EmojiInputConnection$EmojiCompatDeleteHelper;)V PLandroidx/fragment/app/Fragment$Api19Impl;->cancelPendingInputEvents(Landroid/view/View;)V PLandroidx/fragment/app/Fragment;->getHost()Ljava/lang/Object; PLandroidx/fragment/app/Fragment;->initState()V @@ -37861,6 +36864,7 @@ PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetHost()Landroidx/fr PLandroidx/fragment/app/FragmentActivity$HostCallbacks;->onGetHost()Ljava/lang/Object; PLandroidx/fragment/app/FragmentActivity;->$r8$lambda$t3WwJ1XbNlapyNW0l552nMkkXdo(Landroidx/fragment/app/FragmentActivity;)Landroid/os/Bundle; PLandroidx/fragment/app/FragmentActivity;->lambda$init$0()Landroid/os/Bundle; +PLandroidx/fragment/app/FragmentActivity;->supportStartPostponedEnterTransition()V PLandroidx/fragment/app/FragmentContainerView;->addDisappearingFragmentView(Landroid/view/View;)V PLandroidx/fragment/app/FragmentContainerView;->removeView(Landroid/view/View;)V PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentDestroyed(Landroidx/fragment/app/Fragment;Z)V @@ -37869,18 +36873,23 @@ PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmen PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentStopped(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/FragmentLifecycleCallbacksDispatcher;->dispatchOnFragmentViewDestroyed(Landroidx/fragment/app/Fragment;Z)V PLandroidx/fragment/app/FragmentManager$$ExternalSyntheticLambda4;->saveState()Landroid/os/Bundle; +PLandroidx/fragment/app/FragmentManager$6;->(Landroidx/fragment/app/FragmentManager;Ljava/lang/String;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/Lifecycle;)V +PLandroidx/fragment/app/FragmentManager$6;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V +PLandroidx/fragment/app/FragmentManager$LifecycleAwareResultListener;->(Landroidx/lifecycle/Lifecycle;Landroidx/fragment/app/FragmentResultListener;Landroidx/lifecycle/LifecycleEventObserver;)V PLandroidx/fragment/app/FragmentManager;->$r8$lambda$sido8p6zuWx0PQxIkv4qM-BRiGM(Landroidx/fragment/app/FragmentManager;)Landroid/os/Bundle; +PLandroidx/fragment/app/FragmentManager;->access$000(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; PLandroidx/fragment/app/FragmentManager;->access$100(Landroidx/fragment/app/FragmentManager;)Ljava/util/Map; PLandroidx/fragment/app/FragmentManager;->dispatchDestroyView()V PLandroidx/fragment/app/FragmentManager;->forcePostponedTransactions()V PLandroidx/fragment/app/FragmentManager;->isDestroyed()Z PLandroidx/fragment/app/FragmentManager;->lambda$attachController$4()Landroid/os/Bundle; +PLandroidx/fragment/app/FragmentManager;->setFragmentResultListener(Ljava/lang/String;Landroidx/lifecycle/LifecycleOwner;Landroidx/fragment/app/FragmentResultListener;)V PLandroidx/fragment/app/FragmentManagerState$1;->()V PLandroidx/fragment/app/FragmentManagerState;->()V PLandroidx/fragment/app/FragmentManagerState;->()V PLandroidx/fragment/app/FragmentManagerState;->writeToParcel(Landroid/os/Parcel;I)V -PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigState(Landroidx/fragment/app/Fragment;)V -PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigStateInternal(Ljava/lang/String;)V +PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigState(Landroidx/fragment/app/Fragment;Z)V +PLandroidx/fragment/app/FragmentManagerViewModel;->clearNonConfigStateInternal(Ljava/lang/String;Z)V PLandroidx/fragment/app/FragmentManagerViewModel;->shouldDestroy(Landroidx/fragment/app/Fragment;)Z PLandroidx/fragment/app/FragmentState$1;->()V PLandroidx/fragment/app/FragmentState;->()V @@ -37899,18 +36908,36 @@ PLandroidx/fragment/app/FragmentViewLifecycleOwner;->performSave(Landroid/os/Bun PLandroidx/fragment/app/FragmentViewLifecycleOwner;->setCurrentState(Landroidx/lifecycle/Lifecycle$State;)V PLandroidx/fragment/app/SpecialEffectsController;->enqueueRemove(Landroidx/fragment/app/FragmentStateManager;)V PLandroidx/fragment/app/SpecialEffectsController;->forcePostponedExecutePendingOperations()V +PLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->(Landroidx/savedstate/SavedStateRegistryOwner;Landroid/os/Bundle;)V +PLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/Class;Landroidx/lifecycle/viewmodel/CreationExtras;)Landroidx/lifecycle/ViewModel; +PLandroidx/lifecycle/AbstractSavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;)Landroidx/lifecycle/ViewModel; PLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onDestroy(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V +PLandroidx/lifecycle/DefaultLifecycleObserver$-CC;->$default$onStop(Landroidx/lifecycle/DefaultLifecycleObserver;Landroidx/lifecycle/LifecycleOwner;)V PLandroidx/lifecycle/EmptyActivityLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V +PLandroidx/lifecycle/LegacySavedStateHandleController;->create(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;Ljava/lang/String;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandleController; +PLandroidx/lifecycle/LegacySavedStateHandleController;->tryToAddRecreator(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V PLandroidx/lifecycle/LifecycleRegistry;->markState(Landroidx/lifecycle/Lifecycle$State;)V PLandroidx/lifecycle/LiveData$LifecycleBoundObserver;->detachObserver()V -PLandroidx/lifecycle/MediatorLiveData;->onInactive()V PLandroidx/lifecycle/ReportFragment$LifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V +PLandroidx/lifecycle/SavedStateHandle$$ExternalSyntheticLambda0;->(Landroidx/lifecycle/SavedStateHandle;)V +PLandroidx/lifecycle/SavedStateHandle$Companion;->()V +PLandroidx/lifecycle/SavedStateHandle$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLandroidx/lifecycle/SavedStateHandle$Companion;->createHandle(Landroid/os/Bundle;Landroid/os/Bundle;)Landroidx/lifecycle/SavedStateHandle; PLandroidx/lifecycle/SavedStateHandle$Companion;->validateValue(Ljava/lang/Object;)Z +PLandroidx/lifecycle/SavedStateHandle;->()V +PLandroidx/lifecycle/SavedStateHandle;->()V PLandroidx/lifecycle/SavedStateHandle;->access$getACCEPTABLE_CLASSES$cp()[Ljava/lang/Class; +PLandroidx/lifecycle/SavedStateHandle;->get(Ljava/lang/String;)Ljava/lang/Object; +PLandroidx/lifecycle/SavedStateHandle;->savedStateProvider()Landroidx/savedstate/SavedStateRegistry$SavedStateProvider; PLandroidx/lifecycle/SavedStateHandle;->set(Ljava/lang/String;Ljava/lang/Object;)V +PLandroidx/lifecycle/SavedStateHandleController;->(Ljava/lang/String;Landroidx/lifecycle/SavedStateHandle;)V +PLandroidx/lifecycle/SavedStateHandleController;->attachToLifecycle(Landroidx/savedstate/SavedStateRegistry;Landroidx/lifecycle/Lifecycle;)V +PLandroidx/lifecycle/SavedStateHandleController;->getHandle()Landroidx/lifecycle/SavedStateHandle; +PLandroidx/lifecycle/SavedStateHandleController;->onStateChanged(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/Lifecycle$Event;)V PLandroidx/lifecycle/SavedStateHandlesProvider;->saveState()Landroid/os/Bundle; PLandroidx/lifecycle/SavedStateHandlesVM;->getHandles()Ljava/util/Map; PLandroidx/lifecycle/ViewModel;->closeWithRuntimeException(Ljava/lang/Object;)V +PLandroidx/lifecycle/ViewModel;->setTagIfAbsent(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; PLandroidx/loader/app/LoaderManager;->()V PLandroidx/loader/app/LoaderManager;->getInstance(Landroidx/lifecycle/LifecycleOwner;)Landroidx/loader/app/LoaderManager; PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel$1;->()V @@ -37924,11 +36951,45 @@ PLandroidx/loader/app/LoaderManagerImpl$LoaderViewModel;->onCleared()V PLandroidx/loader/app/LoaderManagerImpl;->()V PLandroidx/loader/app/LoaderManagerImpl;->(Landroidx/lifecycle/LifecycleOwner;Landroidx/lifecycle/ViewModelStore;)V PLandroidx/loader/app/LoaderManagerImpl;->markForRedelivery()V +PLandroidx/media3/common/util/ListenerSet$ListenerHolder;->release(Landroidx/media3/common/util/ListenerSet$IterationFinishedEvent;)V +PLandroidx/media3/common/util/ListenerSet;->release()V +PLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper()Landroid/os/Handler; +PLandroidx/media3/common/util/Util;->createHandlerForCurrentLooper(Landroid/os/Handler$Callback;)Landroid/os/Handler; +PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline1;->m(I)Landroid/media/AudioFocusRequest$Builder; +PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline2;->m()V +PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline3;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioAttributes;)Landroid/media/AudioFocusRequest$Builder; +PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline5;->m(Landroid/media/AudioFocusRequest$Builder;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Landroid/media/AudioFocusRequest$Builder; +PLandroidx/media3/exoplayer/AudioFocusManager$$ExternalSyntheticApiModelOutline6;->m(Landroid/media/AudioFocusRequest$Builder;)Landroid/media/AudioFocusRequest; +PLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V +PLandroidx/media3/session/ConnectedControllersManager$$ExternalSyntheticLambda0;->run()V +PLandroidx/media3/session/ConnectedControllersManager;->$r8$lambda$Vom81RksdvuIVXyQfAu6pd1M7BY(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V +PLandroidx/media3/session/ConnectedControllersManager;->lambda$removeController$0(Landroidx/media3/session/MediaSessionImpl;Landroidx/media3/session/MediaSession$ControllerInfo;)V +PLandroidx/media3/session/ConnectedControllersManager;->removeController(Landroidx/media3/session/MediaSession$ControllerInfo;)V +PLandroidx/media3/session/ConnectedControllersManager;->removeController(Ljava/lang/Object;)V +PLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->(Landroidx/media3/session/MediaController;)V +PLandroidx/media3/session/MediaController$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +PLandroidx/media3/session/MediaController$Builder$1;->onDisconnected(Landroidx/media3/session/MediaController;)V +PLandroidx/media3/session/MediaController$Listener$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaController$Listener;Landroidx/media3/session/MediaController;)V +PLandroidx/media3/session/MediaController;->$r8$lambda$7Poy_IVrU20FjlOzoqG4RzKma48(Landroidx/media3/session/MediaController;Landroidx/media3/session/MediaController$Listener;)V PLandroidx/media3/session/MediaController;->createDisconnectedFuture()Lcom/google/common/util/concurrent/ListenableFuture; +PLandroidx/media3/session/MediaController;->lambda$release$0(Landroidx/media3/session/MediaController$Listener;)V +PLandroidx/media3/session/MediaController;->release()V +PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda103;->(Landroidx/media3/session/MediaControllerImplBase;)V PLandroidx/media3/session/MediaControllerImplBase$$ExternalSyntheticLambda103;->run()V +PLandroidx/media3/session/MediaControllerImplBase$FlushCommandQueueHandler;->release()V PLandroidx/media3/session/MediaControllerImplBase;->$r8$lambda$tIEgcrLv3SECRV9I_ggVsbUKXeY(Landroidx/media3/session/MediaControllerImplBase;)V PLandroidx/media3/session/MediaControllerImplBase;->lambda$release$4()V +PLandroidx/media3/session/MediaControllerImplBase;->release()V PLandroidx/media3/session/MediaControllerStub;->destroy()V +PLandroidx/media3/session/MediaSession$Callback$-CC;->$default$onDisconnected(Landroidx/media3/session/MediaSession$Callback;Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V +PLandroidx/media3/session/MediaSessionImpl;->onDisconnectedOnHandler(Landroidx/media3/session/MediaSession$ControllerInfo;)V +PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V +PLandroidx/media3/session/MediaSessionStub$$ExternalSyntheticLambda11;->run()V +PLandroidx/media3/session/MediaSessionStub;->$r8$lambda$-z-kXYeUiIo9LEMOQQqDz14Ng0c(Landroidx/media3/session/MediaSessionStub;Landroidx/media3/session/IMediaController;)V +PLandroidx/media3/session/MediaSessionStub;->lambda$release$18(Landroidx/media3/session/IMediaController;)V +PLandroidx/media3/session/MediaSessionStub;->release(Landroidx/media3/session/IMediaController;I)V +PLandroidx/media3/session/SequencedFutureManager;->lazyRelease(JLjava/lang/Runnable;)V +PLandroidx/media3/session/SequencedFutureManager;->release()V PLandroidx/navigation/NavBackStackEntry;->saveState(Landroid/os/Bundle;)V PLandroidx/navigation/NavBackStackEntryState$Companion$CREATOR$1;->()V PLandroidx/navigation/NavBackStackEntryState$Companion;->()V @@ -37977,6 +37038,9 @@ PLandroidx/profileinstaller/ProfileVerifier;->getPackageLastUpdateTime(Landroid/ PLandroidx/profileinstaller/ProfileVerifier;->setCompilationStatus(IZZ)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; PLandroidx/profileinstaller/ProfileVerifier;->writeProfileVerification(Landroid/content/Context;Z)Landroidx/profileinstaller/ProfileVerifier$CompilationStatus; PLandroidx/recyclerview/widget/AdapterListUpdateCallback;->onChanged(IILjava/lang/Object;)V +PLandroidx/recyclerview/widget/AsyncDifferConfig;->getDiffCallback()Landroidx/recyclerview/widget/DiffUtil$ItemCallback; +PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areContentsTheSame(II)Z +PLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->getChangePayload(II)Ljava/lang/Object; PLandroidx/recyclerview/widget/ChildHelper;->removeViewAt(I)V PLandroidx/recyclerview/widget/ConcatAdapter;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/ConcatAdapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V @@ -37984,7 +37048,17 @@ PLandroidx/recyclerview/widget/ConcatAdapter;->onViewRecycled(Landroidx/recycler PLandroidx/recyclerview/widget/ConcatAdapterController;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/ConcatAdapterController;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/ConcatAdapterController;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->get(I)I +PLandroidx/recyclerview/widget/DiffUtil$CenteredArray;->set(II)V +PLandroidx/recyclerview/widget/DiffUtil$Range;->()V +PLandroidx/recyclerview/widget/DiffUtil$Range;->newSize()I +PLandroidx/recyclerview/widget/DiffUtil$Snake;->()V +PLandroidx/recyclerview/widget/DiffUtil$Snake;->diagonalSize()I +PLandroidx/recyclerview/widget/DiffUtil$Snake;->hasAdditionOrRemoval()Z +PLandroidx/recyclerview/widget/DiffUtil$Snake;->toDiagonal()Landroidx/recyclerview/widget/DiffUtil$Diagonal; +PLandroidx/recyclerview/widget/DiffUtil;->forward(Landroidx/recyclerview/widget/DiffUtil$Range;Landroidx/recyclerview/widget/DiffUtil$Callback;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;Landroidx/recyclerview/widget/DiffUtil$CenteredArray;I)Landroidx/recyclerview/widget/DiffUtil$Snake; PLandroidx/recyclerview/widget/GapWorker$LayoutPrefetchRegistryImpl;->lastPrefetchIncludedPosition(I)Z +PLandroidx/recyclerview/widget/GapWorker;->remove(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/ItemTouchHelper;->endRecoverAnimation(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Z)V PLandroidx/recyclerview/widget/ItemTouchHelper;->onChildViewDetachedFromWindow(Landroid/view/View;)V PLandroidx/recyclerview/widget/ItemTouchHelper;->removeChildDrawingOrderCallbackIfNecessary(Landroid/view/View;)V @@ -37995,52 +37069,75 @@ PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->invalidateAnchor PLandroidx/recyclerview/widget/LinearLayoutManager$SavedState;->writeToParcel(Landroid/os/Parcel;I)V PLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToEnd()Landroid/view/View; PLandroidx/recyclerview/widget/LinearLayoutManager;->getChildClosestToStart()Landroid/view/View; +PLandroidx/recyclerview/widget/LinearLayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V PLandroidx/recyclerview/widget/LinearLayoutManager;->onSaveInstanceState()Landroid/os/Parcelable; +PLandroidx/recyclerview/widget/OrientationHelper;->getTotalSpaceChange()I PLandroidx/recyclerview/widget/RecyclerView$5;->removeViewAt(I)V PLandroidx/recyclerview/widget/RecyclerView$6;->markViewHoldersUpdated(IILjava/lang/Object;)V +PLandroidx/recyclerview/widget/RecyclerView$Adapter;->notifyDataSetChanged()V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLandroidx/recyclerview/widget/RecyclerView$Adapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V -PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->buildAdapterChangeFlagsForAnimations(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)I +PLandroidx/recyclerview/widget/RecyclerView$AdapterDataObservable;->notifyChanged()V PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Ljava/util/List;)Z PLandroidx/recyclerview/widget/RecyclerView$ItemAnimator;->recordPreLayoutInformation(Landroidx/recyclerview/widget/RecyclerView$State;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;ILjava/util/List;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; +PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->dispatchDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V +PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->getItemCount()I +PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onAddFocusables(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/ArrayList;II)Z +PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;)V +PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$Recycler;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->onItemsUpdated(Landroidx/recyclerview/widget/RecyclerView;IILjava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeAndRecycleViewAt(ILandroidx/recyclerview/widget/RecyclerView$Recycler;)V PLandroidx/recyclerview/widget/RecyclerView$LayoutManager;->removeViewAt(I)V +PLandroidx/recyclerview/widget/RecyclerView$OnScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->detach()V PLandroidx/recyclerview/widget/RecyclerView$RecycledViewPool;->putRecycledView(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->addViewHolderToRecycledViewPool(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Z)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->dispatchViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/recyclerview/widget/RecyclerView$Recycler;->onDetachedFromWindow()V +PLandroidx/recyclerview/widget/RecyclerView$Recycler;->poolingContainerDetach(Landroidx/recyclerview/widget/RecyclerView$Adapter;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleCachedViewAt(I)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleView(Landroid/view/View;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->recycleViewHolderInternal(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView$Recycler;->viewRangeUpdate(II)V +PLandroidx/recyclerview/widget/RecyclerView$RecyclerViewDataObserver;->onChanged()V PLandroidx/recyclerview/widget/RecyclerView$SavedState$1;->()V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->()V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->(Landroid/os/Parcelable;)V PLandroidx/recyclerview/widget/RecyclerView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V +PLandroidx/recyclerview/widget/RecyclerView$SimpleOnItemTouchListener;->()V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->addChangePayload(Ljava/lang/Object;)V PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->doesTransientStatePreventRecycling()Z +PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getAbsoluteAdapterPosition()I PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->getOldPosition()I PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->isRecyclable()Z PLandroidx/recyclerview/widget/RecyclerView$ViewHolder;->resetInternal()V PLandroidx/recyclerview/widget/RecyclerView;->access$300(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V PLandroidx/recyclerview/widget/RecyclerView;->access$400(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)V +PLandroidx/recyclerview/widget/RecyclerView;->addFocusables(Ljava/util/ArrayList;II)V PLandroidx/recyclerview/widget/RecyclerView;->canReuseUpdatedViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z PLandroidx/recyclerview/widget/RecyclerView;->clearNestedRecyclerViewIfNotNested(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/RecyclerView;->dispatchChildDetached(Landroid/view/View;)V PLandroidx/recyclerview/widget/RecyclerView;->dispatchSaveInstanceState(Landroid/util/SparseArray;)V PLandroidx/recyclerview/widget/RecyclerView;->onChildDetachedFromWindow(Landroid/view/View;)V +PLandroidx/recyclerview/widget/RecyclerView;->onDetachedFromWindow()V PLandroidx/recyclerview/widget/RecyclerView;->onSaveInstanceState()Landroid/os/Parcelable; PLandroidx/recyclerview/widget/RecyclerView;->removeOnScrollListener(Landroidx/recyclerview/widget/RecyclerView$OnScrollListener;)V +PLandroidx/recyclerview/widget/RecyclerView;->stopNestedScroll()V PLandroidx/recyclerview/widget/RecyclerViewAccessibilityDelegate$ItemDelegate;->getAndRemoveOriginalDelegateForItem(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat; +PLandroidx/recyclerview/widget/ViewInfoStore$InfoRecord;->drainCache()V PLandroidx/recyclerview/widget/ViewInfoStore;->addToOldChangeHolders(JLandroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLandroidx/recyclerview/widget/ViewInfoStore;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z +PLandroidx/recyclerview/widget/ViewInfoStore;->onDetach()V PLandroidx/recyclerview/widget/ViewInfoStore;->popFromPostLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; PLandroidx/recyclerview/widget/ViewInfoStore;->popFromPreLayout(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo; PLandroidx/recyclerview/widget/ViewInfoStore;->removeViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V +PLandroidx/savedstate/Recreator$SavedStateProvider;->(Landroidx/savedstate/SavedStateRegistry;)V +PLandroidx/savedstate/Recreator$SavedStateProvider;->add(Ljava/lang/String;)V +PLandroidx/savedstate/SavedStateRegistry;->runOnNextRecreation(Ljava/lang/Class;)V PLandroidx/savedstate/SavedStateRegistryController;->performSave(Landroid/os/Bundle;)V +PLcom/airbnb/lottie/LottieAnimationView$2;->getValue(Lcom/airbnb/lottie/value/LottieFrameInfo;)Ljava/lang/Object; PLcom/airbnb/lottie/LottieAnimationView$SavedState$1;->()V PLcom/airbnb/lottie/LottieAnimationView$SavedState;->()V PLcom/airbnb/lottie/LottieAnimationView$SavedState;->(Landroid/os/Parcelable;)V @@ -38051,6 +37148,18 @@ PLcom/airbnb/lottie/LottieDrawable;->getProgress()F PLcom/airbnb/lottie/LottieDrawable;->getRepeatCount()I PLcom/airbnb/lottie/LottieDrawable;->getRepeatMode()I PLcom/airbnb/lottie/LottieDrawable;->isAnimatingOrWillAnimateOnVisible()Z +PLcom/airbnb/lottie/animation/keyframe/BaseKeyframeAnimation;->getProgress()F +PLcom/airbnb/lottie/value/LottieFrameInfo;->set(FFLjava/lang/Object;Ljava/lang/Object;FFF)Lcom/airbnb/lottie/value/LottieFrameInfo; +PLcom/airbnb/lottie/value/LottieValueCallback;->getValueInternal(FFLjava/lang/Object;Ljava/lang/Object;FFF)Ljava/lang/Object; +PLcom/annimon/stream/Optional;->empty()Lcom/annimon/stream/Optional; +PLcom/annimon/stream/Optional;->orElse(Ljava/lang/Object;)Ljava/lang/Object; +PLcom/annimon/stream/Stream;->max(Ljava/util/Comparator;)Lcom/annimon/stream/Optional; +PLcom/annimon/stream/Stream;->reduce(Lcom/annimon/stream/function/BiFunction;)Lcom/annimon/stream/Optional; +PLcom/annimon/stream/function/BinaryOperator$Util$2;->(Ljava/util/Comparator;)V +PLcom/annimon/stream/function/BinaryOperator$Util;->maxBy(Ljava/util/Comparator;)Lcom/annimon/stream/function/BinaryOperator; +PLcom/annimon/stream/operator/IntRangeClosed;->(II)V +PLcom/annimon/stream/operator/IntRangeClosed;->hasNext()Z +PLcom/annimon/stream/operator/IntRangeClosed;->nextInt()I PLcom/bumptech/glide/Glide;->unregisterRequestManager(Lcom/bumptech/glide/RequestManager;)V PLcom/bumptech/glide/RequestManager;->onDestroy()V PLcom/bumptech/glide/load/Options;->equals(Ljava/lang/Object;)Z @@ -38061,6 +37170,7 @@ PLcom/bumptech/glide/load/resource/bitmap/DrawableTransformation;->equals(Ljava/ PLcom/bumptech/glide/load/resource/gif/GifDrawableTransformation;->equals(Ljava/lang/Object;)Z PLcom/bumptech/glide/manager/DefaultConnectivityMonitor;->onDestroy()V PLcom/bumptech/glide/manager/LifecycleLifecycle;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V +PLcom/bumptech/glide/manager/LifecycleLifecycle;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLcom/bumptech/glide/manager/LifecycleLifecycle;->removeListener(Lcom/bumptech/glide/manager/LifecycleListener;)V PLcom/bumptech/glide/manager/LifecycleRequestManagerRetriever$1;->onDestroy()V PLcom/bumptech/glide/manager/RequestTracker;->clearAndRemove(Lcom/bumptech/glide/request/Request;)Z @@ -38072,9 +37182,11 @@ PLcom/bumptech/glide/manager/TargetTracker;->untrack(Lcom/bumptech/glide/request PLcom/bumptech/glide/request/SingleRequest;->canNotifyCleared()Z PLcom/bumptech/glide/request/SingleRequest;->cancel()V PLcom/bumptech/glide/request/SingleRequest;->clear()V +PLcom/bumptech/glide/request/SingleRequest;->isRunning()Z PLcom/bumptech/glide/request/target/BaseTarget;->onDestroy()V PLcom/bumptech/glide/request/target/BaseTarget;->onLoadCleared(Landroid/graphics/drawable/Drawable;)V PLcom/bumptech/glide/request/target/ImageViewTarget;->onLoadCleared(Landroid/graphics/drawable/Drawable;)V +PLcom/bumptech/glide/request/target/ImageViewTarget;->onStop()V PLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->clearCallbacksAndListener()V PLcom/bumptech/glide/request/target/ViewTarget$SizeDeterminer;->removeCallback(Lcom/bumptech/glide/request/target/SizeReadyCallback;)V PLcom/bumptech/glide/request/target/ViewTarget;->maybeRemoveAttachStateListener()V @@ -38098,17 +37210,75 @@ PLcom/google/android/material/expandable/ExpandableWidgetHelper;->onSaveInstance PLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onDetachedFromWindow()V PLcom/google/android/material/floatingactionbutton/FloatingActionButton;->onSaveInstanceState()Landroid/os/Parcelable; PLcom/google/android/material/floatingactionbutton/FloatingActionButtonImpl;->onDetachedFromWindow()V +PLcom/google/android/material/imageview/ShapeableImageView;->drawStroke(Landroid/graphics/Canvas;)V +PLcom/google/android/material/imageview/ShapeableImageView;->getPaddingBottom()I +PLcom/google/android/material/imageview/ShapeableImageView;->getPaddingLeft()I +PLcom/google/android/material/imageview/ShapeableImageView;->getPaddingRight()I +PLcom/google/android/material/imageview/ShapeableImageView;->getPaddingTop()I +PLcom/google/android/material/imageview/ShapeableImageView;->onDraw(Landroid/graphics/Canvas;)V +PLcom/google/android/material/imageview/ShapeableImageView;->onSizeChanged(IIII)V +PLcom/google/android/material/imageview/ShapeableImageView;->updateShapeMask(II)V PLcom/google/android/material/stateful/ExtendableSavedState$1;->()V PLcom/google/android/material/stateful/ExtendableSavedState;->()V PLcom/google/android/material/stateful/ExtendableSavedState;->(Landroid/os/Parcelable;)V PLcom/google/android/material/stateful/ExtendableSavedState;->writeToParcel(Landroid/os/Parcel;I)V PLcom/google/firebase/messaging/FcmLifecycleCallbacks;->onActivitySaveInstanceState(Landroid/app/Activity;Landroid/os/Bundle;)V +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->format(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsn(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->formatNsnUsingPattern(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/CharSequence;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->hasValidCountryCallingCode(I)Z +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->maybeAppendFormattedExtension(Lcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V +PLcom/google/i18n/phonenumbers/PhoneNumberUtil;->prefixNumberWithCountryCallingCode(ILcom/google/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberFormat;Ljava/lang/StringBuilder;)V +PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getFormat()Ljava/lang/String; +PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPattern(I)Ljava/lang/String; +PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getLeadingDigitsPatternCount()I +PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getNationalPrefixFormattingRule()Ljava/lang/String; +PLcom/google/i18n/phonenumbers/Phonemetadata$NumberFormat;->getPattern()Ljava/lang/String; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getFixedLine()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getIntlNumberFormatList()Ljava/util/List; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getLeadingDigits()Ljava/lang/String; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getNumberFormatList()Ljava/util/List; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPager()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPersonalNumber()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getPremiumRate()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSameMobileAndFixedLinePattern()Z +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getSharedCost()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getTollFree()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getUan()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoicemail()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->getVoip()Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->hasLeadingDigits()Z +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setLeadingDigits(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata;->setNationalPrefixTransformRule(Ljava/lang/String;)Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneMetadata; +PLcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;->getNationalNumberPattern()Ljava/lang/String; +PLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->getNationalNumber()J +PLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->hasExtension()Z +PLcom/google/i18n/phonenumbers/Phonenumber$PhoneNumber;->isItalianLeadingZero()Z +PLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z +PLcom/google/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/google/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z PLcom/pnikosis/materialishprogress/ProgressWheel$WheelSavedState$1;->()V PLcom/pnikosis/materialishprogress/ProgressWheel$WheelSavedState;->()V PLcom/pnikosis/materialishprogress/ProgressWheel$WheelSavedState;->(Landroid/os/Parcelable;)V PLcom/pnikosis/materialishprogress/ProgressWheel;->onSaveInstanceState()Landroid/os/Parcelable; +PLio/reactivex/rxjava3/core/Flowable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Flowable; +PLio/reactivex/rxjava3/core/Flowable;->switchMapSingle(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Flowable; +PLio/reactivex/rxjava3/core/Maybe;->create(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)Lio/reactivex/rxjava3/core/Maybe; +PLio/reactivex/rxjava3/core/Maybe;->doOnSuccess(Lio/reactivex/rxjava3/functions/Consumer;)Lio/reactivex/rxjava3/core/Maybe; +PLio/reactivex/rxjava3/core/Maybe;->empty()Lio/reactivex/rxjava3/core/Maybe; +PLio/reactivex/rxjava3/core/Maybe;->flatMap(Lio/reactivex/rxjava3/functions/Function;)Lio/reactivex/rxjava3/core/Maybe; +PLio/reactivex/rxjava3/core/Maybe;->fromCallable(Ljava/util/concurrent/Callable;)Lio/reactivex/rxjava3/core/Maybe; +PLio/reactivex/rxjava3/core/Maybe;->observeOn(Lio/reactivex/rxjava3/core/Scheduler;)Lio/reactivex/rxjava3/core/Maybe; +PLio/reactivex/rxjava3/core/Observable;->distinctUntilChanged(Lio/reactivex/rxjava3/functions/BiPredicate;)Lio/reactivex/rxjava3/core/Observable; PLio/reactivex/rxjava3/core/Scheduler$PeriodicDirectTask;->dispose()V PLio/reactivex/rxjava3/disposables/CompositeDisposable;->clear()V +PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->complete(Lio/reactivex/rxjava3/core/MaybeObserver;)V PLio/reactivex/rxjava3/internal/disposables/EmptyDisposable;->dispose()V PLio/reactivex/rxjava3/internal/disposables/SequentialDisposable;->dispose()V PLio/reactivex/rxjava3/internal/observers/ConsumerSingleObserver;->dispose()V @@ -38126,6 +37296,7 @@ PLio/reactivex/rxjava3/internal/operators/flowable/FlowableFromObservable$Subscr PLio/reactivex/rxjava3/internal/operators/flowable/FlowableInterval$IntervalSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->clear()V +PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$BaseObserveOnSubscriber;->requestFusion(I)I PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->poll()Ljava/lang/Object; PLio/reactivex/rxjava3/internal/operators/flowable/FlowableObserveOn$ObserveOnSubscriber;->runBackfused()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableRefCount$RefCountSubscriber;->cancel()V @@ -38141,8 +37312,50 @@ PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSwitchMap$SwitchMapSu PLio/reactivex/rxjava3/internal/operators/flowable/FlowableSwitchMap$SwitchMapSubscriber;->disposeInner()V PLio/reactivex/rxjava3/internal/operators/flowable/FlowableThrottleLatest$ThrottleLatestSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCallbackObserver;->dispose()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->(Lio/reactivex/rxjava3/core/MaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->isDisposed()Z +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate$Emitter;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->(Lio/reactivex/rxjava3/core/MaybeOnSubscribe;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeCreate;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeEmpty;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onComplete()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/functions/Function;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->isDisposed()Z +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten$FlatMapMaybeObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Function;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFlatten;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeFromCallable;->(Ljava/util/concurrent/Callable;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/core/Scheduler;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onComplete()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn$ObserveOnMaybeObserver;->run()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/core/Scheduler;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybeObserveOn;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->(Lio/reactivex/rxjava3/core/MaybeObserver;Lio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onAfterTerminate()V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek$MaybePeekObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->(Lio/reactivex/rxjava3/core/MaybeSource;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Consumer;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;Lio/reactivex/rxjava3/functions/Action;)V +PLio/reactivex/rxjava3/internal/operators/maybe/MaybePeek;->subscribeActual(Lio/reactivex/rxjava3/core/MaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->(Lio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber$SwitchMapSingleObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->()V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->(Lorg/reactivestreams/Subscriber;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->cancel()V PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->disposeInner()V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->drain()V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onNext(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle$SwitchMapSingleSubscriber;->request(J)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->(Lio/reactivex/rxjava3/core/Flowable;Lio/reactivex/rxjava3/functions/Function;Z)V +PLio/reactivex/rxjava3/internal/operators/mixed/FlowableSwitchMapSingle;->subscribeActual(Lorg/reactivestreams/Subscriber;)V PLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/mixed/ObservableSwitchMapSingle$SwitchMapSingleMainObserver;->disposeInner()V PLio/reactivex/rxjava3/internal/operators/mixed/SingleFlatMapObservable$FlatMapObserver;->dispose()V @@ -38158,12 +37371,22 @@ PLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$Lat PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver$DelayErrorInnerObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableConcatMap$ConcatMapDelayErrorObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver$InnerObserver;->onSuccess(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->(Lio/reactivex/rxjava3/core/Observer;Lio/reactivex/rxjava3/functions/Function;Z)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe$FlatMapMaybeObserver;->onSubscribe(Lio/reactivex/rxjava3/disposables/Disposable;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapMaybe;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->drainLoop()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->getOrCreateQueue()Lio/reactivex/rxjava3/internal/queue/SpscLinkedArrayQueue; PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromArray$FromArrayDisposable;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->dispose()V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onNext(Ljava/lang/Object;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher$PublisherSubscriber;->onSubscribe(Lorg/reactivestreams/Subscription;)V +PLio/reactivex/rxjava3/internal/operators/observable/ObservableFromPublisher;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V PLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->requestFusion(I)I PLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->clear()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->isEmpty()Z @@ -38181,6 +37404,8 @@ PLio/reactivex/rxjava3/internal/operators/observable/ObservableSkip$SkipObserver PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->dispose()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->disposeInner()V PLio/reactivex/rxjava3/internal/operators/observable/ObservableThrottleFirstTimed$DebounceTimedObserver;->dispose()V +PLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->isEmpty()Z +PLio/reactivex/rxjava3/internal/queue/MpscLinkedQueue;->lvConsumerNode()Lio/reactivex/rxjava3/internal/queue/MpscLinkedQueue$LinkedQueueNode; PLio/reactivex/rxjava3/internal/queue/SpscArrayQueue;->clear()V PLio/reactivex/rxjava3/internal/queue/SpscArrayQueue;->isEmpty()Z PLio/reactivex/rxjava3/internal/schedulers/AbstractDirectTask;->cancelFuture(Ljava/util/concurrent/Future;)V @@ -38198,8 +37423,11 @@ PLio/reactivex/rxjava3/internal/util/AtomicThrowable;->tryTerminateAndReport()V PLio/reactivex/rxjava3/internal/util/ExceptionHelper;->terminate(Ljava/util/concurrent/atomic/AtomicReference;)Ljava/lang/Throwable; PLio/reactivex/rxjava3/internal/util/NotificationLite;->acceptFull(Ljava/lang/Object;Lio/reactivex/rxjava3/core/Observer;)Z PLio/reactivex/rxjava3/internal/util/NotificationLite;->complete()Ljava/lang/Object; +PLio/reactivex/rxjava3/internal/util/OpenHashSet;->rehash()V PLio/reactivex/rxjava3/internal/util/QueueDrainHelper;->checkTerminated(ZZLio/reactivex/rxjava3/core/Observer;ZLio/reactivex/rxjava3/internal/fuseable/SimpleQueue;Lio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/internal/util/ObservableQueueDrain;)Z PLio/reactivex/rxjava3/internal/util/QueueDrainHelper;->drainLoop(Lio/reactivex/rxjava3/internal/fuseable/SimplePlainQueue;Lio/reactivex/rxjava3/core/Observer;ZLio/reactivex/rxjava3/disposables/Disposable;Lio/reactivex/rxjava3/internal/util/ObservableQueueDrain;)V +PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy$default(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lio/reactivex/rxjava3/disposables/Disposable; +PLio/reactivex/rxjava3/kotlin/SubscribersKt;->subscribeBy(Lio/reactivex/rxjava3/core/Maybe;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)Lio/reactivex/rxjava3/disposables/Disposable; PLio/reactivex/rxjava3/observers/DisposableObserver;->dispose()V PLio/reactivex/rxjava3/observers/SerializedObserver;->dispose()V PLio/reactivex/rxjava3/observers/SerializedObserver;->onComplete()V @@ -38213,11 +37441,86 @@ PLio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable;->dispose()V PLio/reactivex/rxjava3/subjects/PublishSubject;->remove(Lio/reactivex/rxjava3/subjects/PublishSubject$PublishDisposable;)V PLio/reactivex/rxjava3/subjects/SerializedSubject;->test(Ljava/lang/Object;)Z PLj$/util/DesugarCollections;->a()Ljava/lang/reflect/Constructor; +PLj$/util/Optional;->ifPresent(Lj$/util/function/Consumer;)V +PLj$/util/S;->s(Lj$/util/function/Consumer;)Z PLj$/util/d;->a(Ljava/util/Set;Ljava/lang/Object;)Ljava/util/Set; PLj$/util/d;->keySet()Ljava/util/Set; +PLj$/util/function/b;->(Ljava/util/Comparator;I)V +PLj$/util/stream/A1;->(Lj$/util/stream/V2;Ljava/lang/Object;I)V +PLj$/util/stream/A1;->l1()Lj$/util/stream/P1; +PLj$/util/stream/E1;->(Lj$/util/function/BinaryOperator;)V +PLj$/util/stream/E1;->accept(Ljava/lang/Object;)V +PLj$/util/stream/E1;->get()Ljava/lang/Object; +PLj$/util/stream/E1;->m()V +PLj$/util/stream/E1;->n(J)V +PLj$/util/stream/E1;->q()Z +PLj$/util/stream/Y1;->limit(J)Lj$/util/stream/Stream; +PLj$/util/stream/Y1;->max(Ljava/util/Comparator;)Lj$/util/Optional; +PLj$/util/stream/Y1;->n(Lj$/util/function/BinaryOperator;)Lj$/util/Optional; +PLj$/util/stream/h2;->(Lj$/util/stream/i2;Lj$/util/stream/g2;)V +PLj$/util/stream/h2;->accept(Ljava/lang/Object;)V +PLj$/util/stream/h2;->n(J)V +PLj$/util/stream/h2;->q()Z +PLj$/util/stream/i2;->(Lj$/util/stream/c;IJJ)V +PLj$/util/stream/i2;->B1(ILj$/util/stream/g2;)Lj$/util/stream/g2; +PLj$/util/stream/w0;->C0(JJJ)J +PLj$/util/stream/w0;->S0(J)I +PLj$/util/stream/w0;->k1(Lj$/util/stream/c;JJ)Lj$/util/stream/Stream; +PLj$/util/stream/w0;->p()I +PLkotlin/collections/CollectionsKt;->intersect(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/Set; +PLkotlin/collections/CollectionsKt;->retainAll(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Z +PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->filterInPlace$CollectionsKt__MutableCollectionsKt(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;Z)Z +PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->retainAll(Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Z +PLkotlin/collections/CollectionsKt__MutableCollectionsKt;->retainAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z +PLkotlin/collections/CollectionsKt___CollectionsKt;->intersect(Ljava/lang/Iterable;Ljava/lang/Iterable;)Ljava/util/Set; +PLkotlin/sequences/SequenceBuilderIterator;->yieldAll(Ljava/util/Iterator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; +PLkotlin/sequences/SequenceScope;->yieldAll(Lkotlin/sequences/Sequence;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; PLkotlin/sequences/SequencesKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->(Lkotlin/jvm/functions/Function2;)V PLkotlin/sequences/SequencesKt__SequenceBuilderKt$sequence$$inlined$Sequence$1;->iterator()Ljava/util/Iterator; +PLkotlin/sequences/SequencesKt__SequenceBuilderKt;->sequence(Lkotlin/jvm/functions/Function2;)Lkotlin/sequences/Sequence; +PLme/leolin/shortcutbadger/ShortcutBadgeException;->(Ljava/lang/String;)V +PLme/leolin/shortcutbadger/ShortcutBadgeException;->(Ljava/lang/String;Ljava/lang/Exception;)V +PLme/leolin/shortcutbadger/ShortcutBadger;->()V +PLme/leolin/shortcutbadger/ShortcutBadger;->applyCount(Landroid/content/Context;I)Z +PLme/leolin/shortcutbadger/ShortcutBadger;->applyCountOrThrow(Landroid/content/Context;I)V +PLme/leolin/shortcutbadger/ShortcutBadger;->initBadger(Landroid/content/Context;)Z +PLme/leolin/shortcutbadger/ShortcutBadger;->removeCount(Landroid/content/Context;)Z +PLme/leolin/shortcutbadger/impl/AdwHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/AdwHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/ApexHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/ApexHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/AsusHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/AsusHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/DefaultBadger;->()V +PLme/leolin/shortcutbadger/impl/DefaultBadger;->executeBadge(Landroid/content/Context;Landroid/content/ComponentName;I)V +PLme/leolin/shortcutbadger/impl/DefaultBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/EverythingMeHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/EverythingMeHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/HuaweiHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/HuaweiHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/NewHtcHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/NewHtcHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/NovaHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/NovaHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/OPPOHomeBader;->()V +PLme/leolin/shortcutbadger/impl/OPPOHomeBader;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/SamsungHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/SamsungHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/SamsungHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/SonyHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/SonyHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/VivoHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/VivoHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/ZTEHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/ZTEHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/impl/ZukHomeBadger;->()V +PLme/leolin/shortcutbadger/impl/ZukHomeBadger;->getSupportLaunchers()Ljava/util/List; +PLme/leolin/shortcutbadger/util/BroadcastHelper;->resolveBroadcast(Landroid/content/Context;Landroid/content/Intent;)Ljava/util/List; +PLme/leolin/shortcutbadger/util/BroadcastHelper;->sendDefaultIntentExplicitly(Landroid/content/Context;Landroid/content/Intent;)V +PLme/leolin/shortcutbadger/util/BroadcastHelper;->sendIntentExplicitly(Landroid/content/Context;Landroid/content/Intent;)V +PLokhttp3/internal/ws/RealWebSocket$Close;->(ILokio/ByteString;J)V +PLokhttp3/internal/ws/RealWebSocket;->runWriter()V PLorg/signal/core/util/ByteSize;->getInKibiBytes()F PLorg/signal/core/util/ByteSize;->getInMebiBytes()F PLorg/signal/core/util/FloatExtensionsKt;->roundedString(FI)Ljava/lang/String; @@ -38226,16 +37529,31 @@ PLorg/signal/core/util/MemoryTracker$AppHeapUsage;->getCurrentTotalBytes()J PLorg/signal/core/util/MemoryTracker$AppHeapUsage;->getUsedBytes()J PLorg/signal/core/util/MemoryTracker;->byteDisplay(J)Ljava/lang/String; PLorg/signal/core/util/MemoryTracker;->poll()V +PLorg/signal/core/util/PendingIntentFlags;->cancelCurrent()I +PLorg/signal/core/util/StringUtil;->forceLtr(Ljava/lang/CharSequence;)Ljava/lang/String; PLorg/signal/core/util/concurrent/DeadlockDetector$$ExternalSyntheticLambda0;->run()V PLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->access$isExecutorFull(Lorg/signal/core/util/concurrent/DeadlockDetector$Companion;Ljava/util/concurrent/ExecutorService;)Z PLorg/signal/core/util/concurrent/DeadlockDetector$Companion;->isExecutorFull(Ljava/util/concurrent/ExecutorService;)Z PLorg/signal/core/util/concurrent/DeadlockDetector$ExecutorInfo;->getExecutor()Ljava/util/concurrent/ExecutorService; PLorg/signal/core/util/concurrent/DeadlockDetector;->$r8$lambda$cvCzVPqdRG5CuUCNRezQN9z8MDY(Lorg/signal/core/util/concurrent/DeadlockDetector;)V +PLorg/signal/core/util/concurrent/DeadlockDetector;->hasPotentialLock([Ljava/lang/StackTraceElement;)Z PLorg/signal/core/util/concurrent/DeadlockDetector;->isWaiting(Ljava/lang/Thread$State;)Z PLorg/signal/core/util/concurrent/DeadlockDetector;->poll()V PLorg/signal/core/util/concurrent/LifecycleDisposable;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/signal/core/util/concurrent/LifecycleDisposable;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function0;)V +PLorg/signal/core/util/concurrent/MaybeCompat$$ExternalSyntheticLambda0;->subscribe(Lio/reactivex/rxjava3/core/MaybeEmitter;)V +PLorg/signal/core/util/concurrent/MaybeCompat;->$r8$lambda$aPKBr0JUhvb1CVWSMT6CNAHU584(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V +PLorg/signal/core/util/concurrent/MaybeCompat;->()V +PLorg/signal/core/util/concurrent/MaybeCompat;->()V +PLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable$lambda$0(Lkotlin/jvm/functions/Function0;Lio/reactivex/rxjava3/core/MaybeEmitter;)V +PLorg/signal/core/util/concurrent/MaybeCompat;->fromCallable(Lkotlin/jvm/functions/Function0;)Lio/reactivex/rxjava3/core/Maybe; +PLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;)V +PLorg/signal/core/util/logging/Log$Logger;->i(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)V +PLorg/signal/core/util/logging/Log;->internal()Lorg/signal/core/util/logging/Log$Logger; PLorg/signal/libsignal/protocol/IdentityKey;->equals(Ljava/lang/Object;)Z PLorg/signal/libsignal/protocol/IdentityKey;->getPublicKey()Lorg/signal/libsignal/protocol/ecc/ECPublicKey; +PLorg/thoughtcrime/securesms/ApplicationContext$$ExternalSyntheticLambda59;->isInternal()Z PLorg/thoughtcrime/securesms/LoggingFragment;->onDestroy()V PLorg/thoughtcrime/securesms/LoggingFragment;->onStop()V PLorg/thoughtcrime/securesms/MainActivity;->onStop()V @@ -38244,25 +37562,65 @@ PLorg/thoughtcrime/securesms/PassphraseRequiredActivity;->removeClearKeyReceiver PLorg/thoughtcrime/securesms/animation/AnimationStartListener;->()V PLorg/thoughtcrime/securesms/animation/AnimationStartListener;->()V PLorg/thoughtcrime/securesms/animation/AnimationStartListener;->onAnimationEnd(Landroid/animation/Animator;)V +PLorg/thoughtcrime/securesms/audio/AudioRecorder$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/audio/AudioRecorder;)V +PLorg/thoughtcrime/securesms/audio/AudioRecorder;->()V +PLorg/thoughtcrime/securesms/audio/AudioRecorder;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/audio/AudioRecordingHandler;)V +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->()V +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager$Companion;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager26;->(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)V +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->()V +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager;->create(Landroid/content/Context;Landroid/media/AudioManager$OnAudioFocusChangeListener;)Lorg/thoughtcrime/securesms/audio/AudioRecorderFocusManager; +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map; +PLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->access$getMessageIdsOpenedThisSession$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Set; PLorg/thoughtcrime/securesms/components/AnimatingToggle;->display(Landroid/view/View;)V +PLorg/thoughtcrime/securesms/components/AudioView$$ExternalSyntheticLambda0;->onChanged(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/components/AudioView;->$r8$lambda$70S_ChWvvHg6uKYhRw5m0jX0OG0(Lorg/thoughtcrime/securesms/components/AudioView;Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V +PLorg/thoughtcrime/securesms/components/AudioView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; +PLorg/thoughtcrime/securesms/components/AudioView;->hasAudioUri()Z +PLorg/thoughtcrime/securesms/components/AudioView;->isTarget(Landroid/net/Uri;)Z PLorg/thoughtcrime/securesms/components/AudioView;->onDetachedFromWindow()V +PLorg/thoughtcrime/securesms/components/AudioView;->onDuration(Landroid/net/Uri;J)V +PLorg/thoughtcrime/securesms/components/AudioView;->onPlaybackState(Lorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;)V +PLorg/thoughtcrime/securesms/components/AudioView;->onProgress(Landroid/net/Uri;DJ)V +PLorg/thoughtcrime/securesms/components/AudioView;->onSpeedChanged(Landroid/net/Uri;F)V +PLorg/thoughtcrime/securesms/components/AudioView;->onStart(Landroid/net/Uri;ZZ)V +PLorg/thoughtcrime/securesms/components/AvatarImageView;->setFallbackPhotoProvider(Lorg/thoughtcrime/securesms/recipients/Recipient$FallbackPhotoProvider;)V +PLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->()V +PLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;)V +PLorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener;->(Lorg/thoughtcrime/securesms/components/InputPanel$MediaListener;Lorg/thoughtcrime/securesms/components/ComposeText$CommitContentListener-IA;)V +PLorg/thoughtcrime/securesms/components/ComposeText;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; +PLorg/thoughtcrime/securesms/components/ComposeText;->setCursorPositionChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$CursorPositionChangedListener;)V +PLorg/thoughtcrime/securesms/components/ComposeText;->setInlineQueryChangedListener(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryChangedListener;)V +PLorg/thoughtcrime/securesms/components/ComposeText;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V +PLorg/thoughtcrime/securesms/components/ComposeText;->setStylingChangedListener(Lorg/thoughtcrime/securesms/components/ComposeText$StylingChangedListener;)V PLorg/thoughtcrime/securesms/components/ConversationItemFooter;->onDetachedFromWindow()V PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->formatUnreadCount(I)Ljava/lang/CharSequence; +PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setOnClickListener(Landroid/view/View$OnClickListener;)V PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setShown(Z)V PLorg/thoughtcrime/securesms/components/ConversationScrollToView;->setUnreadCount(I)V +PLorg/thoughtcrime/securesms/components/ConversationSearchBottomBar;->setEventListener(Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar$EventListener;)V PLorg/thoughtcrime/securesms/components/DeliveryStatusView;->isPending()Z PLorg/thoughtcrime/securesms/components/HidingLinearLayout;->hide()V PLorg/thoughtcrime/securesms/components/HidingLinearLayout;->show()V +PLorg/thoughtcrime/securesms/components/InputAwareConstraintLayout;->addInputListener(Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout$Listener;)V +PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V +PLorg/thoughtcrime/securesms/components/InputPanel$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V PLorg/thoughtcrime/securesms/components/InputPanel$3;->(Lorg/thoughtcrime/securesms/components/InputPanel;Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/InputPanel$3;->onAnimationStart(Landroid/animation/Animator;)V PLorg/thoughtcrime/securesms/components/InputPanel;->fadeIn(Landroid/view/View;)V PLorg/thoughtcrime/securesms/components/InputPanel;->fadeInNormalComposeViews()V +PLorg/thoughtcrime/securesms/components/InputPanel;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; PLorg/thoughtcrime/securesms/components/InputPanel;->inEditMessageMode()Z PLorg/thoughtcrime/securesms/components/InputPanel;->isRecordingInLockedMode()Z PLorg/thoughtcrime/securesms/components/InputPanel;->onPause()V PLorg/thoughtcrime/securesms/components/InputPanel;->readDimen(I)I -PLorg/thoughtcrime/securesms/components/InputPanel;->setLinkPreview(Lorg/thoughtcrime/securesms/mms/GlideRequests;Lj$/util/Optional;)V +PLorg/thoughtcrime/securesms/components/InputPanel;->setLinkPreview(Lcom/bumptech/glide/RequestManager;Lj$/util/Optional;)V +PLorg/thoughtcrime/securesms/components/InputPanel;->setListener(Lorg/thoughtcrime/securesms/components/InputPanel$Listener;)V +PLorg/thoughtcrime/securesms/components/InputPanel;->setStickerSuggestions(Ljava/util/List;)V PLorg/thoughtcrime/securesms/components/InputPanel;->setVoiceNoteDraft(Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V +PLorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout;->addKeyboardStateListener(Lorg/thoughtcrime/securesms/components/InsetAwareConstraintLayout$KeyboardStateListener;)V PLorg/thoughtcrime/securesms/components/LinkPreviewView;->onSaveInstanceState()Landroid/os/Parcelable; PLorg/thoughtcrime/securesms/components/LinkPreviewView;->setCorners(II)V PLorg/thoughtcrime/securesms/components/LinkPreviewViewThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V @@ -38272,22 +37630,36 @@ PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->cancelAction(Z) PLorg/thoughtcrime/securesms/components/MicrophoneRecorderView;->isRecordingLocked()Z PLorg/thoughtcrime/securesms/components/QuoteView;->onDetachedFromWindow()V PLorg/thoughtcrime/securesms/components/RecyclerViewParentTransitionController;->onViewDetachedFromWindow(Landroid/view/View;)V -PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->isListCommitted()Z +PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$3;->test(Lorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;)Z +PLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate$ScrollToPositionRequest;->getPosition()I PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V PLorg/thoughtcrime/securesms/components/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V PLorg/thoughtcrime/securesms/components/SearchView;->appendEmojiFilter(Landroid/widget/TextView;)[Landroid/text/InputFilter; PLorg/thoughtcrime/securesms/components/SearchView;->initEmojiFilter()V +PLorg/thoughtcrime/securesms/components/SendButton;->setPopupContainer(Landroid/view/ViewGroup;)V +PLorg/thoughtcrime/securesms/components/SendButton;->setScheduledSendListener(Lorg/thoughtcrime/securesms/components/SendButton$ScheduledSendListener;)V +PLorg/thoughtcrime/securesms/components/ThumbnailView;->dispatchDraw(Landroid/graphics/Canvas;)V +PLorg/thoughtcrime/securesms/components/TypingStatusRepository;->getTypists(J)Landroidx/lifecycle/LiveData; PLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->invoke(Landroidx/viewbinding/ViewBinding;)V PLorg/thoughtcrime/securesms/components/ViewBinderDelegate$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/components/ViewBinderDelegate;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->addOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->removeOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V +PLorg/thoughtcrime/securesms/components/emoji/EmojiEditText;->setOnFocusChangeListener(Landroid/view/View$OnFocusChangeListener;)V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult;)V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider;->$r8$lambda$yWqSXcpiMY6E3k4l81kOhV5ANk4(Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult;)V PLorg/thoughtcrime/securesms/components/emoji/EmojiProvider;->lambda$getEmojiDrawable$0(Lorg/thoughtcrime/securesms/components/emoji/EmojiProvider$EmojiDrawable;Lorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult;)V -PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->isSingleLine()Z +PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V +PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/components/emoji/EmojiTextView$$ExternalSyntheticLambda1;->()V +PLorg/thoughtcrime/securesms/components/mention/MentionAnnotation$$ExternalSyntheticLambda1;->()V +PLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;)Ljava/util/List; +PLorg/thoughtcrime/securesms/components/mention/MentionAnnotation;->getMentionAnnotations(Landroid/text/Spanned;II)Ljava/util/List; +PLorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher;->setMentionValidator(Lorg/thoughtcrime/securesms/components/mention/MentionValidatorWatcher$MentionValidator;)V PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;->$r8$lambda$7zbeUa9i765Aa2G9x9qw8f4qjOo(Lorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;J)V PLorg/thoughtcrime/securesms/components/registration/PulsingFloatingActionButton$1$1;->lambda$onAnimationEnd$0(J)V @@ -38300,32 +37672,80 @@ PLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate$1;->onVi PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->onDetachedFromWindow()V PLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->getCompressionProgress()Ljava/util/Map; +PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->getVoiceNotePlaybackState()Landroidx/lifecycle/MutableLiveData; PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getPlayheadPositionMillis()J +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getSpeed()F +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getTrackDuration()J +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->getUri()Landroid/net/Uri; +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isAutoReset()Z +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlaybackState;->isPlaying()Z +PLorg/thoughtcrime/securesms/components/voice/VoiceNotePlayerCallback;->onDisconnected(Landroidx/media3/session/MediaSession;Landroidx/media3/session/MediaSession$ControllerInfo;)V PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/components/voice/VoiceNoteProximityWakeLockManager;->unregisterFromLifecycle()V PLorg/thoughtcrime/securesms/contacts/avatars/ProfileContactPhoto;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$sam$androidx_lifecycle_Observer$0;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchMediator$sam$androidx_lifecycle_Observer$0;->getFunctionDelegate()Lkotlin/Function; PLorg/thoughtcrime/securesms/contacts/paged/ContactSearchViewModel;->onCleared()V +PLorg/thoughtcrime/securesms/conversation/ClipProjectionDrawable;->draw(Landroid/graphics/Canvas;)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->()V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider;->(Lorg/thoughtcrime/securesms/conversation/ConversationHeaderView$FallbackPhotoProvider-IA;)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideButton()V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->hideDescription()V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAbout(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setAvatar(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setLinkifyDescription(Z)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setSubtitle(Ljava/lang/CharSequence;I)V +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->showBackgroundBubble(Z)V +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->canInitializeFromDatabase()Z +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftContentType()Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMedia()Landroid/net/Uri; +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftMediaType()Lorg/thoughtcrime/securesms/mms/SlideFactory$MediaType; +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getDraftText()Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getMedia()Ljava/util/ArrayList; +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getShareDataTimestamp()J +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->getStickerLocator()Lorg/thoughtcrime/securesms/stickers/StickerLocator; +PLorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;->isBorderless()Z +PLorg/thoughtcrime/securesms/conversation/ConversationItem;->canPlayContent()Z PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBadgeImageView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getBubbleViews()Ljava/util/List; +PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getContactPhotoHolderView()Landroid/view/View; +PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getGiftId()J PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getQuotedIndicatorView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getReactionsView()Landroid/view/View; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getReactionsView()Lorg/thoughtcrime/securesms/reactions/ReactionsConversationView; PLorg/thoughtcrime/securesms/conversation/ConversationItem;->getReplyView()Landroid/view/View; +PLorg/thoughtcrime/securesms/conversation/ConversationItem;->isGiftMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z PLorg/thoughtcrime/securesms/conversation/ConversationItem;->onDetachedFromWindow()V PLorg/thoughtcrime/securesms/conversation/ConversationItem;->onRecipientChanged(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;)V +PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->()V +PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$SwipeAvailabilityProvider;Lorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback$OnSwipeListener;)V +PLorg/thoughtcrime/securesms/conversation/ConversationItemSwipeCallback;->attachToRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V +PLorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener;->(Lorg/thoughtcrime/securesms/conversation/ConversationItemTouchListener$Callback;)V PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->(Landroid/view/Menu;Z)V PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider$onCreateMenu$1;->invoke(Z)V PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->applyTitleSpan(Landroid/view/MenuItem;Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->hideMenuItem(Landroid/view/Menu;I)V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu;->()V -PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu;->access$getTAG$p()Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->setAfterFirstRenderMode(Z)V +PLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel;->getSearchResults()Landroidx/lifecycle/LiveData; +PLorg/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter;->setStickers(Ljava/util/List;)V +PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFF)V +PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->(FFFLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator-IA;)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$BubblePositionInterpolator;->getInterpolation(F)F +PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FF)V +PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->(FFF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper$ClampingLinearInterpolator;->getInterpolation(F)F +PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->()V +PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->dpToPx(I)I PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->update(Lorg/thoughtcrime/securesms/conversation/v2/items/InteractiveConversationElement;FF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateBodyBubbleTransition(Ljava/util/List;FF)V PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateContactPhotoHolderTransition(Landroid/view/View;FF)V @@ -38334,127 +37754,407 @@ PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->upd PLorg/thoughtcrime/securesms/conversation/ConversationSwipeAnimationHelper;->updateReplyIconTransition(Landroid/view/View;FFF)V PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->onSaveInstanceState()Landroid/os/Parcelable; PLorg/thoughtcrime/securesms/conversation/ConversationTitleView;->setVerified(Z)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$1;->(Lkotlin/jvm/functions/Function0;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->()V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->()V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lkotlin/jvm/functions/Function0;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->(Lorg/thoughtcrime/securesms/conversation/ConversationUpdateTick$OnTickListener;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onPause(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ConversationUpdateTick;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda0;->()V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda1;->()V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda2;->run()V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper$$ExternalSyntheticLambda3;->run()V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$gcFI10LhFCaBEmJzQp8t_xBcU8U(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->$r8$lambda$h27hRrs_Rwv2sGlsmjqcW0dGIZI(Lorg/thoughtcrime/securesms/conversation/MarkReadHelper;J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$0(J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->lambda$onViewsRevealed$1(J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->onViewsRevealed(J)V +PLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->stopIgnoringViewReveals(Ljava/lang/Long;)V PLorg/thoughtcrime/securesms/conversation/MessageStyler;->boldStyle()Landroid/text/style/CharacterStyle; PLorg/thoughtcrime/securesms/conversation/MessageStyler;->italicStyle()Landroid/text/style/CharacterStyle; PLorg/thoughtcrime/securesms/conversation/MessageStyler;->monoStyle()Landroid/text/style/CharacterStyle; PLorg/thoughtcrime/securesms/conversation/MessageStyler;->strikethroughStyle()Landroid/text/style/CharacterStyle; +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda3;->(Lio/reactivex/rxjava3/core/ObservableEmitter;J)V +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda4;->cancel()V +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->(J)V +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository$$ExternalSyntheticLambda5;->subscribe(Lio/reactivex/rxjava3/core/ObservableEmitter;)V +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->$r8$lambda$2XiX_Dh66c_pIVZzuRFfoiDjp1A(JLio/reactivex/rxjava3/core/ObservableEmitter;)V PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->$r8$lambda$ej8HJIkF2PUVMbFRXSAuhVdCWz4(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount$lambda$6$lambda$5(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount$lambda$6(JLio/reactivex/rxjava3/core/ObservableEmitter;)V +PLorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;->getScheduledMessageCount(J)Lio/reactivex/rxjava3/core/Observable; PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->clearDraft()V +PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->getPlaybackStateObserver()Landroidx/lifecycle/Observer; +PLorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView;->setListener(Lorg/thoughtcrime/securesms/conversation/VoiceNoteDraftView$Listener;)V +PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->()V +PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->(Landroidx/activity/ComponentActivity;)V +PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onPause(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->onStop(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/VoiceRecorderWakeLock;->release()V +PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$scrollListener$1;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V +PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayerXfermode$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroid/graphics/PorterDuffXfermode; +PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$getLayoutManager(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;)Landroidx/recyclerview/widget/LinearLayoutManager; +PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->access$setUseLayer$p(Lorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;Z)V +PLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer;->getLayoutManager()Landroidx/recyclerview/widget/LinearLayoutManager; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$$ExternalSyntheticLambda0;->run()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Ljava/lang/CharSequence;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component1()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft;->component2()Ljava/lang/CharSequence; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$getShareOrDraftData$1;->invoke()Lkotlin/Pair; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->$r8$lambda$SLYPkhFM2MVtyCpgHajSG6aOkdY(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/ThreadTable;Lorg/thoughtcrime/securesms/database/DraftTable;Ljava/util/concurrent/Executor;Lorg/thoughtcrime/securesms/conversation/ConversationIntents$Args;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->access$getShareOrDraftDataInternal(Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)Lkotlin/Pair; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->getShareOrDraftDataInternal(J)Lkotlin/Pair; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->loadDraftsInternal(J)Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository$DatabaseDraft; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->saveDrafts$lambda$9(Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;Lorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;J)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;->saveDrafts(JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copy(JLorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copyAndSetDrafts$default(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->copyAndSetDrafts(JLorg/thoughtcrime/securesms/database/DraftTable$Drafts;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->getThreadId()J PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->getVoiceNoteDraft()Lorg/thoughtcrime/securesms/database/DraftTable$Draft; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftState;->toDrafts()Lorg/thoughtcrime/securesms/database/DraftTable$Drafts; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/database/DraftTable$Drafts;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1$1;->invoke(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$1;->accept(Lkotlin/Pair;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel$loadShareOrDraftData$2;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/MaybeSource; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->(JLorg/thoughtcrime/securesms/conversation/drafts/DraftRepository;)V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$getStore$p(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;)Lorg/thoughtcrime/securesms/util/rx/RxStore; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->access$saveDrafts(Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->getVoiceNoteDraft()Lorg/thoughtcrime/securesms/database/DraftTable$Draft; +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->loadShareOrDraftData(J)Lio/reactivex/rxjava3/core/Maybe; PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->onCleared()V +PLorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel;->saveDrafts(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Lorg/thoughtcrime/securesms/conversation/drafts/DraftState; +PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->(Landroidx/recyclerview/widget/RecyclerView;)V +PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator$$ExternalSyntheticLambda1;->run()V +PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->$r8$lambda$IJ0Uk3eauzGuBkd_D1PotCUrlIQ(Landroidx/recyclerview/widget/RecyclerView;)V +PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->animateAppearance(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;)Z PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->endAnimations()V PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->endSlideAnimations()V +PLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished$lambda$4(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onPause(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$$ExternalSyntheticLambda1;->onFocusChange(Landroid/view/View;Z)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onPause(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$2;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->()V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2$special$$inlined$doOnEachLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->$r8$lambda$GRwMc6fkPK5Q2WrXsl-thUTyAds(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;Landroid/view/View;Z)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->()V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;Landroid/view/View;Landroid/view/ViewGroup;Lorg/thoughtcrime/securesms/components/ComposeText;)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->_init_$lambda$0(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;Landroid/view/View;Z)V PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->access$dismiss(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->access$getEmojiPopup$p(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsPopup; +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->dismiss()V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->onOrientationChange(Z)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2;->updateList(Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$Results;)V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2$None;->()V +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getResults()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2;->getSelection()Lio/reactivex/rxjava3/core/Observable; PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onPause(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/BubbleLayoutTransitionListener;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity$$ExternalSyntheticLambda0;->run()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->$r8$lambda$rJaCnn2xrQlJTPwnM83GXFMdMzE(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onCreate$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationActivity;->onDestroy()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->canPlayContent()Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->showProjectionArea()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder$bind$subtitle$2;->invoke(Ljava/lang/String;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->$r8$lambda$RwrnJe2SKX6YQ0B5PDojQRbXNOc(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroid/view/View;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind$lambda$1(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ThreadHeaderViewHolder;->bind(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Boolean; PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$onDetachedFromRecyclerView$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->hasNoConversationMessages()Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onDetachedFromRecyclerView(Landroidx/recyclerview/widget/RecyclerView;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onViewRecycled(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->onViewRecycled(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->setSearchQuery(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->updateSearchQuery(Ljava/lang/String;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reminderStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$reviewBannerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$unverifiedBannerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$voiceNotePlayerStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearReminder()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearRequestReview()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearUnverifiedBanner()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->clearVoiceNotePlayer()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getReminderStub()Lorg/thoughtcrime/securesms/util/views/Stub; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getReviewBannerStub()Lorg/thoughtcrime/securesms/util/views/Stub; PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getUnverifiedBannerStub()Lorg/thoughtcrime/securesms/util/views/Stub; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->getVoiceNotePlayerStub()Lorg/thoughtcrime/securesms/util/views/Stub; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->hide(Lorg/thoughtcrime/securesms/util/views/Stub;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/ConversationBannerView$Listener;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda19;->(Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda20;->(Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda21;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda22;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$$ExternalSyntheticLambda23;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$AttachmentKeyboardFragmentListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$BackPressedDelegate;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener;->onFocusChange(Landroid/view/View;Z)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationBannerListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$1;->(Landroidx/appcompat/widget/SearchView;Landroidx/appcompat/widget/SearchView$OnQueryTextListener;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/Menu;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback$onOptionsMenuCreated$queryListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->clearExpiring()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ConversationOptionsMenuCallback;->onOptionsMenuCreated(Landroid/view/Menu;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver;->onItemRangeChanged(II)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DisabledInputListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$InputPanelListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$KeyboardEvents;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;Landroidx/recyclerview/widget/LinearLayoutManager;Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onCreate(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onPause(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onResume(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onStart(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$LastScrolledPositionUpdater;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$MotionEventRelayDrain;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollDateHeaderHelper;->bind(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->(Lkotlin/jvm/functions/Function1;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(J)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener$onScrolled$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->$r8$lambda$SqiWUifYWEV36mNfvnPsrkHWoAw(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled$lambda$0(Lkotlin/jvm/functions/Function1;Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->presentComposeDivider()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SearchEventListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SendButtonListener;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$SwipeAvailabilityProvider;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$VoiceMessageRecordingSessionCallbacks;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$binding$3;->invoke(Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->invoke(Lj$/util/Optional;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$10;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$11;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$12;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->test(Ljava/lang/Object;Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$15;->test(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->accept(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$16;->accept(Lorg/thoughtcrime/securesms/conversation/drafts/DraftState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->invoke(I)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$17;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Lj$/util/Optional;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$18;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->test(Ljava/lang/Object;Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$1;->test(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$2;->invoke(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$3;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$4;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$attachListener$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$doAfterFirstRender$conversationUpdateTick$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$draftViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$5;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$6;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$7;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$8;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeInlineSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeLinkPreviews$1;->invoke(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeSearch$2;->invoke(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeStickerSuggestions$1;->invoke(Ljava/util/List;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$inlineQueryController$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke(Landroidx/lifecycle/SavedStateHandle;)Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$linkPreviewViewModel$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$motionEventRelay$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$moveToStartPosition$1;->invoke()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1$1;->run()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$observeConversationThread$4$invoke$lambda$1$$inlined$doAfterNextLayout$1;->onLayoutChange(Landroid/view/View;IIIIIIII)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentGroupCallJoinButton$2;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$presentTypingIndicator$2;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->(Lkotlin/jvm/functions/Function1;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->getFunctionDelegate()Lkotlin/Function; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$sam$androidx_lifecycle_Observer$0;->onChanged(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->invoke()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$scheduledMessagesStub$2;->invoke()Lorg/thoughtcrime/securesms/util/views/Stub; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$searchViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Landroidx/lifecycle/ViewModelStore; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$4;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$5;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$activityViewModels$default$6;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$6;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Landroidx/lifecycle/ViewModelStore; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$7;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$8;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Landroidx/lifecycle/ViewModelProvider$Factory; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$special$$inlined$viewModels$default$9;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$stickerViewModel$2;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$doAfterFirstRender(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeText(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/ComposeText; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getComposeTextEventsListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ComposeTextEventsListener; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getDataObserver$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$DataObserver; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInlineQueryViewModel$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryViewModelV2; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getInputPanel(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/components/InputPanel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getLayoutManager$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroidx/recyclerview/widget/ConversationLayoutManager; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getMarkReadHelper$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/MarkReadHelper; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getScrollListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getSearchMenuItem$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Landroid/view/MenuItem; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$getTextDraftSaveDebouncer$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Lorg/thoughtcrime/securesms/util/Debouncer; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$handleScheduledMessagesCountChange(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;I)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$invalidateOptionsMenu(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isScrolledToBottom(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$isSearchRequested$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$onRecipientChanged(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/recipients/Recipient;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentIdentityRecordsState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentRequestReviewState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$presentScrollButtons(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setAnimationsAllowed$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Z)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setScrollListener$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$setSearchMenuItem$p(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;Landroid/view/MenuItem;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->access$updateToggleButtonState(Lorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getDraftViewModel()Lorg/thoughtcrime/securesms/conversation/drafts/DraftViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getInlineQueryController()Lorg/thoughtcrime/securesms/conversation/ui/inlinequery/InlineQueryResultsControllerV2; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getLinkPreviewViewModel()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getMotionEventRelay()Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getScheduledMessagesStub()Lorg/thoughtcrime/securesms/util/views/Stub; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchNav()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSearchViewModel()Lorg/thoughtcrime/securesms/conversation/ConversationSearchViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendButton()Lorg/thoughtcrime/securesms/components/SendButton; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getSendEditButton()Landroid/widget/ImageButton; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getShareDataTimestampViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getStickerViewModel()Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getVoiceNoteMediaController()Lorg/thoughtcrime/securesms/components/voice/VoiceNoteMediaController; PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->handleScheduledMessagesCountChange(I)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeInlineSearch()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeLinkPreviews()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeSearch()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeStickerSuggestions()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->isScrolledToBottom()Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onDestroyView()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onPause()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onRecipientChanged(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentGroupCallJoinButton()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentIdentityRecordsState(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentRequestReviewState(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentScrollButtons(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->presentTypingIndicator()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->updateToggleButtonState()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Landroid/view/View;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getHeight()I +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->getItemView()Landroid/view/View; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations$DateHeaderViewHolder;->updateForWallpaper()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->access$timestamp(Lorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J +PLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->getHasWallpaper()Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda12;->(JJ)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda12;->run()V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda14;->call()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda19;->call()Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda9;->(J)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository$$ExternalSyntheticLambda9;->run()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$-gMXe-w-Xm5jHJapWlyQ6eOUlEE(JJ)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$ATtSNJzojyDhPrLSHCNff4Xrn4s(J)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$KdCOHPNqejWN1AhOnsjSsYWIQ1E(Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lj$/util/Optional; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->$r8$lambda$jYghkNuRsI_xLxRgZRxsCeMcFTc(Lorg/thoughtcrime/securesms/database/model/GroupRecord;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/recipients/Recipient;)Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getReminder(Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Maybe; PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->markLastSeen$lambda$28(J)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->markLastSeen(J)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->setLastVisibleMessageTimestamp$lambda$5(JJ)V @@ -38465,6 +38165,9 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->get PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getShowScrollButtons()Z PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->getUnreadCount()I PLorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;->toString()Ljava/lang/String; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$12;->apply(Lkotlin/Unit;Lj$/util/Optional;)Lj$/util/Optional; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$13;->apply(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$17;->onComplete()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$17;->onNext(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$17;->onNext(Ljava/util/List;)V @@ -38472,44 +38175,154 @@ PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4$$ExternalSy PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->$r8$lambda$DeiphTJKC3SI_gAZ1faGZoiWX80(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$4;->apply$lambda$4$lambda$3(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$canShowAsBubble$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->(Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$getRequestReviewState$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Lj$/util/Optional;)Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$groupMemberServiceIds$1;->test(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->(ZZ)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$setShowScrollButtonsForScrollPosition$1;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState;)Lorg/thoughtcrime/securesms/conversation/v2/ConversationScrollButtonState; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getGroupMemberServiceIds()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getHasMessageRequestState()Z +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getIdentityRecordsObservable()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRecipient()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getReminder()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getRequestReviewState()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScheduledMessagesCount()Lio/reactivex/rxjava3/core/Observable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getScrollButtonState()Lio/reactivex/rxjava3/core/Flowable; +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getSearchQuery()Lio/reactivex/rxjava3/core/Observable; PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->markLastSeen()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->onCleared()V PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->setLastScrolled(J)V +PLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->setShowScrollButtonsForScrollPosition(ZZ)V +PLorg/thoughtcrime/securesms/conversation/v2/DisabledInputView;->setListener(Lorg/thoughtcrime/securesms/conversation/v2/DisabledInputView$Listener;)V PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isGroup()Z PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isUnverified()Z PLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->isVerified()Z -PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->equals(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->getGroupRecord()Lorg/thoughtcrime/securesms/database/model/GroupRecord; +PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V +PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->()V +PLorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay;->setDrain(Lorg/thoughtcrime/securesms/conversation/v2/MotionEventRelay$Drain;)V +PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->()V +PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;)V +PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->(Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$IndividualReviewState;Lorg/thoughtcrime/securesms/conversation/v2/RequestReviewState$GroupReviewState;ILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/conversation/v2/RequestReviewState;->shouldShowReviewBanner()Z +PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V +PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->()V +PLorg/thoughtcrime/securesms/conversation/v2/ShareDataTimestampViewModel;->getTimestamp()J +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)V +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel$stickers$1;->apply(Ljava/lang/String;)Lio/reactivex/rxjava3/core/SingleSource; +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->()V +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;)V +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->(Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->access$getStickerSearchRepository$p(Lorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;)Lorg/thoughtcrime/securesms/stickers/StickerSearchRepository; +PLorg/thoughtcrime/securesms/conversation/v2/StickerSuggestionsViewModel;->getStickers()Lio/reactivex/rxjava3/core/Flowable; +PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->()V +PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->()V +PLorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate;->(Landroidx/fragment/app/Fragment;Lorg/thoughtcrime/securesms/audio/AudioRecorder;Lorg/thoughtcrime/securesms/conversation/v2/VoiceMessageRecordingDelegate$SessionCallback;)V +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areContentsTheSame(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areItemsTheSame(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/IncomingTextOnly;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areContentsTheSame(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areContentsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areItemsTheSame(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;)Z PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->getChangePayload(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/data/ThreadHeader;->getRecipientInfo()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo; PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallState;->getHasCapacity()Z +PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->getState()Lio/reactivex/rxjava3/core/Flowable; PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupCallViewModel;->onCleared()V PLorg/thoughtcrime/securesms/conversation/v2/groups/ConversationGroupViewModel;->onCleared()V +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;->getChatColors()Lorg/thoughtcrime/securesms/conversation/colors/ChatColors; +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;->getMask()Landroid/graphics/drawable/Drawable; +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsItemDecoration$onDraw$$inlined$filterIsInstance$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->getMask()Landroid/graphics/drawable/Drawable; +PLorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable;->setLocalChatColors(Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V +PLorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;->onMeasure(II)V +PLorg/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout;->shrinkWrapWidthMeasureSpec(I)I +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$$ExternalSyntheticLambda0;->onLayoutChange(Landroid/view/View;IIIIIIII)V +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$bodyBubbleDrawable$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$bodyBubbleDrawable$1;->invoke()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData; +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder$footerDrawable$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->$r8$lambda$ocilDMoff9b132TfYhzB6ol1qqk(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;Landroid/view/View;IIIIIIII)V +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->_init_$lambda$0(Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;Landroid/view/View;IIIIIIII)V +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->canPlayContent()Z +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->showProjectionArea()V +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getFooterBubbleColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I +PLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getReplyIconBackgroundColor()I +PLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->displayTuckedIntoBody()V +PLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->getFooterWidth()I +PLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPreMeasure()V PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onDestroyView()V PLorg/thoughtcrime/securesms/conversationlist/ConversationListFragment;->onStop()V PLorg/thoughtcrime/securesms/conversationlist/ConversationListViewModel;->onCleared()V PLorg/thoughtcrime/securesms/conversationlist/chatfilter/ConversationListFilterPullView;->onSaveInstanceState()Landroid/os/Parcelable; +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda13;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda26;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda26;->run()V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver$$ExternalSyntheticLambda6;->run()V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$2v1Sb-6JCd9xjyyzfbH5tKTRWy8(Lorg/thoughtcrime/securesms/database/DatabaseObserver;Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$8PzBCQMLi_6Y7FOR98cRbpXw-Xk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->$r8$lambda$ZjxWKgbWA1SSTmnWoVneQana_Lk(Lorg/thoughtcrime/securesms/database/DatabaseObserver;J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$notifyVerboseConversationListeners$20(J)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$registerScheduledMessageObserver$14(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$18(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->notifyVerboseConversationListeners(Ljava/util/Set;)V +PLorg/thoughtcrime/securesms/database/DatabaseObserver;->registerScheduledMessageObserver(JLorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V PLorg/thoughtcrime/securesms/database/DatabaseObserver;->unregisterObserver(Lorg/thoughtcrime/securesms/database/DatabaseObserver$MessageObserver;)V +PLorg/thoughtcrime/securesms/database/DatabaseTable;->notifyVerboseConversationListeners(Ljava/util/Set;)V +PLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->(Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->addIfNotNull(Lorg/thoughtcrime/securesms/database/DraftTable$Draft;)V +PLorg/thoughtcrime/securesms/database/DraftTable$Drafts;->getDraftOfType(Ljava/lang/String;)Lorg/thoughtcrime/securesms/database/DraftTable$Draft; +PLorg/thoughtcrime/securesms/database/DraftTable;->clearDrafts(J)V PLorg/thoughtcrime/securesms/database/MessageTable$markExpireStarted$1;->(Ljava/util/Collection;)V PLorg/thoughtcrime/securesms/database/MessageTable$markExpireStarted$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/database/MessageTable$markExpireStarted$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V PLorg/thoughtcrime/securesms/database/MessageTable;->getMessagePositionOnOrAfterTimestamp(JJ)I +PLorg/thoughtcrime/securesms/database/MessageTable;->getMessagesForNotificationState(Ljava/util/Collection;)Landroid/database/Cursor; +PLorg/thoughtcrime/securesms/database/MessageTable;->getScheduledMessageCountForThread(J)I PLorg/thoughtcrime/securesms/database/MessageTable;->markExpireStarted(Ljava/util/Collection;)V +PLorg/thoughtcrime/securesms/database/MessageTable;->setMessagesReadSince(JJ)Ljava/util/List; +PLorg/thoughtcrime/securesms/database/MessageTable;->setReactionsSeen(JJ)V PLorg/thoughtcrime/securesms/database/RxDatabaseObserver$$ExternalSyntheticLambda1;->cancel()V PLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->$r8$lambda$6u1bbd117Cl1h38MfeI7BgZPo1A(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V PLorg/thoughtcrime/securesms/database/RxDatabaseObserver;->databaseFlowable$lambda$1$lambda$0(Lorg/thoughtcrime/securesms/database/RxDatabaseObserver$RxObserver;)V +PLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->(Ljava/util/Map;Lorg/thoughtcrime/securesms/database/ThreadTable;Ljava/util/List;ZLkotlin/jvm/internal/Ref$BooleanRef;)V +PLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/database/ThreadTable$setReadSince$1;->invoke(Lorg/thoughtcrime/securesms/database/SQLiteDatabase;)V +PLorg/thoughtcrime/securesms/database/ThreadTable;->createQuery(Ljava/lang/String;J)Ljava/lang/String; +PLorg/thoughtcrime/securesms/database/ThreadTable;->getThreadRecord(Ljava/lang/Long;)Lorg/thoughtcrime/securesms/database/model/ThreadRecord; PLorg/thoughtcrime/securesms/database/ThreadTable;->setLastSeen(J)V +PLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(JZJ)Ljava/util/List; +PLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(Ljava/util/Map;Z)Ljava/util/List; +PLorg/thoughtcrime/securesms/database/ThreadTable;->setReadSince(Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;ZJ)Ljava/util/List; +PLorg/thoughtcrime/securesms/database/ThreadTable;->update(JZZ)Z PLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/database/model/ProfileAvatarFileDetails;->equals(Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/database/model/ThreadRecord;->isForcedUnread()Z +PLorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding;->(Landroid/view/View;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Lorg/thoughtcrime/securesms/components/AvatarImageView;Landroid/widget/LinearLayout;Lorg/thoughtcrime/securesms/badges/BadgeImageView;Lcom/google/android/material/button/MaterialButton;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;Landroid/view/View;Landroidx/constraintlayout/widget/ConstraintLayout;Landroid/view/View;Landroid/widget/TextView;Lorg/thoughtcrime/securesms/components/emoji/EmojiTextView;)V +PLorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding;->bind(Landroid/view/View;)Lorg/thoughtcrime/securesms/databinding/ConversationHeaderViewBinding; +PLorg/thoughtcrime/securesms/databinding/ConversationSearchNavBinding;->getRoot()Lorg/thoughtcrime/securesms/components/ConversationSearchBottomBar; +PLorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;->getRoot()Lorg/thoughtcrime/securesms/components/InputAwareConstraintLayout; PLorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult$Immediate;->()V PLorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult$Immediate;->(Landroid/graphics/Bitmap;)V PLorg/thoughtcrime/securesms/emoji/EmojiPageCache$LoadResult$Immediate;->getBitmap()Landroid/graphics/Bitmap; +PLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->access$maxOrZero(Ljava/util/List;)I +PLorg/thoughtcrime/securesms/emoji/EmojiSourceKt;->maxOrZero(Ljava/util/List;)I +PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Object;Ljava/lang/Object;)I +PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onPause(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->onStop(Landroidx/lifecycle/LifecycleOwner;)V @@ -38522,64 +38335,217 @@ PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->enqueue()V PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->getFactoryKey()Ljava/lang/String; PLorg/thoughtcrime/securesms/jobs/ConversationShortcutUpdateJob;->serialize()[B PLorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;->values()[Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme; +PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isEnterKeySends()Z +PLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->isLinkPreviewsEnabled()Z +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Companion;->forNoLinks()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState$Creator;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLorg/thoughtcrime/securesms/linkpreview/LinkPreview;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->(Ljava/lang/String;ZZLorg/thoughtcrime/securesms/linkpreview/LinkPreview;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository$Error;Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasContent()Z PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;->hasLinks()Z +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedLinkPreviewState$2;->invoke()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;)V PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2$savedStateDisposable$1;->invoke(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->()V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Landroidx/lifecycle/SavedStateHandle;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;Z)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->(Landroidx/lifecycle/SavedStateHandle;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewRepository;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->access$setSavedLinkPreviewState(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getLinkPreviewState()Lio/reactivex/rxjava3/core/Flowable; +PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->getSavedLinkPreviewState()Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState; PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->onCleared()V PLorg/thoughtcrime/securesms/linkpreview/LinkPreviewViewModelV2;->setSavedLinkPreviewState(Lorg/thoughtcrime/securesms/linkpreview/LinkPreviewState;)V PLorg/thoughtcrime/securesms/logsubmit/LogSectionNotifications$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationChannel;)Z PLorg/thoughtcrime/securesms/main/MainActivityListHostFragment;->onDestroyView()V +PLorg/thoughtcrime/securesms/messagerequests/GroupInfo;->getDescription()Ljava/lang/String; +PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component1()Lorg/thoughtcrime/securesms/recipients/Recipient; +PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component2()Lorg/thoughtcrime/securesms/messagerequests/GroupInfo; +PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component3()Ljava/util/List; +PLorg/thoughtcrime/securesms/messagerequests/MessageRequestRecipientInfo;->component4()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState; +PLorg/thoughtcrime/securesms/messagerequests/MessageRequestState;->getState()Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState$State; PLorg/thoughtcrime/securesms/mms/AttachmentManager;->isAttachmentPresent()Z +PLorg/thoughtcrime/securesms/notifications/MarkReadReceiver;->()V +PLorg/thoughtcrime/securesms/notifications/MarkReadReceiver;->process(Ljava/util/List;)V +PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->()V +PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->cancelAllMessageNotifications(Landroid/content/Context;Ljava/util/Set;)V +PLorg/thoughtcrime/securesms/notifications/NotificationCancellationHelper;->cancelLegacy(Landroid/content/Context;I)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11;->(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda11;->run()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda6;->run()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier$$ExternalSyntheticLambda7;->run()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$0MHafWJB8CwezqWVbncoEq_a3Xg(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$dClU2s1olLC6PkCR84cT7C2dqfA(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->$r8$lambda$mDf5wVelzwBtc0Vgo342P1gCo0c(Lorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;Landroid/content/Context;)V PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->clearVisibleThread()V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$runOnLimiter$11(Ljava/lang/Runnable;Ljava/lang/Throwable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$3(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->lambda$updateNotification$4(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->runOnLimiter(Ljava/lang/Runnable;)V +PLorg/thoughtcrime/securesms/notifications/OptimizedMessageNotifier;->updateNotification(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->getGroupStoryId()Ljava/lang/Long; +PLorg/thoughtcrime/securesms/notifications/v2/ConversationId;->getThreadId()J +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->access$updateBadge(Lorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;Landroid/content/Context;I)V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$Companion;->updateBadge(Landroid/content/Context;I)V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier$updateNotification$7;->(Ljava/util/Set;)V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->clearReminderInternal(Landroid/content/Context;)V PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->clearVisibleThread()V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;)V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifier;->updateNotification(Landroid/content/Context;Lorg/thoughtcrime/securesms/notifications/v2/ConversationId;Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;)V +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt;->access$getDisplayedNotificationIds(Landroid/app/NotificationManager;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/notifications/v2/DefaultMessageNotifierKt;->getDisplayedNotificationIds(Landroid/app/NotificationManager;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->()V +PLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->()V +PLorg/thoughtcrime/securesms/notifications/v2/NotificationPendingIntentHelper;->getBroadcast(Landroid/content/Context;ILandroid/content/Intent;I)Landroid/app/PendingIntent; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getConversations()Ljava/util/List; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getMuteFilteredMessages()Ljava/util/List; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getProfileFilteredMessages()Ljava/util/List; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->getThreadsWithMostRecentNotificationFromSelf()Ljava/util/Set; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->isEmpty()Z +PLorg/thoughtcrime/securesms/notifications/v2/NotificationState;->toString()Ljava/lang/String; +PLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->()V +PLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->()V +PLorg/thoughtcrime/securesms/notifications/v2/NotificationStateProvider;->constructNotificationState(Ljava/util/Map;Lorg/thoughtcrime/securesms/notifications/profiles/NotificationProfile;)Lorg/thoughtcrime/securesms/notifications/v2/NotificationState; +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->-$$Nest$fgetcountryCode(Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;)I +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->(Ljava/lang/String;ILjava/lang/String;)V +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter$PhoneNumber;->getCountryCode()I +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->()V +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->(Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->get(Landroid/content/Context;)Lorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter; +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->parseAreaCode(Ljava/lang/String;I)Ljava/lang/String; +PLorg/thoughtcrime/securesms/phonenumbers/PhoneNumberFormatter;->prettyPrint(Ljava/lang/String;)Ljava/lang/String; +PLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->equals(Ljava/lang/Object;)Z PLorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;->isDisplayContact()Z +PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda0;->run()V +PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda3;->onChanged(Ljava/lang/Object;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda7;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda7;->run()V +PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient$$ExternalSyntheticLambda9;->run()V +PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$4o-q--s8xb4fbde9teliyQxlyww(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$CYcq6dHxZW6RfEGMe0s6kvofKaE(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$pGM0bNiB06y_fkMUloVDwF8BcLs(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->$r8$lambda$snuajGLvOLM6I1QDJohSseUuY1E(Lorg/thoughtcrime/securesms/recipients/LiveRecipient;Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$0(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$new$1(Lorg/thoughtcrime/securesms/recipients/Recipient;)V +PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$observeForever$6(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->lambda$removeForeverObserver$7(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V PLorg/thoughtcrime/securesms/recipients/LiveRecipient;->removeForeverObserver(Lorg/thoughtcrime/securesms/recipients/RecipientForeverObserver;)V +PLorg/thoughtcrime/securesms/recipients/Recipient;->getCombinedAboutAndEmoji()Ljava/lang/String; PLorg/thoughtcrime/securesms/recipients/Recipient;->getContactUri()Landroid/net/Uri; PLorg/thoughtcrime/securesms/recipients/Recipient;->getNotificationChannel()Ljava/lang/String; +PLorg/thoughtcrime/securesms/recipients/Recipient;->getPhoneNumberSharing()Lorg/thoughtcrime/securesms/database/RecipientTable$PhoneNumberSharingState; +PLorg/thoughtcrime/securesms/recipients/Recipient;->isActiveGroup()Z +PLorg/thoughtcrime/securesms/recipients/Recipient;->shouldShowE164()Z PLorg/thoughtcrime/securesms/service/ExpiringMessageManager$$ExternalSyntheticLambda0;->()V PLorg/thoughtcrime/securesms/service/ExpiringMessageManager;->scheduleDeletion(Ljava/util/List;)V +PLorg/thoughtcrime/securesms/stickers/StickerSearchRepository;->searchByEmoji(Ljava/lang/String;)Lio/reactivex/rxjava3/core/Single; +PLorg/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment$$ExternalSyntheticLambda1;->getValue(Lcom/airbnb/lottie/value/LottieFrameInfo;)Ljava/lang/Object; +PLorg/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment;->$r8$lambda$vljyddRZJoI08m5GmCfix0xaN1o(ILcom/airbnb/lottie/value/LottieFrameInfo;)Ljava/lang/Integer; +PLorg/thoughtcrime/securesms/stories/tabs/ConversationListTabsFragment;->onViewCreated$lambda$1(ILcom/airbnb/lottie/value/LottieFrameInfo;)Ljava/lang/Integer; PLorg/thoughtcrime/securesms/stories/tabs/ConversationListTabsViewModel;->onCleared()V PLorg/thoughtcrime/securesms/util/AppForegroundObserver;->removeListener(Lorg/thoughtcrime/securesms/util/AppForegroundObserver$Listener;)V PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/NotificationManager;Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannel; PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline1;->m(Landroid/app/NotificationManager;)Z PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline2;->m(Landroid/app/NotificationManager;)I PLorg/thoughtcrime/securesms/util/BubbleUtil$$ExternalSyntheticApiModelOutline3;->m(Landroid/app/NotificationManager;)Z +PLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->$values()[Lorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState; +PLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->()V +PLorg/thoughtcrime/securesms/util/BubbleUtil$BubbleState;->(Ljava/lang/String;I)V PLorg/thoughtcrime/securesms/util/BubbleUtil;->()V +PLorg/thoughtcrime/securesms/util/CenteredImageSpan;->(Landroid/graphics/drawable/Drawable;)V +PLorg/thoughtcrime/securesms/util/CenteredImageSpan;->draw(Landroid/graphics/Canvas;Ljava/lang/CharSequence;IIFIIILandroid/graphics/Paint;)V +PLorg/thoughtcrime/securesms/util/CenteredImageSpan;->getSize(Landroid/graphics/Paint;Ljava/lang/CharSequence;IILandroid/graphics/Paint$FontMetricsInt;)I PLorg/thoughtcrime/securesms/util/ConversationUtil;->()V PLorg/thoughtcrime/securesms/util/ConversationUtil;->getChannelId(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)Ljava/lang/String; PLorg/thoughtcrime/securesms/util/ConversationUtil;->getShortcutId(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Ljava/lang/String; PLorg/thoughtcrime/securesms/util/ConversationUtil;->refreshRecipientShortcuts()V PLorg/thoughtcrime/securesms/util/Debouncer;->clear()V +PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->(Lkotlin/jvm/functions/Function0;)V +PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate$lazyDefault$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->getLazyDefault()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->getValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/DefaultSavedStateHandleDelegate;->setValue(Ljava/lang/Object;Lkotlin/reflect/KProperty;Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter;)V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter$$ExternalSyntheticLambda0;->run()V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->$r8$lambda$1L8FIPWGmHakh7u9Krsm8K4DSjQ(Lorg/thoughtcrime/securesms/util/LeakyBucketLimiter;)V PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->drip()V +PLorg/thoughtcrime/securesms/util/LeakyBucketLimiter;->run(Ljava/lang/Runnable;)V +PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIII)V +PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onDestroy(Landroidx/lifecycle/LifecycleOwner;)V PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper$3;->onStop(Landroidx/lifecycle/LifecycleOwner;)V +PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->$r8$lambda$T0JnL_tDtAWK4RNMpbrK8xUunio(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$getAnimator$p(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)Landroid/animation/ValueAnimator; PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->access$getSetStatusBarColor$p(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;)Lkotlin/jvm/functions/Function1; PLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->getPreviousStatusBarColor()I +PLorg/thoughtcrime/securesms/util/NullableSavedStateHandleDelegate;->(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)V +PLorg/thoughtcrime/securesms/util/ProjectionList;->size()I +PLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt$delegate$1;->(Ljava/lang/Object;)V +PLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;)Lkotlin/properties/ReadWriteProperty; +PLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Ljava/lang/Object;)Lkotlin/properties/ReadWriteProperty; +PLorg/thoughtcrime/securesms/util/SavedStateHandleExtensionsKt;->delegate(Landroidx/lifecycle/SavedStateHandle;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; +PLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory$Companion$factoryProducer$1;->invoke()Lorg/thoughtcrime/securesms/util/SavedStateViewModelFactory; +PLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->(Lkotlin/jvm/functions/Function1;Landroidx/savedstate/SavedStateRegistryOwner;)V +PLorg/thoughtcrime/securesms/util/SavedStateViewModelFactory;->create(Ljava/lang/String;Ljava/lang/Class;Landroidx/lifecycle/SavedStateHandle;)Landroidx/lifecycle/ViewModel; +PLorg/thoughtcrime/securesms/util/SearchUtil;->getHighlightedSpan(Ljava/util/Locale;Lorg/thoughtcrime/securesms/util/SearchUtil$StyleFactory;Landroid/text/Spannable;Ljava/lang/String;I)Landroid/text/Spannable; +PLorg/thoughtcrime/securesms/util/ServiceUtil;->getAudioManager(Landroid/content/Context;)Landroid/media/AudioManager; +PLorg/thoughtcrime/securesms/util/SignalLocalMetrics$ConversationOpen;->onRenderFinished()V +PLorg/thoughtcrime/securesms/util/SpanUtil;->()V +PLorg/thoughtcrime/securesms/util/SpanUtil;->buildCenteredImageSpan(Landroid/graphics/drawable/Drawable;)Ljava/lang/CharSequence; +PLorg/thoughtcrime/securesms/util/SpanUtil;->space(ILorg/signal/core/util/DimensionUnit;)Ljava/lang/CharSequence; PLorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline0;->m(Landroid/app/Activity;)Landroid/window/SplashScreen; PLorg/thoughtcrime/securesms/util/SplashScreenUtil$$ExternalSyntheticApiModelOutline1;->m(Landroid/window/SplashScreen;I)V PLorg/thoughtcrime/securesms/util/SplashScreenUtil$1;->()V PLorg/thoughtcrime/securesms/util/SplashScreenUtil;->setSplashScreenThemeIfNecessary(Landroid/app/Activity;Lorg/thoughtcrime/securesms/keyvalue/SettingsValues$Theme;)V +PLorg/thoughtcrime/securesms/util/TextSecurePreferences;->isEnterSendsEnabled(Landroid/content/Context;)Z PLorg/thoughtcrime/securesms/util/Util;->clamp(FFF)F -PLorg/thoughtcrime/securesms/util/ViewUtil;->animateOut(Landroid/view/View;Landroid/view/animation/Animation;I)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;I)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; -PLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;II)Lorg/thoughtcrime/securesms/util/concurrent/ListenableFuture; +PLorg/thoughtcrime/securesms/util/Util;->isEmpty(Ljava/util/Collection;)Z +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->invoke()Landroidx/fragment/app/Fragment; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->invoke()Landroidx/lifecycle/ViewModelStoreOwner; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$2;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->invoke()Landroidx/lifecycle/ViewModelStore; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$3;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->invoke()Landroidx/lifecycle/viewmodel/CreationExtras; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$$inlined$viewModels$default$4;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->invoke()Landroidx/savedstate/SavedStateRegistryOwner; +PLorg/thoughtcrime/securesms/util/ViewModelFactoryKt$savedStateViewModel$1;->invoke()Ljava/lang/Object; +PLorg/thoughtcrime/securesms/util/ViewUtil;->animateOut(Landroid/view/View;Landroid/view/animation/Animation;I)Lorg/signal/core/util/concurrent/ListenableFuture; +PLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;I)Lorg/signal/core/util/concurrent/ListenableFuture; +PLorg/thoughtcrime/securesms/util/ViewUtil;->fadeOut(Landroid/view/View;II)Lorg/signal/core/util/concurrent/ListenableFuture; PLorg/thoughtcrime/securesms/util/ViewUtil;->getAlphaAnimation(FFI)Landroid/view/animation/Animation; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewDetachedFromWindow(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingAdapter;->onViewDetachedFromWindow(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;)V +PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areContentsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areContentsTheSame(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Z +PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areItemsTheSame(Ljava/lang/Object;Ljava/lang/Object;)Z +PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->areItemsTheSame(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Z PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->getChangePayload(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingDiffCallback;->getChangePayload(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel$-CC;->$default$getChangePayload(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;Ljava/lang/Object;)Ljava/lang/Object; PLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->onDetachedFromWindow()V +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor$$ExternalSyntheticLambda0;->run()V +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->$r8$lambda$axI96jKiGgASw-5DyS1pXfSexxk(Lorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;Ljava/lang/Runnable;)V +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->enqueue(Ljava/lang/Runnable;)Z +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->execute(Ljava/lang/Runnable;)V +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->lambda$enqueue$0(Ljava/lang/Runnable;)V +PLorg/thoughtcrime/securesms/util/concurrent/SerialMonoLifoExecutor;->scheduleNext()V PLorg/thoughtcrime/securesms/util/rx/RxStore;->dispose()V +PLorg/thoughtcrime/securesms/util/views/NullableStub;->isResolvable()Z +PLorg/thoughtcrime/securesms/util/views/Stub;->getVisibility()I +PLorg/thoughtcrime/securesms/util/views/Stub;->isVisible()Z diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java index cb6d08b1f4..d66a15c550 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java @@ -29,6 +29,7 @@ import androidx.core.content.ContextCompat; import androidx.multidex.MultiDexApplication; +import com.bumptech.glide.Glide; import com.google.android.gms.security.ProviderInstaller; import org.conscrypt.ConscryptSignal; @@ -83,7 +84,6 @@ import org.thoughtcrime.securesms.logging.PersistentLogger; import org.thoughtcrime.securesms.messageprocessingalarm.RoutineMessageFetchReceiver; import org.thoughtcrime.securesms.migrations.ApplicationMigrations; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.SignalGlideComponents; import org.thoughtcrime.securesms.mms.SignalGlideModule; import org.thoughtcrime.securesms.net.NetworkManager; @@ -205,7 +205,7 @@ private void onCreateUnlock() { .addBlocking("ring-rtc", this::initializeRingRtc) .addBlocking("glide", () -> SignalGlideModule.setRegisterGlideComponents(new SignalGlideComponents())) .addNonBlocking(() -> RegistrationUtil.maybeMarkRegistrationComplete()) - .addNonBlocking(() -> GlideApp.get(this)) + .addNonBlocking(() -> Glide.get(this)) .addNonBlocking(this::cleanAvatarStorage) .addNonBlocking(this::initializeRevealableMessageManager) .addNonBlocking(this::initializePendingRetryReceiptManager) diff --git a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java index afa78fd214..2a4ee7fd03 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/AvatarPreviewActivity.java @@ -18,6 +18,7 @@ import androidx.core.app.ActivityOptionsCompat; import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; @@ -32,7 +33,6 @@ import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.FullscreenHelper; @@ -96,7 +96,7 @@ protected void onCreate(Bundle savedInstanceState, boolean ready) { Resources resources = this.getResources(); - GlideApp.with(this) + Glide.with(this) .asBitmap() .load(contactPhoto) .fallback(fallbackPhoto.asCallCard(this)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java index 17bfc622b9..2049bcebf2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java @@ -8,6 +8,8 @@ import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.Observer; +import com.bumptech.glide.RequestManager; + import org.signal.ringrtc.CallLinkRootKey; import org.thoughtcrime.securesms.components.voice.VoiceNotePlaybackState; import org.thoughtcrime.securesms.contactshare.Contact; @@ -26,7 +28,6 @@ import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.stickers.StickerLocator; @@ -41,7 +42,7 @@ void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull ConversationMessage messageRecord, @NonNull Optional previousMessageRecord, @NonNull Optional nextMessageRecord, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient recipients, @@ -120,5 +121,8 @@ interface EventListener { void onEditedIndicatorClicked(@NonNull MessageRecord messageRecord); void onShowGroupDescriptionClicked(@NonNull String groupName, @NonNull String description, boolean shouldLinkifyWebLinks); void onJoinCallLink(@NonNull CallLinkRootKey callLinkRootKey); + void onShowSafetyTips(boolean forGroup); + void onReportSpamLearnMoreClicked(); + void onMessageRequestAcceptOptionsClicked(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java index 63f0970803..cd78485e4d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationListItem.java @@ -3,9 +3,10 @@ import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.conversationlist.model.ConversationSet; import org.thoughtcrime.securesms.database.model.ThreadRecord; -import org.thoughtcrime.securesms.mms.GlideRequests; import java.util.Locale; import java.util.Set; @@ -14,7 +15,7 @@ public interface BindableConversationListItem extends Unbindable { void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull ThreadRecord thread, - @NonNull GlideRequests glideRequests, @NonNull Locale locale, + @NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations); diff --git a/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java b/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java index 5f186ece37..c35064d60f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/BlockUnblockDialog.java @@ -11,16 +11,36 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.signal.core.util.concurrent.SimpleTask; +import org.signal.storageservice.protos.groups.local.DecryptedPendingMember; import org.thoughtcrime.securesms.database.SignalDatabase; +import org.thoughtcrime.securesms.database.model.GroupRecord; import org.thoughtcrime.securesms.recipients.Recipient; -import org.signal.core.util.concurrent.SimpleTask; +import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; +import org.whispersystems.signalservice.api.push.ServiceId; + +import java.util.List; +import java.util.Optional; + +import okio.ByteString; /** * This should be used whenever we want to prompt the user to block/unblock a recipient. */ public final class BlockUnblockDialog { - private BlockUnblockDialog() { } + private BlockUnblockDialog() {} + + public static void showReportSpamFor(@NonNull Context context, + @NonNull Lifecycle lifecycle, + @NonNull Recipient recipient, + @NonNull Runnable onReportSpam, + @Nullable Runnable onBlockAndReportSpam) + { + SimpleTask.run(lifecycle, + () -> buildReportSpamFor(context, recipient, onReportSpam, onBlockAndReportSpam), + AlertDialog.Builder::show); + } public static void showBlockFor(@NonNull Context context, @NonNull Lifecycle lifecycle, @@ -137,4 +157,37 @@ private static AlertDialog.Builder buildUnblockFor(@NonNull Context context, return builder; } + + @WorkerThread + private static AlertDialog.Builder buildReportSpamFor(@NonNull Context context, + @NonNull Recipient recipient, + @NonNull Runnable onReportSpam, + @Nullable Runnable onBlockAndReportSpam) + { + recipient = recipient.resolve(); + + AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context) + .setTitle(R.string.BlockUnblockDialog_report_spam_title) + .setPositiveButton(R.string.BlockUnblockDialog_report_spam, (d, w) -> onReportSpam.run()); + + if (onBlockAndReportSpam != null) { + builder.setNeutralButton(android.R.string.cancel, null) + .setNegativeButton(R.string.BlockUnblockDialog_report_spam_and_block, (d, w) -> onBlockAndReportSpam.run()); + } else { + builder.setNegativeButton(android.R.string.cancel, null); + } + + if (recipient.isGroup()) { + Recipient adder = SignalDatabase.groups().getGroupInviter(recipient.requireGroupId()); + if (adder != null) { + builder.setMessage(context.getString(R.string.BlockUnblockDialog_report_spam_group_named_adder, adder.getDisplayName(context))); + } else { + builder.setMessage(R.string.BlockUnblockDialog_report_spam_group_unknown_adder); + } + } else { + builder.setMessage(R.string.BlockUnblockDialog_report_spam_description); + } + + return builder; + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ChangePassphraseDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ChangePassphraseDialogFragment.java index fdb88c3e3d..fad4cce26b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ChangePassphraseDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ChangePassphraseDialogFragment.java @@ -295,7 +295,7 @@ private void changePassphrase(final char[] oldPassphrase) { strength.getError(), strength.getTimeToCrack(), strength.getSuggestion()); new AlertDialog.Builder(requireActivity()) .setTitle(R.string.ChangePassphraseDialogFragment_weak_passphrase) - .setIcon(R.drawable.ic_warning) + .setIcon(R.drawable.symbol_error_triangle_fill_24) .setMessage(body) .setPositiveButton(android.R.string.ok, null).show(); return; diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java index d901516b4b..d90225e29e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionActivity.java @@ -24,14 +24,17 @@ import androidx.appcompat.widget.Toolbar; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import org.signal.core.util.DimensionUnit; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.components.ContactFilterView; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.util.DisplayMetricsUtil; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.Util; @@ -98,6 +101,10 @@ protected ContactFilterView getContactFilterView() { private void initializeContactFilterView() { this.contactFilterView = findViewById(R.id.contact_filter_edit_text); + + if (getResources().getDisplayMetrics().heightPixels >= DimensionUnit.DP.toPixels(600) || !FeatureFlags.usernames()) { + this.contactFilterView.focusAndShowKeyboard(); + } } private void initializeToolbar() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt index 9a595faed0..ab63ad61d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListAdapter.kt @@ -27,6 +27,8 @@ class ContactSelectionListAdapter( registerFactory(RefreshContactsModel::class.java, LayoutFactory({ RefreshContactsViewHolder(it, onClickCallbacks::onRefreshContactsClicked) }, R.layout.contact_selection_refresh_action_item)) registerFactory(MoreHeaderModel::class.java, LayoutFactory({ MoreHeaderViewHolder(it) }, R.layout.contact_search_section_header)) registerFactory(EmptyModel::class.java, LayoutFactory({ EmptyViewHolder(it) }, R.layout.contact_selection_empty_state)) + registerFactory(FindByUsernameModel::class.java, LayoutFactory({ FindByUsernameViewHolder(it, onClickCallbacks::onFindByUsernameClicked) }, R.layout.contact_selection_find_by_username_item)) + registerFactory(FindByPhoneNumberModel::class.java, LayoutFactory({ FindByPhoneNumberViewHolder(it, onClickCallbacks::onFindByPhoneNumberClicked) }, R.layout.contact_selection_find_by_phone_number_item)) } class NewGroupModel : MappingModel { @@ -44,6 +46,16 @@ class ContactSelectionListAdapter( override fun areContentsTheSame(newItem: RefreshContactsModel): Boolean = true } + class FindByUsernameModel : MappingModel { + override fun areItemsTheSame(newItem: FindByUsernameModel): Boolean = true + override fun areContentsTheSame(newItem: FindByUsernameModel): Boolean = true + } + + class FindByPhoneNumberModel : MappingModel { + override fun areItemsTheSame(newItem: FindByPhoneNumberModel): Boolean = true + override fun areContentsTheSame(newItem: FindByPhoneNumberModel): Boolean = true + } + class MoreHeaderModel : MappingModel { override fun areItemsTheSame(newItem: MoreHeaderModel): Boolean = true @@ -92,13 +104,33 @@ class ContactSelectionListAdapter( } } + private class FindByPhoneNumberViewHolder(itemView: View, onClickListener: () -> Unit) : MappingViewHolder(itemView) { + + init { + itemView.setOnClickListener { onClickListener() } + } + + override fun bind(model: FindByPhoneNumberModel) = Unit + } + + private class FindByUsernameViewHolder(itemView: View, onClickListener: () -> Unit) : MappingViewHolder(itemView) { + + init { + itemView.setOnClickListener { onClickListener() } + } + + override fun bind(model: FindByUsernameModel) = Unit + } + class ArbitraryRepository : org.thoughtcrime.securesms.contacts.paged.ArbitraryRepository { enum class ArbitraryRow(val code: String) { NEW_GROUP("new-group"), INVITE_TO_SIGNAL("invite-to-signal"), MORE_HEADING("more-heading"), - REFRESH_CONTACTS("refresh-contacts"); + REFRESH_CONTACTS("refresh-contacts"), + FIND_BY_USERNAME("find-by-username"), + FIND_BY_PHONE_NUMBER("find-by-phone-number"); companion object { fun fromCode(code: String) = values().first { it.code == code } @@ -120,6 +152,8 @@ class ContactSelectionListAdapter( ArbitraryRow.INVITE_TO_SIGNAL -> InviteToSignalModel() ArbitraryRow.MORE_HEADING -> MoreHeaderModel() ArbitraryRow.REFRESH_CONTACTS -> RefreshContactsModel() + ArbitraryRow.FIND_BY_PHONE_NUMBER -> FindByPhoneNumberModel() + ArbitraryRow.FIND_BY_USERNAME -> FindByUsernameModel() } } } @@ -128,5 +162,7 @@ class ContactSelectionListAdapter( fun onNewGroupClicked() fun onInviteToSignalClicked() fun onRefreshContactsClicked() + fun onFindByPhoneNumberClicked() + fun onFindByUsernameClicked() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index b212fad57a..ab75168ac7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -76,6 +76,7 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.CommunicationActions; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.UsernameUtil; import org.thoughtcrime.securesms.util.ViewUtil; @@ -141,6 +142,7 @@ public final class ContactSelectionListFragment extends LoggingFragment { private ContactSearchMediator contactSearchMediator; @Nullable private NewConversationCallback newConversationCallback; + @Nullable private FindByCallback findByCallback; @Nullable private NewCallCallback newCallCallback; @Nullable private ScrollCallback scrollCallback; @Nullable private OnItemLongClickListener onItemLongClickListener; @@ -161,6 +163,10 @@ public void onAttach(@NonNull Context context) { newConversationCallback = (NewConversationCallback) context; } + if (context instanceof FindByCallback) { + findByCallback = (FindByCallback) context; + } + if (context instanceof NewCallCallback) { newCallCallback = (NewCallCallback) context; } @@ -379,6 +385,16 @@ public void onNewGroupClicked() { newConversationCallback.onNewGroup(false); } + @Override + public void onFindByPhoneNumberClicked() { + findByCallback.onFindByPhoneNumber(); + } + + @Override + public void onFindByUsernameClicked() { + findByCallback.onFindByUsername(); + } + @Override public void onInviteToSignalClicked() { if (newConversationCallback != null) { @@ -660,6 +676,10 @@ public void markSelected(@NonNull Set contacts) { } } + public void addRecipientToSelectionIfAble(@NonNull RecipientId recipientId) { + listClickListener.onItemClick(new ContactSearchKey.RecipientSearchKey(recipientId, false)); + } + private class ListClickListener { public void onItemClick(ContactSearchKey contact) { boolean isUnknown = contact instanceof ContactSearchKey.UnknownRecipientKey; @@ -874,6 +894,11 @@ private void smoothScrollChipsToEnd() { builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.NEW_GROUP.getCode()); } + if (findByCallback != null && FeatureFlags.usernames()) { + builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.FIND_BY_USERNAME.getCode()); + builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.FIND_BY_PHONE_NUMBER.getCode()); + } + if (transportType != null) { if (!hasQuery && includeRecents) { builder.addSection(new ContactSearchConfiguration.Section.Recents( @@ -891,7 +916,7 @@ private void smoothScrollChipsToEnd() { builder.addSection(new ContactSearchConfiguration.Section.Individuals( includeSelf, transportType, - newCallCallback == null, + newCallCallback == null && findByCallback == null, null, !hideLetterHeaders() )); @@ -1011,6 +1036,12 @@ public interface NewConversationCallback { void onNewGroup(boolean forceV1); } + public interface FindByCallback { + void onFindByUsername(); + + void onFindByPhoneNumber(); + } + public interface NewCallCallback { void onInvite(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java index dc0cfb6273..02ae868dd5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java @@ -38,7 +38,6 @@ protected void onCreate(Bundle bundle, boolean ready) { .setOnDismissListener(dialog13 -> finish()) .create(); - dialog.setIcon(getResources().getDrawable(R.drawable.ic_molly_logo)); dialog.show(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java b/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java index dee35f0b78..4710dff708 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/InviteActivity.java @@ -17,17 +17,16 @@ import androidx.annotation.AnimRes; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.Toolbar; import androidx.interpolator.view.animation.FastOutSlowInInterpolator; import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.signal.core.util.concurrent.ListenableFuture.Listener; import org.thoughtcrime.securesms.components.ContactFilterView; import org.thoughtcrime.securesms.components.ContactFilterView.OnFilterChangedListener; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.SelectedContact; -import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.groups.SelectionLimits; import org.thoughtcrime.securesms.mms.OutgoingMessage; import org.thoughtcrime.securesms.recipients.Recipient; @@ -36,7 +35,6 @@ import org.thoughtcrime.securesms.util.DynamicNoActionBarInviteTheme; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.ViewUtil; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener; import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask; import org.thoughtcrime.securesms.util.text.AfterTextChanged; diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index ba2be04061..067b3acfe9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -50,6 +50,8 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.recipients.ui.findby.FindByActivity; +import org.thoughtcrime.securesms.recipients.ui.findby.FindByMode; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; @@ -70,14 +72,15 @@ * @author Moxie Marlinspike */ public class NewConversationActivity extends ContactSelectionActivity - implements ContactSelectionListFragment.NewConversationCallback, ContactSelectionListFragment.OnItemLongClickListener + implements ContactSelectionListFragment.NewConversationCallback, ContactSelectionListFragment.OnItemLongClickListener, ContactSelectionListFragment.FindByCallback { @SuppressWarnings("unused") private static final String TAG = Log.tag(NewConversationActivity.class); - private ContactsManagementViewModel viewModel; - private ActivityResultLauncher contactLauncher; + private ContactsManagementViewModel viewModel; + private ActivityResultLauncher contactLauncher; + private ActivityResultLauncher findByLauncher; private final LifecycleDisposable disposables = new LifecycleDisposable(); @@ -99,6 +102,12 @@ public void onCreate(Bundle bundle, boolean ready) { } }); + findByLauncher = registerForActivityResult(new FindByActivity.Contract(), result -> { + if (result != null) { + launch(result); + } + }); + viewModel = new ViewModelProvider(this, factory).get(ContactsManagementViewModel.class); } @@ -159,7 +168,12 @@ public void onSelectionChanged() { } private void launch(Recipient recipient) { - Disposable disposable = ConversationIntents.createBuilder(this, recipient.getId(), -1L) + launch(recipient.getId()); + } + + + private void launch(RecipientId recipientId) { + Disposable disposable = ConversationIntents.createBuilder(this, recipientId, -1L) .map(builder -> builder .withDraftText(getIntent().getStringExtra(Intent.EXTRA_TEXT)) .withDataUri(getIntent().getData()) @@ -230,6 +244,16 @@ public void onNewGroup(boolean forceV1) { finish(); } + @Override + public void onFindByUsername() { + findByLauncher.launch(FindByMode.USERNAME); + } + + @Override + public void onFindByPhoneNumber() { + findByLauncher.launch(FindByMode.PHONE_NUMBER); + } + @Override public boolean onLongClick(View anchorView, ContactSearchKey contactSearchKey, RecyclerView recyclerView) { RecipientId recipientId = contactSearchKey.requireRecipientSearchKey().getRecipientId(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java index 2550e23a9a..4c2df2939a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java @@ -775,7 +775,7 @@ private void handleNoSuchUser(final @NonNull WebRtcViewModel event) { if (isFinishing()) return; // XXX Stuart added this check above, not sure why, so I'm repeating in ignorance. - moxie new MaterialAlertDialogBuilder(this) .setTitle(R.string.RedPhone_number_not_registered) - .setIcon(R.drawable.ic_warning) + .setIcon(R.drawable.symbol_error_triangle_fill_24) .setMessage(R.string.RedPhone_the_number_you_dialed_does_not_support_secure_voice) .setCancelable(true) .setPositiveButton(R.string.RedPhone_got_it, (d, w) -> handleTerminate(event.getRecipient(), HangupMessage.Type.NORMAL)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerItem.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerItem.kt index e30d349ecb..3939da24a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/picker/AvatarPickerItem.kt @@ -8,12 +8,12 @@ import android.widget.TextView import androidx.appcompat.content.res.AppCompatResources import androidx.core.view.setPadding import com.airbnb.lottie.SimpleColorFilter +import com.bumptech.glide.Glide import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.avatar.Avatar import org.thoughtcrime.securesms.avatar.AvatarRenderer import org.thoughtcrime.securesms.avatar.Avatars import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel @@ -132,12 +132,12 @@ object AvatarPickerItem { } is Avatar.Photo -> { textView.visible = false - GlideApp.with(imageView).load(DecryptableStreamUriLoader.DecryptableUri(model.avatar.uri)).into(imageView) + Glide.with(imageView).load(DecryptableStreamUriLoader.DecryptableUri(model.avatar.uri)).into(imageView) } is Avatar.Resource -> { imageView.setPadding((imageView.width * 0.2).toInt()) textView.visible = false - GlideApp.with(imageView).clear(imageView) + Glide.with(imageView).clear(imageView) imageView.setImageResource(model.avatar.resourceId) imageView.colorFilter = SimpleColorFilter(model.avatar.color.foregroundColor) imageView.background.colorFilter = SimpleColorFilter(model.avatar.color.backgroundColor) diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt index 2dac9f6aef..f44c8ca9e9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt @@ -5,10 +5,10 @@ import android.util.AttributeSet import android.view.View import android.widget.FrameLayout import androidx.core.content.res.use +import com.bumptech.glide.RequestManager import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.AvatarImageView import org.thoughtcrime.securesms.database.model.StoryViewState -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.stories.Stories import org.thoughtcrime.securesms.util.visible @@ -76,7 +76,7 @@ class AvatarView @JvmOverloads constructor( /** * Displays Note-to-Self */ - fun displayChatAvatar(requestManager: GlideRequests, recipient: Recipient, isQuickContactEnabled: Boolean) { + fun displayChatAvatar(requestManager: RequestManager, recipient: Recipient, isQuickContactEnabled: Boolean) { avatar.setAvatar(requestManager, recipient, isQuickContactEnabled) } 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 c5c704fbfb..08f8f179c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -159,7 +159,7 @@ private static BackupEvent internalExport(@NonNull Context context, for (String table : tables) { throwIfCanceled(cancellationSignal); if (table.equals(MessageTable.TABLE_NAME)) { - count = exportTable(table, input, outputStream, cursor -> isNonExpiringMessage(cursor), null, count, estimatedCount, cancellationSignal); + count = exportTable(table, input, outputStream, cursor -> isNonExpiringMessage(input, cursor), null, count, estimatedCount, cancellationSignal); } else if (table.equals(ReactionTable.TABLE_NAME)) { count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, CursorUtil.requireLong(cursor, ReactionTable.MESSAGE_ID)), null, count, estimatedCount, cancellationSignal); } else if (table.equals(MentionTable.TABLE_NAME)) { @@ -574,25 +574,34 @@ private static int exportKeyValues(@NonNull BackupFrameOutputStream outputStream return count; } - private static boolean isNonExpiringMessage(@NonNull Cursor cursor) { - long expiresIn = CursorUtil.requireLong(cursor, MessageTable.EXPIRES_IN); - boolean viewOnce = CursorUtil.requireBoolean(cursor, MessageTable.VIEW_ONCE); + private static boolean isNonExpiringMessage(@NonNull SQLiteDatabase db, @NonNull Cursor cursor) { + long id = CursorUtil.requireLong(cursor, MessageTable.ID); + long expireStarted = CursorUtil.requireLong(cursor, MessageTable.EXPIRE_STARTED); + long expiresIn = CursorUtil.requireLong(cursor, MessageTable.EXPIRES_IN); + long latestRevisionId = CursorUtil.requireLong(cursor, MessageTable.LATEST_REVISION_ID); - if (expiresIn == 0 && !viewOnce) { - return true; + long expiresAt = expireStarted + expiresIn; + long timeRemaining = expiresAt - System.currentTimeMillis(); + + if (latestRevisionId > 0 && latestRevisionId != id ) { + return isForNonExpiringMessage(db, latestRevisionId); + } + + if (expireStarted > 0 && timeRemaining <= EXPIRATION_BACKUP_THRESHOLD) { + return false; } - return expiresIn > EXPIRATION_BACKUP_THRESHOLD; + return true; } private static boolean isForNonExpiringMessage(@NonNull SQLiteDatabase db, long messageId) { - String[] columns = new String[] { MessageTable.EXPIRES_IN, MessageTable.VIEW_ONCE }; + String[] columns = new String[] { MessageTable.ID, MessageTable.EXPIRE_STARTED, MessageTable.EXPIRES_IN, MessageTable.LATEST_REVISION_ID }; String where = MessageTable.ID + " = ?"; String[] args = SqlUtil.buildArgs(messageId); try (Cursor mmsCursor = db.query(MessageTable.TABLE_NAME, columns, where, args, null, null, null)) { if (mmsCursor != null && mmsCursor.moveToFirst()) { - return isNonExpiringMessage(mmsCursor); + return isNonExpiringMessage(db, mmsCursor); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsCheckoutSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsCheckoutSheet.kt new file mode 100644 index 0000000000..39c1876948 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsCheckoutSheet.kt @@ -0,0 +1,206 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import androidx.core.view.updateLayoutParams +import kotlinx.collections.immutable.persistentListOf +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.Buttons +import org.signal.core.ui.Previews +import org.signal.core.util.money.FiatMoney +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.databinding.PaypalButtonBinding +import org.thoughtcrime.securesms.payments.FiatMoneyUtil +import java.math.BigDecimal +import java.util.Currency + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun MessageBackupsCheckoutSheet( + messageBackupsType: MessageBackupsType, + onDismissRequest: () -> Unit, +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + dragHandle = { BottomSheets.Handle() }, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + ) { + SheetContent( + messageBackupsType = messageBackupsType, + ) + } +} + +@Composable +private fun SheetContent( + messageBackupsType: MessageBackupsType, +) { + val resources = LocalContext.current.resources + val formattedPrice = remember(messageBackupsType.pricePerMonth) { + FiatMoneyUtil.format(resources, messageBackupsType.pricePerMonth, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal()) + } + + Text( + text = "Pay $formattedPrice/month to Signal", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.titleLarge, + modifier = Modifier.padding(top = 48.dp) + ) + + Text( + text = "You'll get:", // TODO [message-backups] Finalized copy + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 5.dp) + ) + + MessageBackupsTypeBlock( + messageBackupsType = messageBackupsType, + isSelected = false, + onSelected = {}, + enabled = false, + modifier = Modifier.padding(top = 24.dp) + ) +} + +@Composable +private fun PayPalButton( + onClick: () -> Unit +) { + AndroidView(factory = { + val view = LayoutInflater.from(it).inflate(R.layout.paypal_button, null) + view.layoutParams = ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) + view + }) { + val binding = PaypalButtonBinding.bind(it) + binding.paypalButton.updateLayoutParams { + marginStart = 0 + marginEnd = 0 + } + + binding.paypalButton.setOnClickListener { + onClick() + } + } +} + +@Composable +private fun SepaButton( + onClick: () -> Unit +) { + Buttons.LargeTonal( + onClick = onClick, + modifier = Modifier.fillMaxWidth() + ) { + Icon( + painter = painterResource(id = R.drawable.bank_transfer), + contentDescription = null, + modifier = Modifier.padding(end = 8.dp) + ) + + Text(text = stringResource(id = R.string.GatewaySelectorBottomSheet__bank_transfer)) + } +} + +@Composable +private fun IdealButton( + onClick: () -> Unit +) { + Buttons.LargeTonal( + onClick = onClick, + modifier = Modifier.fillMaxWidth() + ) { + Image( + painter = painterResource(id = R.drawable.logo_ideal), + contentDescription = null, + modifier = Modifier + .size(32.dp) + .padding(end = 8.dp) + ) + + Text(text = stringResource(id = R.string.GatewaySelectorBottomSheet__ideal)) + } +} + +@Composable +private fun CreditOrDebitCardButton( + onClick: () -> Unit +) { + Buttons.LargePrimary( + onClick = onClick, + modifier = Modifier.fillMaxWidth() + ) { + Icon( + painter = painterResource(id = R.drawable.credit_card), + contentDescription = null, + modifier = Modifier.padding(end = 8.dp) + ) + + Text( + text = stringResource(id = R.string.GatewaySelectorBottomSheet__credit_or_debit_card) + ) + } +} + +@Preview +@Composable +private fun MessageBackupsCheckoutSheetPreview() { + val paidTier = MessageBackupsType( + pricePerMonth = FiatMoney(BigDecimal.valueOf(3), Currency.getInstance("USD")), + title = "Text + All your media", + features = persistentListOf( + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_thread_compact_bold_16, + label = "Full text message backup" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_album_compact_bold_16, + label = "Full media backup" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_thread_compact_bold_16, + label = "1TB of storage (~250K photos)" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_heart_compact_bold_16, + label = "Thanks for supporting Signal!" + ) + ) + ) + + Previews.Preview { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + ) { + SheetContent( + messageBackupsType = paidTier, + ) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsEducationScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsEducationScreen.kt new file mode 100644 index 0000000000..53d663150d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsEducationScreen.kt @@ -0,0 +1,187 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.signal.core.ui.Buttons +import org.signal.core.ui.Previews +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.theme.SignalTheme +import org.thoughtcrime.securesms.R + +/** + * Educational content which allows user to proceed to set up automatic backups + * or navigate to a support page to learn more. + */ +@Composable +fun MessageBackupsEducationScreen( + onNavigationClick: () -> Unit, + onEnableBackups: () -> Unit, + onLearnMore: () -> Unit +) { + Scaffolds.Settings( + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.symbol_x_24), + title = "Chat backups" // TODO [message-backups] Finalized copy + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(it) + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + ) { + LazyColumn( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) { + item { + Image( + painter = painterResource(id = R.drawable.ic_molly_logo), // TODO [message-backups] Final image asset + contentDescription = null, + modifier = Modifier + .padding(top = 48.dp) + .size(88.dp) + ) + } + + item { + Text( + text = "Chat Backups", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(top = 15.dp) + ) + } + + item { + Text( + text = "Back up your messages and media and using Signal’s secure, end-to-end encrypted storage service. Never lose a message when you get a new phone or reinstall Signal.", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, + textAlign = TextAlign.Center, + modifier = Modifier.padding(top = 12.dp) + ) + } + + item { + Column( + modifier = Modifier.padding(top = 32.dp), + verticalArrangement = Arrangement.spacedBy(20.dp) + ) { + NotableFeatureRow( + painter = painterResource(id = R.drawable.symbol_lock_compact_20), + text = "End-to-end Encrypted" // TODO [message-backups] Finalized copy + ) + + NotableFeatureRow( + painter = painterResource(id = R.drawable.symbol_check_square_compact_20), + text = "Optional, always" // TODO [message-backups] Finalized copy + ) + + NotableFeatureRow( + painter = painterResource(id = R.drawable.symbol_trash_compact_20), + text = "Delete your backup anytime" // TODO [message-backups] Finalized copy + ) + } + } + } + + Buttons.LargePrimary( + onClick = onEnableBackups, + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = "Enable backups" // TODO [message-backups] Finalized copy + ) + } + + TextButton( + onClick = onLearnMore, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp) + ) { + Text( + text = "Learn more" // TODO [message-backups] Finalized copy + ) + } + } + } +} + +@Preview +@Composable +private fun MessageBackupsEducationSheetPreview() { + Previews.Preview { + MessageBackupsEducationScreen( + onNavigationClick = {}, + onEnableBackups = {}, + onLearnMore = {} + ) + } +} + +@Preview +@Composable +private fun NotableFeatureRowPreview() { + Previews.Preview { + NotableFeatureRow( + painter = painterResource(id = R.drawable.symbol_lock_compact_20), + text = "Notable feature information" + ) + } +} + +@Composable +private fun NotableFeatureRow( + painter: Painter, + text: String +) { + Row( + verticalAlignment = Alignment.CenterVertically + ) { + Icon( + painter = painter, + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier + .padding(end = 8.dp) + .size(32.dp) + .background(color = SignalTheme.colors.colorSurface2, shape = CircleShape) + .padding(6.dp) + ) + + Text( + text = text, + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowActivity.kt new file mode 100644 index 0000000000..615dff02a0 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowActivity.kt @@ -0,0 +1,110 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.navigation.NavController +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.dialog +import androidx.navigation.compose.rememberNavController +import org.signal.core.ui.theme.SignalTheme +import org.thoughtcrime.securesms.PassphraseRequiredActivity +import org.thoughtcrime.securesms.util.viewModel + +class MessageBackupsFlowActivity : PassphraseRequiredActivity() { + + private val viewModel: MessageBackupsFlowViewModel by viewModel { MessageBackupsFlowViewModel() } + + override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { + setContent { + SignalTheme { + val state by viewModel.state + val navController = rememberNavController() + + fun MessageBackupsScreen.next() { + val nextScreen = viewModel.goToNextScreen(this) + if (nextScreen != this) { + navController.navigate(nextScreen.name) + } + } + + fun NavController.popOrFinish() { + if (popBackStack()) { + return + } + + finishAfterTransition() + } + + LaunchedEffect(Unit) { + navController.setLifecycleOwner(this@MessageBackupsFlowActivity) + navController.setOnBackPressedDispatcher(this@MessageBackupsFlowActivity.onBackPressedDispatcher) + navController.enableOnBackPressed(true) + } + + NavHost( + navController = navController, + startDestination = MessageBackupsScreen.EDUCATION.name, + enterTransition = { slideInHorizontally(initialOffsetX = { it }) }, + exitTransition = { slideOutHorizontally(targetOffsetX = { -it }) }, + popEnterTransition = { slideInHorizontally(initialOffsetX = { -it }) }, + popExitTransition = { slideOutHorizontally(targetOffsetX = { it }) } + ) { + composable(route = MessageBackupsScreen.EDUCATION.name) { + MessageBackupsEducationScreen( + onNavigationClick = navController::popOrFinish, + onEnableBackups = { MessageBackupsScreen.EDUCATION.next() }, + onLearnMore = {} + ) + } + + composable(route = MessageBackupsScreen.PIN_EDUCATION.name) { + MessageBackupsPinEducationScreen( + onNavigationClick = navController::popOrFinish, + onGeneratePinClick = {}, + onUseCurrentPinClick = { MessageBackupsScreen.PIN_EDUCATION.next() }, + recommendedPinSize = 16 // TODO [message-backups] This value should come from some kind of config + ) + } + + composable(route = MessageBackupsScreen.PIN_CONFIRMATION.name) { + MessageBackupsPinConfirmationScreen( + pin = state.pin, + onPinChanged = viewModel::onPinEntryUpdated, + pinKeyboardType = state.pinKeyboardType, + onPinKeyboardTypeSelected = viewModel::onPinKeyboardTypeUpdated, + onNextClick = { MessageBackupsScreen.PIN_CONFIRMATION.next() } + ) + } + + composable(route = MessageBackupsScreen.TYPE_SELECTION.name) { + MessageBackupsTypeSelectionScreen( + selectedBackupsType = state.selectedMessageBackupsType, + availableBackupsTypes = state.availableBackupsTypes, + onMessageBackupsTypeSelected = viewModel::onMessageBackupsTypeUpdated, + onNavigationClick = navController::popOrFinish, + onReadMoreClicked = {}, + onNextClicked = { MessageBackupsScreen.TYPE_SELECTION.next() } + ) + } + + dialog(route = MessageBackupsScreen.CHECKOUT_SHEET.name) { + MessageBackupsCheckoutSheet( + messageBackupsType = state.selectedMessageBackupsType!!, + onDismissRequest = navController::popOrFinish, + ) + } + } + } + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowRepository.kt new file mode 100644 index 0000000000..19e28b439c --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowRepository.kt @@ -0,0 +1,8 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +class MessageBackupsFlowRepository diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowState.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowState.kt new file mode 100644 index 0000000000..0492cac5d6 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowState.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.lock.v2.PinKeyboardType + +data class MessageBackupsFlowState( + val selectedMessageBackupsType: MessageBackupsType? = null, + val availableBackupsTypes: List = emptyList(), + val pin: String = "", + val pinKeyboardType: PinKeyboardType = SignalStore.pinValues().keyboardType +) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowViewModel.kt new file mode 100644 index 0000000000..b09ea8299d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsFlowViewModel.kt @@ -0,0 +1,53 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import org.thoughtcrime.securesms.lock.v2.PinKeyboardType + +class MessageBackupsFlowViewModel : ViewModel() { + private val internalState = mutableStateOf(MessageBackupsFlowState()) + + val state: State = internalState + + fun goToNextScreen(currentScreen: MessageBackupsScreen): MessageBackupsScreen { + return when (currentScreen) { + MessageBackupsScreen.EDUCATION -> MessageBackupsScreen.PIN_EDUCATION + MessageBackupsScreen.PIN_EDUCATION -> MessageBackupsScreen.PIN_CONFIRMATION + MessageBackupsScreen.PIN_CONFIRMATION -> validatePinAndUpdateState() + MessageBackupsScreen.TYPE_SELECTION -> validateTypeAndUpdateState() + MessageBackupsScreen.CHECKOUT_SHEET -> validateGatewayAndUpdateState() + MessageBackupsScreen.PROCESS_PAYMENT -> MessageBackupsScreen.COMPLETED + MessageBackupsScreen.COMPLETED -> error("Unsupported state transition from terminal state COMPLETED") + } + } + + fun onPinEntryUpdated(pin: String) { + internalState.value = state.value.copy(pin = pin) + } + + fun onPinKeyboardTypeUpdated(pinKeyboardType: PinKeyboardType) { + internalState.value = state.value.copy(pinKeyboardType = pinKeyboardType) + } + + fun onMessageBackupsTypeUpdated(messageBackupsType: MessageBackupsType) { + internalState.value = state.value.copy(selectedMessageBackupsType = messageBackupsType) + } + + private fun validatePinAndUpdateState(): MessageBackupsScreen { + return MessageBackupsScreen.TYPE_SELECTION + } + + private fun validateTypeAndUpdateState(): MessageBackupsScreen { + return MessageBackupsScreen.CHECKOUT_SHEET + } + + private fun validateGatewayAndUpdateState(): MessageBackupsScreen { + return MessageBackupsScreen.PROCESS_PAYMENT + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsPinConfirmationScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsPinConfirmationScreen.kt new file mode 100644 index 0000000000..c0ab92e70d --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsPinConfirmationScreen.kt @@ -0,0 +1,198 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Icon +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.signal.core.ui.Buttons +import org.signal.core.ui.Previews +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.lock.v2.PinKeyboardType + +/** + * Screen which requires the user to enter their pin before enabling backups. + */ +@Composable +fun MessageBackupsPinConfirmationScreen( + pin: String, + onPinChanged: (String) -> Unit, + pinKeyboardType: PinKeyboardType, + onPinKeyboardTypeSelected: (PinKeyboardType) -> Unit, + onNextClick: () -> Unit +) { + val focusRequester = remember { FocusRequester() } + + Column( + modifier = Modifier + .fillMaxSize() + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + ) { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) { + item { + Text( + text = "Enter your PIN", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(top = 40.dp) + ) + } + + item { + Text( + text = "Enter your Signal PIN to enable backups", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.bodyLarge, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 16.dp) + ) + } + + item { + // TODO [message-backups] Confirm default focus state + val keyboardType = remember(pinKeyboardType) { + when (pinKeyboardType) { + PinKeyboardType.NUMERIC -> KeyboardType.NumberPassword + PinKeyboardType.ALPHA_NUMERIC -> KeyboardType.Password + } + } + + TextField( + value = pin, + onValueChange = onPinChanged, + textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center), + keyboardActions = KeyboardActions( + onDone = { onNextClick() } + ), + keyboardOptions = KeyboardOptions( + keyboardType = keyboardType + ), + modifier = Modifier + .padding(top = 72.dp) + .fillMaxWidth() + .focusRequester(focusRequester) + ) + } + + item { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .fillMaxWidth() + .padding(top = 48.dp) + ) { + PinKeyboardTypeToggle( + pinKeyboardType = pinKeyboardType, + onPinKeyboardTypeSelected = onPinKeyboardTypeSelected + ) + } + } + } + + Box( + contentAlignment = Alignment.BottomEnd, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp) + ) { + Buttons.LargeTonal( + onClick = onNextClick + ) { + Text( + text = "Next" // TODO [message-backups] Finalized copy + ) + } + } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + } +} + +@Preview +@Composable +private fun MessageBackupsPinConfirmationScreenPreview() { + Previews.Preview { + MessageBackupsPinConfirmationScreen( + pin = "", + onPinChanged = {}, + pinKeyboardType = PinKeyboardType.ALPHA_NUMERIC, + onPinKeyboardTypeSelected = {}, + onNextClick = {} + ) + } +} + +@Preview +@Composable +private fun PinKeyboardTypeTogglePreview() { + Previews.Preview { + var type by remember { mutableStateOf(PinKeyboardType.ALPHA_NUMERIC) } + PinKeyboardTypeToggle( + pinKeyboardType = type, + onPinKeyboardTypeSelected = { type = it } + ) + } +} + +@Composable +private fun PinKeyboardTypeToggle( + pinKeyboardType: PinKeyboardType, + onPinKeyboardTypeSelected: (PinKeyboardType) -> Unit +) { + val callback = remember(pinKeyboardType) { + { onPinKeyboardTypeSelected(pinKeyboardType.other) } + } + + val iconRes = remember(pinKeyboardType) { + when (pinKeyboardType) { + PinKeyboardType.NUMERIC -> R.drawable.symbol_keyboard_24 + PinKeyboardType.ALPHA_NUMERIC -> R.drawable.symbol_number_pad_24 + } + } + + TextButton(onClick = callback) { + Icon( + painter = painterResource(id = iconRes), + tint = MaterialTheme.colorScheme.primary, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp) + ) + Text( + text = "Switch keyboard" // TODO [message-backups] Finalized copy + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsPinEducationScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsPinEducationScreen.kt new file mode 100644 index 0000000000..c01d280d72 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsPinEducationScreen.kt @@ -0,0 +1,132 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import org.signal.core.ui.Buttons +import org.signal.core.ui.Previews +import org.signal.core.ui.Scaffolds +import org.thoughtcrime.securesms.R + +/** + * Explanation screen that details how the user's pin is utilized with backups, + * and how long they should make their pin. + */ +@Composable +fun MessageBackupsPinEducationScreen( + onNavigationClick: () -> Unit, + onGeneratePinClick: () -> Unit, + onUseCurrentPinClick: () -> Unit, + recommendedPinSize: Int +) { + Scaffolds.Settings( + title = "Backup type", // TODO [message-backups] Finalized copy + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) + ) { + Column( + modifier = Modifier + .fillMaxSize() + .padding(it) + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + ) { + LazyColumn( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) { + item { + Image( + painter = painterResource(id = R.drawable.ic_molly_logo), // TODO [message-backups] Finalized image + contentDescription = null, + modifier = Modifier + .padding(top = 48.dp) + .size(88.dp) + ) + } + + item { + Text( + text = "PINs protect your backup", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(top = 16.dp) + ) + } + + item { + Text( + text = "Your Signal PIN lets you restore your backup when you re-install Signal. For increased security, we recommend updating to a new $recommendedPinSize-digit PIN.", // TODO [message-backups] Finalized copy + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(top = 16.dp) + ) + } + + item { + Text( + text = "If you forget your PIN, you will not be able to restore your backup. You can change your PIN at any time in settings.", // TODO [message-backups] Finalized copy + textAlign = TextAlign.Center, + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodyLarge, + modifier = Modifier.padding(top = 16.dp) + ) + } + } + + Buttons.LargePrimary( + onClick = onGeneratePinClick, + modifier = Modifier.fillMaxWidth() + ) { + Text( + text = "Generate a new $recommendedPinSize-digit PIN" // TODO [message-backups] Finalized copy + ) + } + + TextButton( + onClick = onUseCurrentPinClick, + modifier = Modifier + .fillMaxWidth() + .padding(bottom = 16.dp) + ) { + Text( + text = "Use current Signal PIN" // TODO [message-backups] Finalized copy + ) + } + } + } +} + +@Preview +@Composable +private fun MessageBackupsPinScreenPreview() { + Previews.Preview { + MessageBackupsPinEducationScreen( + onNavigationClick = {}, + onGeneratePinClick = {}, + onUseCurrentPinClick = {}, + recommendedPinSize = 16 + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsScreen.kt new file mode 100644 index 0000000000..6025778299 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsScreen.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.backup.v2.ui + +enum class MessageBackupsScreen { + EDUCATION, + PIN_EDUCATION, + PIN_CONFIRMATION, + TYPE_SELECTION, + CHECKOUT_SHEET, + PROCESS_PAYMENT, + COMPLETED +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsTypeSelectionScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsTypeSelectionScreen.kt new file mode 100644 index 0000000000..c15d7926a3 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/ui/MessageBackupsTypeSelectionScreen.kt @@ -0,0 +1,302 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ +package org.thoughtcrime.securesms.backup.v2.ui + +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.ClickableText +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.ExperimentalTextApi +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.withAnnotation +import androidx.compose.ui.text.withStyle +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import org.signal.core.ui.Buttons +import org.signal.core.ui.Previews +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.theme.SignalTheme +import org.signal.core.util.money.FiatMoney +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.payments.FiatMoneyUtil +import java.math.BigDecimal +import java.util.Currency + +/** + * Screen which allows the user to select their preferred backup type. + */ +@OptIn(ExperimentalTextApi::class) +@Composable +fun MessageBackupsTypeSelectionScreen( + selectedBackupsType: MessageBackupsType?, + availableBackupsTypes: List, + onMessageBackupsTypeSelected: (MessageBackupsType) -> Unit, + onNavigationClick: () -> Unit, + onReadMoreClicked: () -> Unit, + onNextClicked: () -> Unit +) { + Scaffolds.Settings( + title = "", + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) + ) { paddingValues -> + Column( + modifier = Modifier + .padding(paddingValues) + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + .fillMaxSize() + ) { + LazyColumn( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) { + item { + Image( + painter = painterResource(id = R.drawable.ic_molly_logo), // TODO [message-backups] Finalized art asset + contentDescription = null, + modifier = Modifier.size(88.dp) + ) + } + + item { + Text( + text = "Choose your backup type", // TODO [message-backups] Finalized copy + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.padding(top = 12.dp) + ) + } + + item { + // TODO [message-backups] Finalized copy + val primaryColor = MaterialTheme.colorScheme.primary + val readMoreString = buildAnnotatedString { + append("All backups are end-to-end encrypted. Signal is a non-profit—paying for backups helps support our mission. ") + withAnnotation(tag = "URL", annotation = "read-more") { + withStyle( + style = SpanStyle( + color = primaryColor + ) + ) { + append("Read more") + } + } + } + + ClickableText( + text = readMoreString, + style = MaterialTheme.typography.bodyLarge.copy(textAlign = TextAlign.Center), + onClick = { offset -> + readMoreString + .getStringAnnotations(tag = "URL", start = offset, end = offset) + .firstOrNull()?.let { onReadMoreClicked() } + }, + modifier = Modifier.padding(top = 8.dp) + ) + } + + itemsIndexed( + availableBackupsTypes, + { _, item -> item.title } + ) { index, item -> + MessageBackupsTypeBlock( + messageBackupsType = item, + isSelected = item == selectedBackupsType, + onSelected = { onMessageBackupsTypeSelected(item) }, + modifier = Modifier.padding(top = if (index == 0) 20.dp else 18.dp) + ) + } + } + + Buttons.LargePrimary( + onClick = onNextClicked, + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 16.dp) + ) { + Text( + text = "Next" // TODO [message-backups] Finalized copy + ) + } + } + } +} + +@Preview +@Composable +private fun MessageBackupsTypeSelectionScreenPreview() { + val freeTier = MessageBackupsType( + pricePerMonth = FiatMoney(BigDecimal.ZERO, Currency.getInstance("USD")), + title = "Text + 30 days of media", + features = persistentListOf( + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_thread_compact_bold_16, + label = "Full text message backup" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_album_compact_bold_16, + label = "Last 30 days of media" + ) + ) + ) + + val paidTier = MessageBackupsType( + pricePerMonth = FiatMoney(BigDecimal.valueOf(3), Currency.getInstance("USD")), + title = "Text + All your media", + features = persistentListOf( + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_thread_compact_bold_16, + label = "Full text message backup" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_album_compact_bold_16, + label = "Full media backup" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_thread_compact_bold_16, + label = "1TB of storage (~250K photos)" + ), + MessageBackupsTypeFeature( + iconResourceId = R.drawable.symbol_heart_compact_bold_16, + label = "Thanks for supporting Signal!" + ) + ) + ) + + var selectedBackupsType by remember { mutableStateOf(freeTier) } + + Previews.Preview { + MessageBackupsTypeSelectionScreen( + selectedBackupsType = selectedBackupsType, + availableBackupsTypes = listOf(freeTier, paidTier), + onMessageBackupsTypeSelected = { selectedBackupsType = it }, + onNavigationClick = {}, + onReadMoreClicked = {}, + onNextClicked = {} + ) + } +} + +@Composable +fun MessageBackupsTypeBlock( + messageBackupsType: MessageBackupsType, + isSelected: Boolean, + onSelected: () -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true +) { + val borderColor = if (isSelected) { + MaterialTheme.colorScheme.primary + } else { + Color.Transparent + } + + val background = if (isSelected) { + MaterialTheme.colorScheme.secondaryContainer + } else { + SignalTheme.colors.colorSurface2 + } + + Column( + modifier = modifier + .fillMaxWidth() + .background(color = background, shape = RoundedCornerShape(18.dp)) + .border(width = 2.dp, color = borderColor, shape = RoundedCornerShape(18.dp)) + .clip(shape = RoundedCornerShape(18.dp)) + .clickable(onClick = onSelected, enabled = enabled) + .padding(vertical = 16.dp, horizontal = 20.dp) + ) { + Text( + text = formatCostPerMonth(messageBackupsType.pricePerMonth), + style = MaterialTheme.typography.titleSmall + ) + + Text( + text = messageBackupsType.title, + style = MaterialTheme.typography.titleMedium + ) + + Column( + verticalArrangement = spacedBy(4.dp), + modifier = Modifier + .padding(top = 8.dp) + .padding(horizontal = 16.dp) + ) { + messageBackupsType.features.forEach { + MessageBackupsTypeFeatureRow(messageBackupsTypeFeature = it) + } + } + } +} + +@Composable +private fun formatCostPerMonth(pricePerMonth: FiatMoney): String { + return if (pricePerMonth.amount == BigDecimal.ZERO) { + "Free" + } else { + "${FiatMoneyUtil.format(LocalContext.current.resources, pricePerMonth, FiatMoneyUtil.formatOptions().trimZerosAfterDecimal())}/month" + } +} + +@Composable +private fun MessageBackupsTypeFeatureRow(messageBackupsTypeFeature: MessageBackupsTypeFeature) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier.fillMaxWidth() + ) { + Icon( + painter = painterResource(id = messageBackupsTypeFeature.iconResourceId), + contentDescription = null, + modifier = Modifier.padding(end = 8.dp) + ) + + Text( + text = messageBackupsTypeFeature.label, + style = MaterialTheme.typography.bodyLarge + ) + } +} + +data class MessageBackupsType( + val pricePerMonth: FiatMoney, + val title: String, + val features: ImmutableList +) + +data class MessageBackupsTypeFeature( + val iconResourceId: Int, + val label: String +) diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeImageView.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeImageView.kt index fd62a04dab..502c5d19b3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeImageView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/BadgeImageView.kt @@ -3,11 +3,11 @@ package org.thoughtcrime.securesms.badges import android.content.Context import android.util.AttributeSet import androidx.appcompat.widget.AppCompatImageView +import com.bumptech.glide.Glide +import com.bumptech.glide.RequestManager import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy import org.thoughtcrime.securesms.badges.glide.BadgeSpriteTransformation import org.thoughtcrime.securesms.badges.models.Badge -import org.thoughtcrime.securesms.mms.GlideApp -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.ThemeUtil @@ -29,35 +29,35 @@ class BadgeImageView @JvmOverloads constructor( } fun setBadgeFromRecipient(recipient: Recipient?) { - getGlideRequests()?.let { + getGlideRequestManager()?.let { setBadgeFromRecipient(recipient, it) } ?: clearDrawable() } - fun setBadgeFromRecipient(recipient: Recipient?, glideRequests: GlideRequests) { + fun setBadgeFromRecipient(recipient: Recipient?, requestManager: RequestManager) { if (recipient == null || recipient.badges.isEmpty()) { - setBadge(null, glideRequests) + setBadge(null, requestManager) } else if (recipient.isSelf) { val badge = recipient.featuredBadge if (badge == null || !badge.visible || badge.isExpired()) { - setBadge(null, glideRequests) + setBadge(null, requestManager) } else { - setBadge(badge, glideRequests) + setBadge(badge, requestManager) } } else { - setBadge(recipient.featuredBadge, glideRequests) + setBadge(recipient.featuredBadge, requestManager) } } fun setBadge(badge: Badge?) { - getGlideRequests()?.let { + getGlideRequestManager()?.let { setBadge(badge, it) } ?: clearDrawable() } - fun setBadge(badge: Badge?, glideRequests: GlideRequests) { + fun setBadge(badge: Badge?, requestManager: RequestManager) { if (badge != null) { - glideRequests + requestManager .load(badge) .downsample(DownsampleStrategy.NONE) .transform(BadgeSpriteTransformation(BadgeSpriteTransformation.Size.fromInteger(badgeSize), badge.imageDensity, ThemeUtil.isDarkTheme(context))) @@ -65,7 +65,7 @@ class BadgeImageView @JvmOverloads constructor( isClickable = true } else { - glideRequests + requestManager .clear(this) clearDrawable() } @@ -78,9 +78,9 @@ class BadgeImageView @JvmOverloads constructor( } } - private fun getGlideRequests(): GlideRequests? { + private fun getGlideRequestManager(): RequestManager? { return try { - GlideApp.with(this) + Glide.with(this) } catch (e: IllegalArgumentException) { // View not attached to an activity or activity destroyed null diff --git a/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt b/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt index 22e664d75c..1882e2d291 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/badges/models/Badge.kt @@ -7,6 +7,7 @@ import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.compose.runtime.Stable +import com.bumptech.glide.Glide import com.bumptech.glide.load.Key import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy @@ -14,7 +15,6 @@ import kotlinx.parcelize.Parcelize import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.glide.BadgeSpriteTransformation import org.thoughtcrime.securesms.components.settings.PreferenceModel -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.ThemeUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -127,7 +127,7 @@ data class Badge( badge.alpha = if (model.badge.isExpired() || model.isFaded) 0.5f else 1f - GlideApp.with(badge) + Glide.with(badge) .load(model.badge) .downsample(DownsampleStrategy.NONE) .diskCacheStrategy(DiskCacheStrategy.NONE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt index 9125e44670..b8440134dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt @@ -7,13 +7,13 @@ import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.core.content.ContextCompat import androidx.core.widget.TextViewCompat +import com.bumptech.glide.Glide import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.database.CallTable import org.thoughtcrime.securesms.database.MessageTypes import org.thoughtcrime.securesms.databinding.CallLogAdapterItemBinding import org.thoughtcrime.securesms.databinding.CallLogCreateCallLinkItemBinding import org.thoughtcrime.securesms.databinding.ConversationListItemClearFilterBinding -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.SearchUtil @@ -272,7 +272,7 @@ class CallLogAdapter( } private fun presentRecipientDetails(recipient: Recipient, searchQuery: String?) { - binding.callRecipientAvatar.setAvatar(GlideApp.with(binding.callRecipientAvatar), recipient, true) + binding.callRecipientAvatar.setAvatar(Glide.with(binding.callRecipientAvatar), recipient, true) binding.callRecipientBadge.setBadgeFromRecipient(recipient) binding.callRecipientName.text = if (searchQuery != null) { SearchUtil.getHighlightedSpan( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java index 9ceeaf091c..4a37f72d1c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/AlbumThumbnailView.java @@ -16,9 +16,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.transfercontrols.TransferControlView; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideClickListener; import org.thoughtcrime.securesms.mms.SlidesClickedListener; @@ -65,7 +66,7 @@ public AlbumThumbnailView(@NonNull Context context, @Nullable AttributeSet attrs transferControlsStub = new Stub<>(findViewById(R.id.album_transfer_controls_stub)); } - public void setSlides(@NonNull GlideRequests glideRequests, @NonNull List slides, boolean showControls) { + public void setSlides(@NonNull RequestManager requestManager, @NonNull List slides, boolean showControls) { if (slides.size() < 2) { throw new IllegalStateException("Provided less than two slides."); } @@ -98,7 +99,7 @@ public void setSlides(@NonNull GlideRequests glideRequests, @NonNull List currentSizeClass = sizeClass; } - showSlides(glideRequests, slides); + showSlides(requestManager, slides); applyCorners(); forceLayout(); } @@ -261,21 +262,21 @@ private void applyCornersForManySizeClass() { applyCornersForSizeClass5(); } - private void showSlides(@NonNull GlideRequests glideRequests, @NonNull List slides) { + private void showSlides(@NonNull RequestManager requestManager, @NonNull List slides) { boolean showControls = TransferControlView.containsPlayableSlides(slides); - setSlide(glideRequests, slides.get(0), R.id.album_cell_1, showControls); - setSlide(glideRequests, slides.get(1), R.id.album_cell_2, showControls); + setSlide(requestManager, slides.get(0), R.id.album_cell_1, showControls); + setSlide(requestManager, slides.get(1), R.id.album_cell_2, showControls); if (slides.size() >= 3) { - setSlide(glideRequests, slides.get(2), R.id.album_cell_3, showControls); + setSlide(requestManager, slides.get(2), R.id.album_cell_3, showControls); } if (slides.size() >= 4) { - setSlide(glideRequests, slides.get(3), R.id.album_cell_4, showControls); + setSlide(requestManager, slides.get(3), R.id.album_cell_4, showControls); } if (slides.size() >= 5) { - setSlide(glideRequests, slides.get(4), R.id.album_cell_5, showControls && slides.size() == 5); + setSlide(requestManager, slides.get(4), R.id.album_cell_5, showControls && slides.size() == 5); } if (slides.size() > 5) { @@ -284,7 +285,7 @@ private void showSlides(@NonNull GlideRequests glideRequests, @NonNull List request = requestManager.load(photo.contactPhoto) + RequestBuilder request = requestManager.load(photo.contactPhoto) .dontAnimate() .fallback(fallbackContactPhotoDrawable) .error(fallbackContactPhotoDrawable) @@ -265,7 +265,7 @@ public void setImageBytesForGroup(@Nullable byte[] avatarBytes, .getPhotoForGroup() .asDrawable(getContext(), color); - GlideApp.with(this) + Glide.with(this) .load(avatarBytes) .dontAnimate() .fallback(fallback) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/BorderlessImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/BorderlessImageView.java index 4ced566fb6..a85b58aefa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/BorderlessImageView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/BorderlessImageView.java @@ -9,8 +9,9 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideClickListener; import org.thoughtcrime.securesms.mms.SlidesClickedListener; @@ -52,15 +53,15 @@ public void setOnLongClickListener(@Nullable OnLongClickListener l) { image.setOnLongClickListener(l); } - public void setSlide(@NonNull GlideRequests glideRequests, @NonNull Slide slide) { + public void setSlide(@NonNull RequestManager requestManager, @NonNull Slide slide) { boolean showControls = slide.asAttachment().getUri() == null; if (slide.hasSticker()) { image.setScaleType(ImageView.ScaleType.FIT_CENTER); - image.setImageResource(glideRequests, slide, showControls, false); + image.setImageResource(requestManager, slide, showControls, false); } else { image.setScaleType(ImageView.ScaleType.CENTER_CROP); - image.setImageResource(glideRequests, slide, showControls, false, slide.asAttachment().width, slide.asAttachment().height); + image.setImageResource(requestManager, slide, showControls, false, slide.asAttachment().width, slide.asAttachment().height); } missingShade.setVisibility(showControls ? View.VISIBLE : View.GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ContactFilterView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ContactFilterView.java index b776fda73e..d3266e0eed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ContactFilterView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ContactFilterView.java @@ -114,23 +114,23 @@ private void applyAttributes(@NonNull EditText searchText, int defStyle) { final TypedArray attributes = context.obtainStyledAttributes(attrs, - R.styleable.ContactFilterToolbar, + R.styleable.ContactFilterView, defStyle, 0); - int styleResource = attributes.getResourceId(R.styleable.ContactFilterToolbar_searchTextStyle, -1); + int styleResource = attributes.getResourceId(R.styleable.ContactFilterView_searchTextStyle, -1); if (styleResource != -1) { TextViewCompat.setTextAppearance(searchText, styleResource); } - if (!attributes.getBoolean(R.styleable.ContactFilterToolbar_showDialpad, true)) { + if (!attributes.getBoolean(R.styleable.ContactFilterView_showDialpad, true)) { dialpadToggle.setVisibility(GONE); } - if (attributes.getBoolean(R.styleable.ContactFilterToolbar_cfv_autoFocus, true)) { + if (attributes.getBoolean(R.styleable.ContactFilterView_cfv_autoFocus, true)) { searchText.requestFocus(); } - int backgroundRes = attributes.getResourceId(R.styleable.ContactFilterToolbar_cfv_background, -1); + int backgroundRes = attributes.getResourceId(R.styleable.ContactFilterView_cfv_background, -1); if (backgroundRes != -1) { findViewById(R.id.background_holder).setBackgroundResource(backgroundRes); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt index 804259c76f..8de7e91f19 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemThumbnail.kt @@ -16,10 +16,10 @@ import androidx.annotation.ColorInt import androidx.annotation.Px import androidx.annotation.UiThread import androidx.core.os.bundleOf +import com.bumptech.glide.RequestManager import org.signal.core.util.dp import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.mms.Slide import org.thoughtcrime.securesms.mms.SlideClickListener import org.thoughtcrime.securesms.mms.SlidesClickedListener @@ -192,7 +192,7 @@ class ConversationItemThumbnail @JvmOverloads constructor( @UiThread fun setImageResource( - glideRequests: GlideRequests, + requestManager: RequestManager, slides: List, showControls: Boolean, isPreview: Boolean @@ -223,7 +223,7 @@ class ConversationItemThumbnail @JvmOverloads constructor( val attachment = slides[0].asAttachment() - thumbnail.get().setImageResource(glideRequests, slides[0], showControls, isPreview, attachment.width, attachment.height) + thumbnail.get().setImageResource(requestManager, slides[0], showControls, isPreview, attachment.width, attachment.height) touchDelegate = thumbnail.get().touchDelegate } else { state = state.copy( @@ -232,7 +232,7 @@ class ConversationItemThumbnail @JvmOverloads constructor( ) state.applyState(thumbnail, album) - album.get().setSlides(glideRequests, slides, showControls) + album.get().setSlides(requestManager, slides, showControls) touchDelegate = album.get().touchDelegate } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java index c7174022f0..d4bfda5a66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java @@ -11,9 +11,10 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.badges.BadgeImageView; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import java.util.List; @@ -49,7 +50,7 @@ protected void onFinishInflate() { indicator = findViewById(R.id.typing_indicator); } - public void setTypists(@NonNull GlideRequests glideRequests, @NonNull List typists, boolean isGroupThread, boolean hasWallpaper) { + public void setTypists(@NonNull RequestManager requestManager, @NonNull List typists, boolean isGroupThread, boolean hasWallpaper) { if (typists.isEmpty()) { indicator.stopAnimation(); return; @@ -64,7 +65,7 @@ public void setTypists(@NonNull GlideRequests glideRequests, @NonNull List typists) { - avatar1.setAvatar(glideRequests, typists.get(0), typists.size() == 1); + private void presentGroupThreadAvatars(@NonNull RequestManager requestManager, @NonNull List typists) { + avatar1.setAvatar(requestManager, typists.get(0), typists.size() == 1); avatar1.setVisibility(VISIBLE); - badge1.setBadgeFromRecipient(typists.get(0), glideRequests); + badge1.setBadgeFromRecipient(typists.get(0), requestManager); badge1.setVisibility(VISIBLE); if (typists.size() > 1) { - avatar2.setAvatar(glideRequests, typists.get(1), false); + avatar2.setAvatar(requestManager, typists.get(1), false); avatar2.setVisibility(VISIBLE); - badge2.setBadgeFromRecipient(typists.get(1), glideRequests); + badge2.setBadgeFromRecipient(typists.get(1), requestManager); badge2.setVisibility(VISIBLE); } if (typists.size() == 3) { - avatar3.setAvatar(glideRequests, typists.get(2), false); + avatar3.setAvatar(requestManager, typists.get(2), false); avatar3.setVisibility(VISIBLE); - badge3.setBadgeFromRecipient(typists.get(2), glideRequests); + badge3.setBadgeFromRecipient(typists.get(2), requestManager); badge3.setVisibility(VISIBLE); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java b/app/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java index 2ffe74ca5c..49217180d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/DeliveryStatusView.java @@ -3,6 +3,7 @@ import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; +import android.graphics.PorterDuff; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; @@ -146,7 +147,7 @@ public void setPending() { setVisibility(View.VISIBLE); ViewUtil.setPaddingStart(this, 0); ViewUtil.setPaddingEnd(this, horizontalPadding); - setImageResource(R.drawable.ic_delivery_status_sending); + setImageResource(R.drawable.symbol_messagestatus_sending_24); updateContentDescription(); } @@ -156,7 +157,7 @@ public void setSent() { ViewUtil.setPaddingStart(this, horizontalPadding); ViewUtil.setPaddingEnd(this, 0); clearAnimation(); - setImageResource(R.drawable.ic_delivery_status_sent); + setImageResource(R.drawable.symbol_messagestatus_sent_24); updateContentDescription(); } @@ -166,7 +167,7 @@ public void setDelivered() { ViewUtil.setPaddingStart(this, horizontalPadding); ViewUtil.setPaddingEnd(this, 0); clearAnimation(); - setImageResource(R.drawable.ic_delivery_status_delivered); + setImageResource(R.drawable.symbol_messagestatus_delivered_24); updateContentDescription(); } @@ -176,12 +177,12 @@ public void setRead() { ViewUtil.setPaddingStart(this, horizontalPadding); ViewUtil.setPaddingEnd(this, 0); clearAnimation(); - setImageResource(R.drawable.ic_delivery_status_read); + setImageResource(R.drawable.symbol_messagestatus_read_24); updateContentDescription(); } public void setTint(int color) { - setColorFilter(color); + setColorFilter(color, PorterDuff.Mode.SRC_IN); } private void updateContentDescription() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java index 92b26ce15a..61a6442c01 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/FromTextView.java @@ -1,12 +1,11 @@ package org.thoughtcrime.securesms.components; import android.content.Context; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.text.SpannableStringBuilder; import android.util.AttributeSet; +import androidx.annotation.DrawableRes; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; @@ -15,11 +14,10 @@ import org.thoughtcrime.securesms.components.emoji.SimpleEmojiTextView; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.ContextUtil; +import org.thoughtcrime.securesms.util.DrawableUtil; import org.thoughtcrime.securesms.util.SpanUtil; import org.thoughtcrime.securesms.util.ViewUtil; -import java.util.Objects; - public class FromTextView extends SimpleEmojiTextView { private static final String TAG = Log.tag(FromTextView.class); @@ -71,17 +69,23 @@ public void setText(Recipient recipient, @Nullable CharSequence fromString, bool setText(builder); - if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(R.drawable.ic_block_grey600_18dp, 0, 0, 0); + if (recipient.isBlocked()) setCompoundDrawablesRelativeWithIntrinsicBounds(getBlocked(), null, null, null); else if (recipient.isMuted()) setCompoundDrawablesRelativeWithIntrinsicBounds(getMuted(), null, null, null); else setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0); } + private Drawable getBlocked() { + return getDrawable(R.drawable.symbol_block_16); + } + private Drawable getMuted() { - Drawable mutedDrawable = Objects.requireNonNull(ContextCompat.getDrawable(getContext(), R.drawable.ic_bell_disabled_16)); + return getDrawable(R.drawable.ic_bell_disabled_16); + } + private Drawable getDrawable(@DrawableRes int drawable) { + Drawable mutedDrawable = ContextUtil.requireDrawable(getContext(), drawable); mutedDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); - mutedDrawable.setColorFilter(new PorterDuffColorFilter(ContextCompat.getColor(getContext(), R.color.signal_icon_tint_secondary), PorterDuff.Mode.SRC_IN)); - + DrawableUtil.tint(mutedDrawable, ContextCompat.getColor(getContext(), R.color.signal_icon_tint_secondary)); return mutedDrawable; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java b/app/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java index f68c3ea781..678d350949 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/GlideBitmapListeningTarget.java @@ -9,7 +9,7 @@ import com.bumptech.glide.request.target.BitmapImageViewTarget; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; +import org.signal.core.util.concurrent.SettableFuture; public class GlideBitmapListeningTarget extends BitmapImageViewTarget { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java b/app/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java index e830a6c538..b20fb0069f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/GlideDrawableListeningTarget.java @@ -8,8 +8,8 @@ import com.bumptech.glide.request.target.DrawableImageViewTarget; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; public class GlideDrawableListeningTarget extends DrawableImageViewTarget { 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 15b2f1cab6..36d2e6eeba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/InputPanel.java @@ -32,9 +32,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.signal.core.util.ThreadUtil; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.animation.AnimationCompleteListener; @@ -49,9 +53,9 @@ import org.thoughtcrime.securesms.conversation.MessageStyler; import org.thoughtcrime.securesms.conversation.VoiceNoteDraftView; import org.thoughtcrime.securesms.database.DraftTable; -import org.thoughtcrime.securesms.database.model.MmsMessageRecord; 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; @@ -59,8 +63,6 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideApp; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.QuoteModel; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideDeck; @@ -69,8 +71,6 @@ import org.thoughtcrime.securesms.util.MessageRecordUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import java.util.Arrays; import java.util.List; @@ -184,7 +184,7 @@ public void onFinishInflate() { } }); - stickerSuggestionAdapter = new ConversationStickerSuggestionAdapter(GlideApp.with(this), this); + stickerSuggestionAdapter = new ConversationStickerSuggestionAdapter(Glide.with(this), this); stickerSuggestion.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false)); stickerSuggestion.setAdapter(stickerSuggestionAdapter); @@ -212,14 +212,14 @@ public void setMediaListener(@NonNull MediaListener listener) { composeText.setMediaListener(listener); } - public void setQuote(@NonNull GlideRequests glideRequests, + public void setQuote(@NonNull RequestManager requestManager, long id, @NonNull Recipient author, @Nullable CharSequence body, @NonNull SlideDeck attachments, @NonNull QuoteModel.Type quoteType) { - this.quoteView.setQuote(glideRequests, id, author, body, false, attachments, null, quoteType); + this.quoteView.setQuote(requestManager, id, author, body, false, attachments, null, quoteType); int originalHeight = this.quoteView.getVisibility() == VISIBLE ? this.quoteView.getMeasuredHeight() : 0; @@ -325,10 +325,10 @@ public void setLinkPreviewNoPreview(@Nullable LinkPreviewRepository.Error custom this.linkPreview.setNoPreview(customError); } - public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull Optional preview) { + public void setLinkPreview(@NonNull RequestManager requestManager, @NonNull Optional preview) { if (preview.isPresent()) { this.linkPreview.setVisibility(View.VISIBLE); - this.linkPreview.setLinkPreview(glideRequests, preview.get(), true); + this.linkPreview.setLinkPreview(requestManager, preview.get(), true); } else { this.linkPreview.setVisibility(View.GONE); } @@ -404,7 +404,7 @@ public void setWallpaperEnabled(boolean enabled) { quoteView.setWallpaperEnabled(enabled); } - public void enterEditMessageMode(@NonNull GlideRequests glideRequests, @NonNull ConversationMessage conversationMessageToEdit, boolean fromDraft) { + public void enterEditMessageMode(@NonNull RequestManager requestManager, @NonNull ConversationMessage conversationMessageToEdit, boolean fromDraft) { SpannableString textToEdit = conversationMessageToEdit.getDisplayBody(getContext()); if (!fromDraft) { MessageStyler.convertSpoilersToComposeMode(textToEdit); @@ -415,14 +415,14 @@ public void enterEditMessageMode(@NonNull GlideRequests glideRequests, @NonNull if (quote == null) { clearQuote(); } else { - setQuote(glideRequests, quote.getId(), Recipient.resolved(quote.getAuthor()), quote.getDisplayText(), quote.getAttachment(), quote.getQuoteType()); + setQuote(requestManager, quote.getId(), Recipient.resolved(quote.getAuthor()), quote.getDisplayText(), quote.getAttachment(), quote.getQuoteType()); } this.messageToEdit = conversationMessageToEdit.getMessageRecord(); - updateEditModeThumbnail(glideRequests); + updateEditModeThumbnail(requestManager); updateEditModeUi(); } - private void updateEditModeThumbnail(@NonNull GlideRequests glideRequests) { + private void updateEditModeThumbnail(@NonNull RequestManager requestManager) { if (messageToEdit instanceof MmsMessageRecord) { MmsMessageRecord mediaEditMessage = (MmsMessageRecord) messageToEdit; SlideDeck slideDeck = mediaEditMessage.getSlideDeck(); @@ -430,7 +430,7 @@ private void updateEditModeThumbnail(@NonNull GlideRequests glideRequests) { if (imageVideoSlide != null && imageVideoSlide.getUri() != null) { editMessageThumbnail.setVisibility(VISIBLE); - glideRequests.load(new DecryptableStreamUriLoader.DecryptableUri(imageVideoSlide.getUri())) + requestManager.load(new DecryptableStreamUriLoader.DecryptableUri(imageVideoSlide.getUri())) .centerCrop() .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .into(editMessageThumbnail); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java b/app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java index d49809e2bf..8866f223f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/LinkPreviewView.java @@ -16,13 +16,14 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import com.bumptech.glide.RequestManager; + import org.signal.ringrtc.CallLinkRootKey; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.calls.links.CallLinks; import org.thoughtcrime.securesms.conversation.colors.AvatarColorHash; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.SlidesClickedListener; import org.thoughtcrime.securesms.recipients.Recipient; @@ -162,11 +163,11 @@ public void setNoPreview(@Nullable LinkPreviewRepository.Error customError) { noPreview.setText(getLinkPreviewErrorString(customError)); } - public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail) { - setLinkPreview(glideRequests, linkPreview, showThumbnail, true, false); + public void setLinkPreview(@NonNull RequestManager requestManager, @NonNull LinkPreview linkPreview, boolean showThumbnail) { + setLinkPreview(requestManager, linkPreview, showThumbnail, true, false); } - public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPreview linkPreview, boolean showThumbnail, boolean showDescription, boolean scheduleMessageMode) { + public void setLinkPreview(@NonNull RequestManager requestManager, @NonNull LinkPreview linkPreview, boolean showThumbnail, boolean showDescription, boolean scheduleMessageMode) { spinner.setVisibility(GONE); noPreview.setVisibility(GONE); @@ -216,13 +217,13 @@ public void setLinkPreview(@NonNull GlideRequests glideRequests, @NonNull LinkPr if (showThumbnail && linkPreview.getThumbnail().isPresent()) { thumbnail.setVisibility(VISIBLE); thumbnailState.applyState(thumbnail); - thumbnail.get().setImageResource(glideRequests, new ImageSlide(linkPreview.getThumbnail().get()), type == TYPE_CONVERSATION && !scheduleMessageMode, false); + thumbnail.get().setImageResource(requestManager, new ImageSlide(linkPreview.getThumbnail().get()), type == TYPE_CONVERSATION && !scheduleMessageMode, false); thumbnail.get().showSecondaryText(false); } else if (callLinkRootKey != null) { thumbnail.setVisibility(VISIBLE); thumbnailState.applyState(thumbnail); thumbnail.get().setImageDrawable( - glideRequests, + requestManager, Recipient.DEFAULT_FALLBACK_PHOTO_PROVIDER .getPhotoForCallLink() .asDrawable(getContext(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java index 12d59d0868..4e60014ef8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/QuoteView.java @@ -15,6 +15,7 @@ import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.google.android.material.imageview.ShapeableImageView; import com.google.android.material.shape.CornerFamily; @@ -32,7 +33,6 @@ import org.thoughtcrime.securesms.database.model.Mention; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.QuoteModel; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideDeck; @@ -193,7 +193,7 @@ public void setMessageType(@NonNull MessageType messageType) { } } - public void setQuote(GlideRequests glideRequests, + public void setQuote(RequestManager requestManager, long id, @NonNull Recipient author, @Nullable CharSequence body, @@ -213,7 +213,7 @@ public void setQuote(GlideRequests glideRequests, this.author.observeForever(this); setQuoteAuthor(author); setQuoteText(resolveBody(body, quoteType), attachments, originalMissing, storyReaction); - setQuoteAttachment(glideRequests, body, attachments, originalMissing); + setQuoteAttachment(requestManager, body, attachments, originalMissing); setQuoteMissingFooter(originalMissing); applyColorTheme(); } @@ -347,7 +347,7 @@ private void setQuoteText(@Nullable CharSequence body, } } - private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull CharSequence body, @NonNull SlideDeck slideDeck, boolean originalMissing) { + private void setQuoteAttachment(@NonNull RequestManager requestManager, @NonNull CharSequence body, @NonNull SlideDeck slideDeck, boolean originalMissing) { boolean outgoing = messageType != MessageType.INCOMING && messageType != MessageType.STORY_REPLY_INCOMING; boolean preview = messageType == MessageType.PREVIEW || messageType == MessageType.STORY_REPLY_PREVIEW; @@ -359,7 +359,7 @@ private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull C attachmentVideoOVerlayStub.setVisibility(GONE); attachmentNameViewStub.setVisibility(GONE); thumbnailView.setVisibility(VISIBLE); - glideRequests.load(model) + requestManager.load(model) .centerCrop() .override(thumbWidth, thumbHeight) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -377,7 +377,7 @@ private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull C attachmentVideoOVerlayStub.setVisibility(GONE); attachmentNameViewStub.setVisibility(GONE); thumbnailView.setVisibility(VISIBLE); - glideRequests.load(R.drawable.ic_gift_thumbnail) + requestManager.load(R.drawable.ic_gift_thumbnail) .centerCrop() .override(thumbWidth, thumbHeight) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) @@ -404,7 +404,7 @@ private void setQuoteAttachment(@NonNull GlideRequests glideRequests, @NonNull C if (imageVideoSlide.hasVideo() && !imageVideoSlide.isVideoGif()) { attachmentVideoOVerlayStub.setVisibility(VISIBLE); } - glideRequests.load(new DecryptableUri(imageVideoSlide.getUri())) + requestManager.load(new DecryptableUri(imageVideoSlide.getUri())) .centerCrop() .override(thumbWidth, thumbHeight) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java index d336d57529..f92aaa1bd0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/RecentPhotoViewRail.java @@ -22,6 +22,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.Key; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; @@ -31,7 +32,6 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter; import org.thoughtcrime.securesms.database.loaders.RecentPhotosLoader; -import org.thoughtcrime.securesms.mms.GlideApp; public class RecentPhotoViewRail extends FrameLayout implements LoaderManager.LoaderCallbacks { @@ -119,7 +119,7 @@ public void onBindItemViewHolder(RecentPhotoViewHolder viewHolder, @NonNull Curs Key signature = new MediaStoreSignature(mimeType, dateModified, orientation); - GlideApp.with(getContext().getApplicationContext()) + Glide.with(getContext().getApplicationContext()) .load(uri) .signature(signature) .diskCacheStrategy(DiskCacheStrategy.NONE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java b/app/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java index e2068d5b49..883ee18093 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/SharedContactView.java @@ -16,6 +16,7 @@ import androidx.annotation.RequiresApi; import com.annimon.stream.Stream; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.R; @@ -23,7 +24,6 @@ import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientForeverObserver; @@ -44,13 +44,13 @@ public class SharedContactView extends LinearLayout implements RecipientForeverO private TextView actionButtonView; private ConversationItemFooter footer; - private Contact contact; - private Locale locale; - private GlideRequests glideRequests; - private EventListener eventListener; - private CornerMask cornerMask; - private int bigCornerRadius; - private int smallCornerRadius; + private Contact contact; + private Locale locale; + private RequestManager requestManager; + private EventListener eventListener; + private CornerMask cornerMask; + private int bigCornerRadius; + private int smallCornerRadius; private final Map activeRecipients = new HashMap<>(); @@ -110,10 +110,10 @@ protected void dispatchDraw(Canvas canvas) { cornerMask.mask(canvas); } - public void setContact(@NonNull Contact contact, @NonNull GlideRequests glideRequests, @NonNull Locale locale) { - this.glideRequests = glideRequests; - this.locale = locale; - this.contact = contact; + public void setContact(@NonNull Contact contact, @NonNull RequestManager requestManager, @NonNull Locale locale) { + this.requestManager = requestManager; + this.locale = locale; + this.contact = contact; Stream.of(activeRecipients.values()).forEach(recipient -> recipient.removeForeverObserver(this)); this.activeRecipients.clear(); @@ -171,17 +171,17 @@ private void presentContact(@Nullable Contact contact) { private void presentAvatar(@Nullable Uri uri) { if (uri != null) { - glideRequests.load(new DecryptableUri(uri)) - .fallback(R.drawable.ic_contact_picture) - .circleCrop() - .diskCacheStrategy(DiskCacheStrategy.ALL) - .dontAnimate() - .into(avatarView); + requestManager.load(new DecryptableUri(uri)) + .fallback(R.drawable.symbol_person_display_40) + .circleCrop() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .dontAnimate() + .into(avatarView); } else { - glideRequests.load(R.drawable.ic_contact_picture) - .circleCrop() - .diskCacheStrategy(DiskCacheStrategy.ALL) - .into(avatarView); + requestManager.load(R.drawable.symbol_person_display_40) + .circleCrop() + .diskCacheStrategy(DiskCacheStrategy.ALL) + .into(avatarView); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java index bf34013e30..6671fdf5ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ThreadPhotoRailView.java @@ -2,7 +2,6 @@ import android.content.Context; -import android.database.Cursor; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -15,11 +14,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.database.MediaTable; import org.thoughtcrime.securesms.mediapreview.MediaPreviewCache; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.util.MediaUtil; @@ -58,8 +58,8 @@ public void setListener(@Nullable OnItemClickedListener listener) { } } - public void setMediaRecords(@NonNull GlideRequests glideRequests, @NonNull List mediaRecords) { - this.recyclerView.setAdapter(new ThreadPhotoRailAdapter(getContext(), glideRequests, mediaRecords, this.listener)); + public void setMediaRecords(@NonNull RequestManager requestManager, @NonNull List mediaRecords) { + this.recyclerView.setAdapter(new ThreadPhotoRailAdapter(getContext(), requestManager, mediaRecords, this.listener)); } private static class ThreadPhotoRailAdapter extends RecyclerView.Adapter { @@ -67,18 +67,18 @@ private static class ThreadPhotoRailAdapter extends RecyclerView.Adapter mediaRecords = new ArrayList<>(); private ThreadPhotoRailAdapter(@NonNull Context context, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull List mediaRecords, @Nullable OnItemClickedListener listener) { - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.clickedListener = listener; this.mediaRecords.clear(); @@ -103,7 +103,7 @@ public void onBindViewHolder(@NonNull ThreadPhotoViewHolder viewHolder, int posi MediaTable.MediaRecord mediaRecord = mediaRecords.get(position); Slide slide = MediaUtil.getSlideForAttachment(mediaRecord.getAttachment()); - viewHolder.imageView.setImageResource(glideRequests, slide, false, false); + viewHolder.imageView.setImageResource(requestManager, slide, false, false); viewHolder.imageView.setOnClickListener(v -> { MediaPreviewCache.INSTANCE.setDrawable(viewHolder.imageView.getImageDrawable()); if (clickedListener != null) clickedListener.onItemClicked(viewHolder.imageView, mediaRecord); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java index 42da090d0e..cfc0414e52 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ThumbnailView.java @@ -27,11 +27,14 @@ import androidx.appcompat.widget.AppCompatImageView; import com.bumptech.glide.RequestBuilder; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.Request; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestOptions; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.logging.Log; import org.signal.glide.transforms.SignalDownsampleStrategy; import org.thoughtcrime.securesms.R; @@ -39,8 +42,6 @@ import org.thoughtcrime.securesms.components.transfercontrols.TransferControlView; import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideRequest; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideClickListener; @@ -49,8 +50,6 @@ import org.thoughtcrime.securesms.stories.StoryTextPostModel; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.views.Stub; import java.util.Arrays; @@ -314,23 +313,23 @@ public void setBounds(int minWidth, int maxWidth, int minHeight, int maxHeight) } } - public void setImageDrawable(@NonNull GlideRequests glideRequests, @Nullable Drawable drawable) { - glideRequests.clear(image); - glideRequests.clear(blurHash); + public void setImageDrawable(@NonNull RequestManager requestManager, @Nullable Drawable drawable) { + requestManager.clear(image); + requestManager.clear(blurHash); image.setImageDrawable(drawable); blurHash.setImageDrawable(null); } @UiThread - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Slide slide, + public ListenableFuture setImageResource(@NonNull RequestManager requestManager, @NonNull Slide slide, boolean showControls, boolean isPreview) { - return setImageResource(glideRequests, slide, showControls, isPreview, 0, 0); + return setImageResource(requestManager, slide, showControls, isPreview, 0, 0); } @UiThread - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Slide slide, + public ListenableFuture setImageResource(@NonNull RequestManager requestManager, @NonNull Slide slide, boolean showControls, boolean isPreview, int naturalWidth, int naturalHeight) { @@ -340,10 +339,10 @@ public ListenableFuture setImageResource(@NonNull GlideRequests glideRe transferControlViewStub.setVisibility(View.GONE); playOverlay.setVisibility(View.GONE); - glideRequests.clear(blurHash); + requestManager.clear(blurHash); blurHash.setImageDrawable(null); - glideRequests.clear(image); + requestManager.clear(image); image.setImageDrawable(null); int errorImageResource; @@ -414,10 +413,10 @@ public ListenableFuture setImageResource(@NonNull GlideRequests glideRe boolean resultHandled = false; if (slide.hasPlaceholder() && (previousBlurHash == null || !Objects.equals(slide.getPlaceholderBlur(), previousBlurHash))) { - buildPlaceholderGlideRequest(glideRequests, slide).into(new GlideBitmapListeningTarget(blurHash, result)); + buildPlaceholderRequestBuilder(requestManager, slide).into(new GlideBitmapListeningTarget(blurHash, result)); resultHandled = true; } else if (!slide.hasPlaceholder()) { - glideRequests.clear(blurHash); + requestManager.clear(blurHash); blurHash.setImageDrawable(null); } @@ -425,14 +424,14 @@ public ListenableFuture setImageResource(@NonNull GlideRequests glideRe if (!MediaUtil.isJpegType(slide.getContentType()) && !MediaUtil.isVideoType(slide.getContentType())) { SettableFuture thumbnailFuture = new SettableFuture<>(); thumbnailFuture.deferTo(result); - thumbnailFuture.addListener(new BlurHashClearListener(glideRequests, blurHash)); + thumbnailFuture.addListener(new BlurHashClearListener(requestManager, blurHash)); } - buildThumbnailGlideRequest(glideRequests, slide).into(new GlideDrawableListeningTarget(image, result)); + buildThumbnailRequestBuilder(requestManager, slide).into(new GlideDrawableListeningTarget(image, result)); resultHandled = true; } else { - glideRequests.clear(image); + requestManager.clear(image); image.setImageDrawable(null); } @@ -443,20 +442,20 @@ public ListenableFuture setImageResource(@NonNull GlideRequests glideRe return result; } - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Uri uri) { - return setImageResource(glideRequests, uri, 0, 0); + public ListenableFuture setImageResource(@NonNull RequestManager requestManager, @NonNull Uri uri) { + return setImageResource(requestManager, uri, 0, 0); } - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Uri uri, int width, int height) { - return setImageResource(glideRequests, uri, width, height, true, null); + public ListenableFuture setImageResource(@NonNull RequestManager requestManager, @NonNull Uri uri, int width, int height) { + return setImageResource(requestManager, uri, width, height, true, null); } - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull Uri uri, int width, int height, boolean animate, @Nullable ThumbnailRequestListener listener) { + public ListenableFuture setImageResource(@NonNull RequestManager requestManager, @NonNull Uri uri, int width, int height, boolean animate, @Nullable ThumbnailRequestListener listener) { SettableFuture future = new SettableFuture<>(); transferControlViewStub.setVisibility(View.GONE); - GlideRequest request = glideRequests.load(new DecryptableUri(uri)) + RequestBuilder request = requestManager.load(new DecryptableUri(uri)) .diskCacheStrategy(DiskCacheStrategy.NONE) .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) .listener(listener); @@ -483,12 +482,12 @@ public ListenableFuture setImageResource(@NonNull GlideRequests glideRe return future; } - public ListenableFuture setImageResource(@NonNull GlideRequests glideRequests, @NonNull StoryTextPostModel model, int width, int height) { + public ListenableFuture setImageResource(@NonNull RequestManager requestManager, @NonNull StoryTextPostModel model, int width, int height) { SettableFuture future = new SettableFuture<>(); transferControlViewStub.setVisibility(View.GONE); - GlideRequest request = glideRequests.load(model) + RequestBuilder request = requestManager.load(model) .diskCacheStrategy(DiskCacheStrategy.NONE) .placeholder(model.getPlaceholder()) .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) @@ -502,7 +501,7 @@ public ListenableFuture setImageResource(@NonNull GlideRequests glideRe return future; } - private GlideRequest override(@NonNull GlideRequest request, int width, int height) { + private RequestBuilder override(@NonNull RequestBuilder request, int width, int height) { if (width > 0 && height > 0) { Log.d(TAG, "override: apply w" + width + "xh" + height); return request.override(width, height); @@ -542,8 +541,8 @@ private static boolean hasSameContents(@Nullable Slide slide, @Nullable Slide ot return false; } - private GlideRequest buildThumbnailGlideRequest(@NonNull GlideRequests glideRequests, @NonNull Slide slide) { - GlideRequest request = applySizing(glideRequests.load(new DecryptableUri(Objects.requireNonNull(slide.getUri()))) + private RequestBuilder buildThumbnailRequestBuilder(@NonNull RequestManager requestManager, @NonNull Slide slide) { + RequestBuilder requestBuilder = applySizing(requestManager.load(new DecryptableUri(Objects.requireNonNull(slide.getUri()))) .diskCacheStrategy(DiskCacheStrategy.RESOURCE) .downsample(SignalDownsampleStrategy.CENTER_OUTSIDE_NO_UPSCALE) .transition(withCrossFade())); @@ -551,21 +550,21 @@ private GlideRequest buildThumbnailGlideRequest(@NonNull GlideRequests boolean doNotShowMissingThumbnailImage = Build.VERSION.SDK_INT < 23; if (slide.isInProgress() || doNotShowMissingThumbnailImage) { - return request; + return requestBuilder; } else { - return request.apply(RequestOptions.errorOf(R.drawable.ic_missing_thumbnail_picture)); + return requestBuilder.apply(RequestOptions.errorOf(R.drawable.missing_thumbnail)); } } - public void clear(GlideRequests glideRequests) { - glideRequests.clear(image); + public void clear(RequestManager requestManager) { + requestManager.clear(image); image.setImageDrawable(null); if (transferControlViewStub.resolved()) { transferControlViewStub.get().clear(); } - glideRequests.clear(blurHash); + requestManager.clear(blurHash); blurHash.setImageDrawable(null); slide = null; @@ -594,9 +593,9 @@ public void setRadii(int topLeft, int topRight, int bottomRight, int bottomLeft) } - private RequestBuilder buildPlaceholderGlideRequest(@NonNull GlideRequests glideRequests, @NonNull Slide slide) { - GlideRequest bitmap = glideRequests.asBitmap(); - BlurHash placeholderBlur = slide.getPlaceholderBlur(); + private RequestBuilder buildPlaceholderRequestBuilder(@NonNull RequestManager requestManager, @NonNull Slide slide) { + RequestBuilder bitmap = requestManager.asBitmap(); + BlurHash placeholderBlur = slide.getPlaceholderBlur(); if (placeholderBlur != null) { bitmap = bitmap.load(placeholderBlur); @@ -604,7 +603,7 @@ private RequestBuilder buildPlaceholderGlideRequest(@NonNull GlideReques bitmap = bitmap.load(slide.getPlaceholderRes(getContext().getTheme())); } - final GlideRequest resizedRequest = applySizing(bitmap.diskCacheStrategy(DiskCacheStrategy.NONE)); + final RequestBuilder resizedRequest = applySizing(bitmap.diskCacheStrategy(DiskCacheStrategy.NONE)); if (placeholderBlur != null) { return resizedRequest.centerCrop(); } else { @@ -612,7 +611,7 @@ private RequestBuilder buildPlaceholderGlideRequest(@NonNull GlideReques } } - private GlideRequest applySizing(@NonNull GlideRequest request) { + private RequestBuilder applySizing(@NonNull RequestBuilder request) { int[] size = new int[2]; fillTargetDimensions(size, dimens, bounds); if (size[WIDTH] == 0 && size[HEIGHT] == 0) { @@ -701,23 +700,23 @@ public void onClick(View view) { private static class BlurHashClearListener implements ListenableFuture.Listener { - private final GlideRequests glideRequests; - private final ImageView blurHash; + private final RequestManager requestManager; + private final ImageView blurHash; - private BlurHashClearListener(@NonNull GlideRequests glideRequests, @NonNull ImageView blurHash) { - this.glideRequests = glideRequests; - this.blurHash = blurHash; + private BlurHashClearListener(@NonNull RequestManager requestManager, @NonNull ImageView blurHash) { + this.requestManager = requestManager; + this.blurHash = blurHash; } @Override public void onSuccess(Boolean result) { - glideRequests.clear(blurHash); + requestManager.clear(blurHash); blurHash.setImageDrawable(null); } @Override public void onFailure(ExecutionException e) { - glideRequests.clear(blurHash); + requestManager.clear(blurHash); blurHash.setImageDrawable(null); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java index 82622774f1..f1e9f7510f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/TooltipPopup.java @@ -18,13 +18,13 @@ import androidx.annotation.StringRes; import androidx.core.content.ContextCompat; +import com.bumptech.glide.Glide; import com.google.android.material.shape.MaterialShapeDrawable; import com.google.android.material.shape.ShapeAppearanceModel; import org.signal.core.util.DimensionUnit; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mms.GlideApp; /** * Class for creating simple tooltips to show throughout the app. Utilizes a popup window so you @@ -101,7 +101,7 @@ private TooltipPopup(@NonNull View anchor, if (iconGlideModel != null) { ImageView iconView = getContentView().findViewById(R.id.tooltip_icon); iconView.setVisibility(View.VISIBLE); - GlideApp.with(anchor.getContext()).load(iconGlideModel).into(iconView); + Glide.with(anchor.getContext()).load(iconGlideModel).into(iconView); } setElevation(10); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java index 4025a8c872..eee2ad1d67 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ZoomingImageView.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import androidx.exifinterface.media.ExifInterface; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.Target; import com.davemorrissey.labs.subscaleview.ImageSource; @@ -23,7 +24,6 @@ import org.thoughtcrime.securesms.components.subsampling.AttachmentBitmapDecoder; import org.thoughtcrime.securesms.components.subsampling.AttachmentRegionDecoder; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.util.ActionRequestListener; import org.thoughtcrime.securesms.util.BitmapDecodingException; @@ -81,7 +81,7 @@ public ZoomingImageView(Context context, AttributeSet attrs, int defStyleAttr) { } @SuppressLint("StaticFieldLeak") - public void setImageUri(@NonNull GlideRequests glideRequests, @NonNull Uri uri, @NonNull String contentType, @NonNull Runnable onMediaReady) + public void setImageUri(@NonNull RequestManager requestManager, @NonNull Uri uri, @NonNull String contentType, @NonNull Runnable onMediaReady) { final Context context = getContext(); final int maxTextureSize = BitmapUtil.getMaxTextureSize(); @@ -103,7 +103,7 @@ public void setImageUri(@NonNull GlideRequests glideRequests, @NonNull Uri uri, if (dimensions == null || (dimensions.first <= maxTextureSize && dimensions.second <= maxTextureSize)) { Log.i(TAG, "Loading in standard image view..."); - setImageViewUri(glideRequests, uri, onMediaReady); + setImageViewUri(requestManager, uri, onMediaReady); } else { Log.i(TAG, "Loading in subsampling image view..."); setSubsamplingImageViewUri(uri); @@ -112,11 +112,11 @@ public void setImageUri(@NonNull GlideRequests glideRequests, @NonNull Uri uri, }); } - private void setImageViewUri(@NonNull GlideRequests glideRequests, @NonNull Uri uri, @NonNull Runnable onMediaReady) { + private void setImageViewUri(@NonNull RequestManager requestManager, @NonNull Uri uri, @NonNull Runnable onMediaReady) { photoView.setVisibility(View.VISIBLE); subsamplingImageView.setVisibility(View.GONE); - glideRequests.load(new DecryptableUri(uri)) + requestManager.load(new DecryptableUri(uri)) .diskCacheStrategy(DiskCacheStrategy.NONE) .dontTransform() .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java index 136dbfb371..d44efa9c37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/emoji/EmojiTextView.java @@ -32,6 +32,7 @@ import androidx.core.view.ViewKt; import androidx.core.widget.TextViewCompat; +import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.emoji.parsing.EmojiParser; import org.thoughtcrime.securesms.components.mention.MentionAnnotation; @@ -73,6 +74,7 @@ public class EmojiTextView extends AppCompatTextView { private boolean isJumbomoji; private boolean forceJumboEmoji; private boolean renderSpoilers; + private boolean shrinkWrap; private MentionRendererDelegate mentionRendererDelegate; private SpoilerRendererDelegate spoilerRendererDelegate; @@ -96,6 +98,7 @@ public EmojiTextView(Context context, AttributeSet attrs, int defStyleAttr) { measureLastLine = a.getBoolean(R.styleable.EmojiTextView_measureLastLine, false); forceJumboEmoji = a.getBoolean(R.styleable.EmojiTextView_emoji_forceJumbo, false); renderSpoilers = a.getBoolean(R.styleable.EmojiTextView_emoji_renderSpoilers, false); + shrinkWrap = a.getBoolean(R.styleable.EmojiTextView_emoji_shrinkWrap, false); a.recycle(); a = context.obtainStyledAttributes(attrs, new int[] { android.R.attr.textSize }); @@ -224,6 +227,25 @@ private boolean isEllipsizedAtEnd() { widthMeasureSpec = applyWidthMeasureRoundingFix(widthMeasureSpec); super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int mode = MeasureSpec.getMode(widthMeasureSpec); + if (shrinkWrap && getLayout() != null && mode == MeasureSpec.AT_MOST) { + Layout layout = getLayout(); + + float maxLineWidth = 0f; + for (int i = 0; i < layout.getLineCount(); i++) { + if (layout.getLineWidth(i) > maxLineWidth) { + maxLineWidth = layout.getLineWidth(i); + } + } + + int desiredWidth = (int) maxLineWidth + getPaddingLeft() + getPaddingRight(); + if (getMeasuredWidth() > desiredWidth) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec(desiredWidth, mode); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + CharSequence text = getText(); if (getLayout() == null || !measureLastLine || text == null || text.length() == 0) { lastLineWidth = -1; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java index 435a1ba6f0..c540c86ff3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UntrustedSendDialog.java @@ -32,7 +32,7 @@ public UntrustedSendDialog(@NonNull Context context, this.resendListener = resendListener; setTitle(R.string.UntrustedSendDialog_send_message); - setIcon(R.drawable.ic_warning); + setIcon(R.drawable.symbol_error_triangle_fill_24); setMessage(message); setPositiveButton(R.string.UntrustedSendDialog_send, this); setNegativeButton(android.R.string.cancel, null); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java index 70324e3f60..5216663fb3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/identity/UnverifiedSendDialog.java @@ -31,7 +31,7 @@ public UnverifiedSendDialog(@NonNull Context context, this.resendListener = resendListener; setTitle(R.string.UnverifiedSendDialog_send_message); - setIcon(R.drawable.ic_warning); + setIcon(R.drawable.symbol_error_triangle_fill_24); setMessage(message); setPositiveButton(R.string.UnverifiedSendDialog_send, this); setNegativeButton(android.R.string.cancel, null); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java b/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java index 595dd2ee28..2a1cea56d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/location/SignalMapView.java @@ -17,11 +17,11 @@ import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import java.util.concurrent.ExecutionException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java b/app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java index 2ec03fa1b6..f53ffd4786 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/registration/VerificationPinKeyboard.java @@ -18,11 +18,11 @@ import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.NumericKeyboardView; import org.thoughtcrime.securesms.util.ViewUtil; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; public class VerificationPinKeyboard extends FrameLayout { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt index 093b99f83f..0aa6639d6b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt @@ -38,6 +38,7 @@ import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.views.Stub +import org.thoughtcrime.securesms.util.visible class AppSettingsFragment : DSLSettingsFragment( titleId = R.string.text_secure_normal__menu_settings, @@ -199,7 +200,7 @@ class AppSettingsFragment : DSLSettingsFragment( clickPref( title = DSLSettingsText.from(R.string.preferences__privacy), - icon = DSLSettingsIcon.from(R.drawable.symbol_lock_24), + icon = DSLSettingsIcon.from(R.drawable.symbol_lock_white_48), onClick = { findNavController().safeNavigate(R.id.action_appSettingsFragment_to_privacySettingsFragment) }, @@ -281,6 +282,7 @@ class AppSettingsFragment : DSLSettingsFragment( private val aboutView: EmojiTextView = itemView.findViewById(R.id.about) private val badgeView: BadgeImageView = itemView.findViewById(R.id.badge) private val qrButton: View = itemView.findViewById(R.id.qr_button) + private val usernameView: TextView = itemView.findViewById(R.id.username) init { aboutView.setOverflowText(" ") @@ -293,6 +295,8 @@ class AppSettingsFragment : DSLSettingsFragment( titleView.text = model.recipient.profileName.toString() summaryView.text = PhoneNumberFormatter.prettyPrint(model.recipient.requireE164()) + usernameView.text = model.recipient.username.orElse("") + usernameView.visible = model.recipient.username.isPresent avatarView.setRecipient(Recipient.self()) badgeView.setBadgeFromRecipient(Recipient.self()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt index e736c76c07..83bb063b79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberLockActivity.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.components.settings.app.changenumber +import android.annotation.SuppressLint import android.content.Context import android.content.Intent import android.os.Bundle @@ -47,6 +48,7 @@ class ChangeNumberLockActivity : PassphraseRequiredActivity() { dynamicTheme.onResume(this) } + @SuppressLint("MissingSuperCall") override fun onBackPressed() = Unit private fun checkWhoAmI() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt index fe5ac7ca69..f9c9a1f149 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/changenumber/ChangeNumberRepository.kt @@ -233,6 +233,7 @@ class ChangeNumberRepository( SignalStore.account().setE164(e164) SignalStore.account().setPni(pni) + ApplicationDependencies.resetProtocolStores() ApplicationDependencies.getGroupsV2Authorization().clear() @@ -250,6 +251,7 @@ class ChangeNumberRepository( val pniIdentityKeyPair = IdentityKeyPair(metadata.pniIdentityKeyPair.toByteArray()) val pniRegistrationId = metadata.pniRegistrationId val pniSignedPreyKeyId = metadata.pniSignedPreKeyId + val pniLastResortKyberPreKeyId = metadata.pniLastResortKyberPreKeyId val pniProtocolStore = ApplicationDependencies.getProtocolStore().pni() val pniMetadataStore = SignalStore.account().pniPreKeys @@ -258,16 +260,22 @@ class ChangeNumberRepository( SignalStore.account().setPniIdentityKeyAfterChangeNumber(pniIdentityKeyPair) val signedPreKey = pniProtocolStore.loadSignedPreKey(pniSignedPreyKeyId) - val oneTimePreKeys = PreKeyUtil.generateAndStoreOneTimeEcPreKeys(pniProtocolStore, pniMetadataStore) + val oneTimeEcPreKeys = PreKeyUtil.generateAndStoreOneTimeEcPreKeys(pniProtocolStore, pniMetadataStore) + val lastResortKyberPreKey = pniProtocolStore.loadLastResortKyberPreKeys().firstOrNull { it.id == pniLastResortKyberPreKeyId } + val oneTimeKyberPreKeys = PreKeyUtil.generateAndStoreOneTimeKyberPreKeys(pniProtocolStore, pniMetadataStore) + + if (lastResortKyberPreKey == null) { + Log.w(TAG, "Last-resort kyber prekey is missing!") + } pniMetadataStore.activeSignedPreKeyId = signedPreKey.id accountManager.setPreKeys( PreKeyUpload( serviceIdType = ServiceIdType.PNI, signedPreKey = signedPreKey, - oneTimeEcPreKeys = oneTimePreKeys, - lastResortKyberPreKey = null, - oneTimeKyberPreKeys = null + oneTimeEcPreKeys = oneTimeEcPreKeys, + lastResortKyberPreKey = lastResortKyberPreKey, + oneTimeKyberPreKeys = oneTimeKyberPreKeys ) ) pniMetadataStore.isSignedPreKeyRegistered = true @@ -394,7 +402,8 @@ class ChangeNumberRepository( previousPni = SignalStore.account().pni!!.toByteString(), pniIdentityKeyPair = pniIdentity.serialize().toByteString(), pniRegistrationId = pniRegistrationIds[primaryDeviceId]!!, - pniSignedPreKeyId = devicePniSignedPreKeys[primaryDeviceId]!!.keyId + pniSignedPreKeyId = devicePniSignedPreKeys[primaryDeviceId]!!.keyId, + pniLastResortKyberPreKeyId = devicePniLastResortKyberPreKeys[primaryDeviceId]!!.keyId ) return ChangeNumberRequestData(request, metadata) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsState.kt index 0f05b4f0d6..f47f48d11a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsState.kt @@ -6,5 +6,5 @@ data class ChatsSettingsState( val keepMutedChatsArchived: Boolean, val useSystemEmoji: Boolean, val enterKeySends: Boolean, - val chatBackupsEnabled: Boolean, + val chatBackupsEnabled: Boolean ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsViewModel.kt index c8d465bdf0..d6557edb19 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/chats/ChatsSettingsViewModel.kt @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.components.settings.app.chats import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel -import io.reactivex.rxjava3.disposables.CompositeDisposable import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.util.BackupUtil @@ -11,11 +10,10 @@ import org.thoughtcrime.securesms.util.ThrottledDebouncer import org.thoughtcrime.securesms.util.livedata.Store class ChatsSettingsViewModel @JvmOverloads constructor( - private val repository: ChatsSettingsRepository = ChatsSettingsRepository(), + private val repository: ChatsSettingsRepository = ChatsSettingsRepository() ) : ViewModel() { private val refreshDebouncer = ThrottledDebouncer(500L) - private val disposables = CompositeDisposable() private val store: Store = Store( ChatsSettingsState( @@ -24,16 +22,12 @@ class ChatsSettingsViewModel @JvmOverloads constructor( keepMutedChatsArchived = SignalStore.settings().shouldKeepMutedChatsArchived(), useSystemEmoji = SignalStore.settings().isPreferSystemEmoji, enterKeySends = SignalStore.settings().isEnterKeySends, - chatBackupsEnabled = SignalStore.settings().isBackupEnabled && BackupUtil.canUserAccessBackupDirectory(ApplicationDependencies.getApplication()), + chatBackupsEnabled = SignalStore.settings().isBackupEnabled && BackupUtil.canUserAccessBackupDirectory(ApplicationDependencies.getApplication()) ) ) val state: LiveData = store.stateLiveData - override fun onCleared() { - disposables.clear() - } - fun setGenerateLinkPreviewsEnabled(enabled: Boolean) { if (SignalStore.account().isLinkedDevice) { return diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt index e8ff5e4467..e519242972 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsFragment.kt @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.components.settings.app.privacy.pnp +import android.content.res.Configuration import android.os.Bundle import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box @@ -18,6 +19,7 @@ import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.dimensionResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.fragment.app.viewModels import androidx.lifecycle.lifecycleScope @@ -27,6 +29,7 @@ import org.signal.core.ui.Dividers import org.signal.core.ui.Rows import org.signal.core.ui.Scaffolds import org.signal.core.ui.Texts +import org.signal.core.ui.theme.SignalTheme import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.compose.StatusBarColorNestedScrollConnection @@ -49,118 +52,179 @@ class PhoneNumberPrivacySettingsFragment : ComposeFragment() { @Composable override fun FragmentContent() { val state: PhoneNumberPrivacySettingsState by viewModel.state - val onNavigationClick: () -> Unit = remember { - { findNavController().popBackStack() } - } - val snackbarHostState = remember { SnackbarHostState() } - - Scaffolds.Settings( - title = stringResource(id = R.string.preferences_app_protection__phone_number), - onNavigationClick = onNavigationClick, - navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), - navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close), - snackbarHost = { - SnackbarHost(snackbarHostState) - }, - modifier = Modifier.nestedScroll(statusBarNestedScrollConnection) - ) { contentPadding -> - Box(modifier = Modifier.padding(contentPadding)) { - LazyColumn { - item { - Texts.SectionHeader( - text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__who_can_see_my_number) + val snackbarMessage = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__to_change_this_setting) + + Screen( + state = state, + snackbarHostState = snackbarHostState, + onNavigationClick = { findNavController().popBackStack() }, + statusBarNestedScrollConnection = statusBarNestedScrollConnection, + onEveryoneCanSeeMyNumberClicked = viewModel::setEveryoneCanSeeMyNumber, + onNobodyCanSeeMyNumberClicked = viewModel::setNobodyCanSeeMyNumber, + onEveryoneCanFindMeByNumberClicked = viewModel::setEveryoneCanFindMeByMyNumber, + onNobodyCanFindMeByNumberClicked = { + if (!state.phoneNumberSharing) { + viewModel.setNobodyCanFindMeByMyNumber() + } else { + lifecycleScope.launch { + snackbarHostState.showSnackbar( + message = snackbarMessage, + duration = SnackbarDuration.Short ) } + } + } + ) + } +} - item { - Rows.RadioRow( - selected = state.phoneNumberSharing, - text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), - modifier = Modifier.clickable(onClick = viewModel::setEveryoneCanSeeMyNumber) - ) - } +@Composable +private fun Screen( + state: PhoneNumberPrivacySettingsState, + snackbarHostState: SnackbarHostState = SnackbarHostState(), + onNavigationClick: () -> Unit = {}, + statusBarNestedScrollConnection: StatusBarColorNestedScrollConnection? = null, + onEveryoneCanSeeMyNumberClicked: () -> Unit = {}, + onNobodyCanSeeMyNumberClicked: () -> Unit = {}, + onEveryoneCanFindMeByNumberClicked: () -> Unit = {}, + onNobodyCanFindMeByNumberClicked: () -> Unit = {} +) { + Scaffolds.Settings( + title = stringResource(id = R.string.preferences_app_protection__phone_number), + onNavigationClick = onNavigationClick, + navigationIconPainter = painterResource(id = R.drawable.ic_arrow_left_24), + navigationContentDescription = stringResource(id = R.string.Material3SearchToolbar__close), + snackbarHost = { + SnackbarHost(snackbarHostState) + }, + modifier = statusBarNestedScrollConnection?.let { Modifier.nestedScroll(it) } ?: Modifier + ) { contentPadding -> + Box(modifier = Modifier.padding(contentPadding)) { + LazyColumn { + item { + Texts.SectionHeader( + text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment_who_can_see_my_number_heading) + ) + } - item { - Rows.RadioRow( - selected = !state.phoneNumberSharing, - text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), - modifier = Modifier.clickable(onClick = viewModel::setNobodyCanSeeMyNumber) - ) - } + item { + Rows.RadioRow( + selected = state.phoneNumberSharing, + text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), + modifier = Modifier.clickable(onClick = onEveryoneCanSeeMyNumberClicked) + ) + } + + item { + Rows.RadioRow( + selected = !state.phoneNumberSharing, + text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), + modifier = Modifier.clickable(onClick = onNobodyCanSeeMyNumberClicked) + ) + } - item { - Text( - text = stringResource( - id = if (state.phoneNumberSharing) { - R.string.PhoneNumberPrivacySettingsFragment__your_phone_number + item { + Text( + text = stringResource( + id = if (state.phoneNumberSharing) { + R.string.PhoneNumberPrivacySettingsFragment_sharing_on_description + } else { + if (state.discoverableByPhoneNumber) { + R.string.PhoneNumberPrivacySettingsFragment_sharing_off_discovery_on_description } else { - R.string.PhoneNumberPrivacySettingsFragment__nobody_will_see_your + R.string.PhoneNumberPrivacySettingsFragment_sharing_off_discovery_off_description } - ), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) - ) - } + } + ), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) + ) + } - item { - Dividers.Default() - } + item { + Dividers.Default() + } - item { - Texts.SectionHeader(text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__who_can_find_me_by_number)) - } + item { + Texts.SectionHeader(text = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment_who_can_find_me_by_number_heading)) + } - item { - Rows.RadioRow( - selected = state.discoverableByPhoneNumber, - text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), - modifier = Modifier.clickable(onClick = viewModel::setEveryoneCanFindMeByMyNumber) - ) - } + item { + Rows.RadioRow( + selected = state.discoverableByPhoneNumber, + text = stringResource(id = R.string.PhoneNumberPrivacy_everyone), + modifier = Modifier.clickable(onClick = onEveryoneCanFindMeByNumberClicked) + ) + } - item { - val snackbarMessage = stringResource(id = R.string.PhoneNumberPrivacySettingsFragment__to_change_this_setting) - val onClick: () -> Unit = remember(state.phoneNumberSharing) { - if (!state.phoneNumberSharing) { - { viewModel.setNobodyCanFindMeByMyNumber() } + item { + Rows.RadioRow( + enabled = !state.phoneNumberSharing, + selected = !state.discoverableByPhoneNumber, + text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), + modifier = Modifier.clickable(onClick = onNobodyCanFindMeByNumberClicked) + ) + } + + item { + Text( + text = stringResource( + id = if (state.discoverableByPhoneNumber) { + R.string.PhoneNumberPrivacySettingsFragment_discovery_on_description } else { - { - lifecycleScope.launch { - snackbarHostState.showSnackbar( - message = snackbarMessage, - duration = SnackbarDuration.Short - ) - } - } + R.string.PhoneNumberPrivacySettingsFragment_discovery_off_description } - } - - Rows.RadioRow( - enabled = !state.phoneNumberSharing, - selected = !state.discoverableByPhoneNumber, - text = stringResource(id = R.string.PhoneNumberPrivacy_nobody), - modifier = Modifier.clickable(onClick = onClick) - ) - } - - item { - Text( - text = stringResource( - id = if (state.discoverableByPhoneNumber) { - R.string.PhoneNumberPrivacySettingsFragment__anyone_who_has - } else { - R.string.PhoneNumberPrivacySettingsFragment__nobody_will_be_able_to_see - } - ), - style = MaterialTheme.typography.bodyMedium, - color = MaterialTheme.colorScheme.onSurfaceVariant, - modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) - ) - } + ), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter), vertical = 16.dp) + ) } } } } } + +@Preview(name = "Light Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewSharingAndDiscoverable() { + SignalTheme { + Screen( + state = PhoneNumberPrivacySettingsState( + phoneNumberSharing = true, + discoverableByPhoneNumber = true + ) + ) + } +} + +@Preview(name = "Light Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewNotSharingDiscoverable() { + SignalTheme { + Screen( + state = PhoneNumberPrivacySettingsState( + phoneNumberSharing = false, + discoverableByPhoneNumber = true + ) + ) + } +} + +@Preview(name = "Light Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "Screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewNotSharingNotDiscoverable() { + SignalTheme { + Screen( + state = PhoneNumberPrivacySettingsState( + phoneNumberSharing = false, + discoverableByPhoneNumber = false + ) + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt index 41ac2988f6..aab55da528 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/UsernameQrCodeColorScheme.kt @@ -8,6 +8,7 @@ import androidx.compose.ui.graphics.Color enum class UsernameQrCodeColorScheme( val borderColor: Color, val foregroundColor: Color, + val backgroundColor: Color, val textColor: Color = Color.White, val outlineColor: Color = Color.Transparent, private val key: String @@ -15,11 +16,13 @@ enum class UsernameQrCodeColorScheme( Blue( borderColor = Color(0xFF506ECD), foregroundColor = Color(0xFF2449C0), + backgroundColor = Color(0xFFEDF0FA), key = "blue" ), White( borderColor = Color(0xFFFFFFFF), foregroundColor = Color(0xFF000000), + backgroundColor = Color(0xFFF5F5F5), textColor = Color.Black, outlineColor = Color(0xFFE9E9E9), key = "white" @@ -27,31 +30,37 @@ enum class UsernameQrCodeColorScheme( Grey( borderColor = Color(0xFF6A6C74), foregroundColor = Color(0xFF464852), + backgroundColor = Color(0xFFF0F0F1), key = "grey" ), Tan( borderColor = Color(0xFFBBB29A), foregroundColor = Color(0xFF73694F), + backgroundColor = Color(0xFFF6F5F2), key = "tan" ), Green( borderColor = Color(0xFF97AA89), foregroundColor = Color(0xFF55733F), + backgroundColor = Color(0xFFF2F5F0), key = "green" ), Orange( borderColor = Color(0xFFDE7134), foregroundColor = Color(0xFFDA6C2E), + backgroundColor = Color(0xFFFCF1EB), key = "orange" ), Pink( borderColor = Color(0xFFEA7B9D), foregroundColor = Color(0xFFBB617B), + backgroundColor = Color(0xFFFCF1F5), key = "pink" ), Purple( borderColor = Color(0xFF9E7BE9), foregroundColor = Color(0xFF7651C5), + backgroundColor = Color(0xFFF5F3FA), key = "purple" ); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt index d843718e39..66bd4efcd1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt @@ -23,7 +23,6 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Scaffold -import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Surface import androidx.compose.material3.Text @@ -56,6 +55,7 @@ import com.google.accompanist.permissions.rememberPermissionState import kotlinx.coroutines.CoroutineScope import org.signal.core.ui.Buttons import org.signal.core.ui.Dialogs +import org.signal.core.ui.Snackbars import org.signal.core.ui.theme.SignalTheme import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R @@ -89,7 +89,9 @@ class UsernameLinkSettingsFragment : ComposeFragment() { val navController: NavController by remember { mutableStateOf(findNavController()) } var showResetDialog: Boolean by remember { mutableStateOf(false) } val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() - val cameraPermissionState: PermissionState = rememberPermissionState(permission = android.Manifest.permission.CAMERA) + val cameraPermissionState: PermissionState = rememberPermissionState(permission = android.Manifest.permission.CAMERA) { + viewModel.onTabSelected(ActiveTab.Scan) + } val linkCopiedEvent: UUID? by viewModel.linkCopiedEvent val linkCopiedString = stringResource(R.string.UsernameLinkSettings_link_copied_toast) @@ -101,7 +103,7 @@ class UsernameLinkSettingsFragment : ComposeFragment() { } Scaffold( - snackbarHost = { SnackbarHost(hostState = snackbarHostState) }, + snackbarHost = { Snackbars.Host(snackbarHostState) }, topBar = { TopAppBarContent( activeTab = state.activeTab, @@ -123,6 +125,7 @@ class UsernameLinkSettingsFragment : ComposeFragment() { enter = slideInHorizontally(initialOffsetX = { fullWidth -> -fullWidth }), exit = slideOutHorizontally(targetOffsetX = { fullWidth -> -fullWidth }) ) { + val helpText = stringResource(id = R.string.UsernameLinkSettings_scan_this_qr_code) UsernameLinkShareScreen( state = state, snackbarHostState = snackbarHostState, @@ -130,7 +133,7 @@ class UsernameLinkSettingsFragment : ComposeFragment() { modifier = Modifier.padding(contentPadding), navController = navController, onShareBadge = { - shareQrBadge(viewModel.generateQrCodeImage()) + shareQrBadge(viewModel.generateQrCodeImage(helpText)) }, onResetClicked = { showResetDialog = true }, onLinkResultHandled = { viewModel.onUsernameLinkResetResultHandled() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt index 2dad371ae9..b902f04d56 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsViewModel.kt @@ -10,6 +10,9 @@ import android.graphics.Rect import android.graphics.RectF import android.graphics.Typeface import android.os.Build +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint import androidx.compose.runtime.MutableState import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf @@ -17,8 +20,10 @@ import androidx.compose.ui.geometry.Size import androidx.compose.ui.graphics.Canvas import androidx.compose.ui.graphics.drawscope.CanvasDrawScope import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.graphics.withSave import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.LayoutDirection +import androidx.core.graphics.withTranslation import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Single @@ -122,7 +127,9 @@ class UsernameLinkSettingsViewModel : ViewModel() { val components: Optional = when (result) { is UsernameLinkResetResult.Success -> Optional.of(result.components) is UsernameLinkResetResult.NetworkError -> Optional.empty() - else -> { usernameLink.value ?: Optional.empty() } + else -> { + usernameLink.value ?: Optional.empty() + } } _state.value = _state.value.copy( @@ -200,7 +207,7 @@ class UsernameLinkSettingsViewModel : ViewModel() { * * I hate this as much as you do. */ - fun generateQrCodeImage(): Bitmap? { + fun generateQrCodeImage(helpText: String): Bitmap? { val state: UsernameLinkSettingsState = _state.value if (state.qrCodeState !is QrCodeState.Present) { @@ -210,12 +217,23 @@ class UsernameLinkSettingsViewModel : ViewModel() { val qrCodeData: QrCodeData = state.qrCodeState.data - val width = 480 - val height = 525 - val qrSize = 300f - val qrPadding = 25f - val borderSizeX = 64f - val borderSizeY = 52f + val scaleFactor = 2 + val width = 424 * scaleFactor + val height = 576 * scaleFactor + val backgroundPadHorizontal = 64f * scaleFactor + val backgroundPadVertical = 80f * scaleFactor + val qrBorderWidth = width - (backgroundPadHorizontal * 2) + val qrBorderHeight = 324f * scaleFactor + val qrBorderRadius = 30f * scaleFactor + val qrSize = 184f * scaleFactor + val qrPadding = 16f * scaleFactor + val borderSizeX = 40f * scaleFactor + val borderSizeY = 32f * scaleFactor + val helpTextHorizontalPad = 72 * scaleFactor + val helpTextVerticalPad = 444f * scaleFactor + val helpTextSize = 14f * scaleFactor + val usernameVerticalPad = 348f * scaleFactor + val usernameTextSize = 20f * scaleFactor val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888).apply { eraseColor(Color.TRANSPARENT) @@ -225,43 +243,51 @@ class UsernameLinkSettingsViewModel : ViewModel() { val composeCanvas = Canvas(androidCanvas) val canvasDrawScope = CanvasDrawScope() - // Draw the background - androidCanvas.drawRoundRect(0f, 0f, width.toFloat(), height.toFloat(), 30f, 30f, Paint().apply { color = state.qrCodeColorScheme.borderColor.toArgb() }) - androidCanvas.drawRoundRect(borderSizeX, borderSizeY, borderSizeX + qrSize + qrPadding * 2, borderSizeY + qrSize + qrPadding * 2, 15f, 15f, Paint().apply { color = Color.WHITE }) - androidCanvas.drawRoundRect( - borderSizeX, - borderSizeY, - borderSizeX + qrSize + qrPadding * 2, - borderSizeY + qrSize + qrPadding * 2, - 15f, - 15f, - Paint().apply { - color = state.qrCodeColorScheme.outlineColor.toArgb() - style = Paint.Style.STROKE - strokeWidth = 4f - } - ) - - // Draw the QR code - composeCanvas.translate((width / 2) - (qrSize / 2), 80f) - canvasDrawScope.draw( - density = object : Density { - override val density: Float = 1f - override val fontScale: Float = 1f - }, - layoutDirection = LayoutDirection.Ltr, - canvas = composeCanvas, - size = Size(qrSize, qrSize) - ) { - drawQr( - data = qrCodeData, - foregroundColor = state.qrCodeColorScheme.foregroundColor, - backgroundColor = state.qrCodeColorScheme.borderColor, - deadzonePercent = 0.35f, - logo = null + // Background + androidCanvas.drawColor(state.qrCodeColorScheme.backgroundColor.toArgb()) + + // QR Border + androidCanvas.withTranslation(x = backgroundPadHorizontal, y = backgroundPadVertical) { + drawRoundRect(0f, 0f, qrBorderWidth, qrBorderHeight, qrBorderRadius, qrBorderRadius, Paint().apply { color = state.qrCodeColorScheme.borderColor.toArgb() }) + + drawRoundRect(borderSizeX, borderSizeY, borderSizeX + qrSize + qrPadding * 2, borderSizeY + qrSize + qrPadding * 2, 15f, 15f, Paint().apply { color = Color.WHITE }) + drawRoundRect( + borderSizeX, + borderSizeY, + borderSizeX + qrSize + qrPadding * 2, + borderSizeY + qrSize + qrPadding * 2, + 15f * scaleFactor, + 15f * scaleFactor, + Paint().apply { + color = state.qrCodeColorScheme.outlineColor.toArgb() + style = Paint.Style.STROKE + strokeWidth = 4f + } ) + + // Draw the QR code + composeCanvas.withSave { + composeCanvas.translate((qrBorderWidth / 2) - (qrSize / 2), borderSizeY + qrPadding) + + canvasDrawScope.draw( + density = object : Density { + override val density: Float = 1f + override val fontScale: Float = 1f + }, + layoutDirection = LayoutDirection.Ltr, + canvas = composeCanvas, + size = Size(qrSize, qrSize) + ) { + drawQr( + data = qrCodeData, + foregroundColor = state.qrCodeColorScheme.foregroundColor, + backgroundColor = state.qrCodeColorScheme.borderColor, + deadzonePercent = 0.35f, + logo = null + ) + } + } } - composeCanvas.translate(-90f, -80f) // Draw the signal logo -- unfortunately can't have the normal QR code drawing handle it because it requires a composable ImageBitmap BitmapFactory.decodeResource(ApplicationDependencies.getApplication().resources, R.drawable.qrcode_logo).also { logoBitmap -> @@ -269,14 +295,18 @@ class UsernameLinkSettingsViewModel : ViewModel() { colorFilter = PorterDuffColorFilter(state.qrCodeColorScheme.foregroundColor.toArgb(), PorterDuff.Mode.SRC_IN) } val sourceRect = Rect(0, 0, logoBitmap.width, logoBitmap.height) - val destRect = RectF(210f, 200f, 270f, 260f) + + val logoSize = 36f * scaleFactor + val destLeft = (width / 2f) - (logoSize / 2f) + val destTop = destLeft - (10f * scaleFactor) + (logoSize / 2f) + val destRect = RectF(destLeft, destTop, destLeft + logoSize, destTop + logoSize) androidCanvas.drawBitmap(logoBitmap, sourceRect, destRect, tintedPaint) } - // Draw the text - val textPaint = Paint().apply { + // Draw the username + val usernamePaint = Paint().apply { color = state.qrCodeColorScheme.textColor.toArgb() - textSize = 34f + textSize = usernameTextSize typeface = if (Build.VERSION.SDK_INT < 26) { Typeface.DEFAULT_BOLD } else { @@ -286,10 +316,32 @@ class UsernameLinkSettingsViewModel : ViewModel() { .build() } } - val textBounds = Rect() - textPaint.getTextBounds(state.username, 0, state.username.length, textBounds) + val usernameBounds = Rect() + usernamePaint.getTextBounds(state.username, 0, state.username.length, usernameBounds) - androidCanvas.drawText(state.username, (width / 2f) - (textBounds.width() / 2f), 465f, textPaint) + androidCanvas.drawText(state.username, (width / 2f) - (usernameBounds.width() / 2f), usernameVerticalPad + usernameBounds.height(), usernamePaint) + + // Draw the help text + val helpTextPaint = TextPaint().apply { + isAntiAlias = true + color = 0xFF3C3C43.toInt() + textSize = helpTextSize + typeface = if (Build.VERSION.SDK_INT < 26) { + Typeface.DEFAULT + } else { + Typeface.Builder("") + .setFallback("sans-serif") + .setWeight(400) + .build() + } + } + + val maxWidth = width - helpTextHorizontalPad * 2 + val helpTextLayout = StaticLayout(helpText, helpTextPaint, maxWidth, Layout.Alignment.ALIGN_CENTER, 1f, 0f, true) + + androidCanvas.withTranslation(x = helpTextHorizontalPad.toFloat(), y = helpTextVerticalPad) { + helpTextLayout.draw(androidCanvas) + } return bitmap } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt index 903b114239..e27bb57846 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt @@ -93,21 +93,18 @@ fun UsernameLinkShareScreen( ButtonBar( onShareClicked = onShareBadge, - onColorClicked = { navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkQrColorPickerFragment()) } - ) - - LinkRow( - linkState = state.usernameLinkState, - onClick = { + onColorClicked = { navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkQrColorPickerFragment()) }, + onLinkClicked = { navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkShareBottomSheet()) - } + }, + linkState = state.usernameLinkState ) Text( text = stringResource(id = R.string.UsernameLinkSettings_qr_description), textAlign = TextAlign.Center, style = MaterialTheme.typography.bodyMedium, - modifier = Modifier.padding(bottom = 19.dp, start = 43.dp, end = 43.dp), + modifier = Modifier.padding(top = 42.dp, bottom = 19.dp, start = 43.dp, end = 43.dp), color = MaterialTheme.colorScheme.onSurfaceVariant ) @@ -127,11 +124,22 @@ fun UsernameLinkShareScreen( } @Composable -private fun ButtonBar(onShareClicked: () -> Unit, onColorClicked: () -> Unit) { +private fun ButtonBar( + linkState: UsernameLinkState, + onLinkClicked: () -> Unit, + onShareClicked: () -> Unit, + onColorClicked: () -> Unit +) { Row( horizontalArrangement = Arrangement.spacedBy(space = 32.dp, alignment = Alignment.CenterHorizontally), modifier = Modifier.fillMaxWidth() ) { + Buttons.ActionButton( + enabled = linkState is UsernameLinkState.Present, + onClick = onLinkClicked, + iconResId = R.drawable.symbol_link_24, + labelResId = R.string.UsernameLinkSettings_link_button_label + ) Buttons.ActionButton( onClick = onShareClicked, iconResId = R.drawable.symbol_share_android_24, diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index d14f21a96a..09904e5cc8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -28,7 +28,9 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.core.util.DimensionUnit +import org.signal.core.util.Result import org.signal.core.util.concurrent.LifecycleDisposable +import org.signal.core.util.concurrent.addTo import org.signal.core.util.getParcelableArrayListExtraCompat import org.thoughtcrime.securesms.AvatarPreviewActivity import org.thoughtcrime.securesms.BlockUnblockDialog @@ -73,6 +75,7 @@ import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupInviteSentD import org.thoughtcrime.securesms.groups.ui.managegroup.dialogs.GroupsLearnMoreBottomSheetDialogFragment import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory +import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository import org.thoughtcrime.securesms.profiles.edit.CreateProfileActivity import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientExporter @@ -112,17 +115,17 @@ class ConversationSettingsFragment : DSLSettingsFragment( private val alertTint by lazy { ContextCompat.getColor(requireContext(), R.color.signal_alert_primary) } private val alertDisabledTint by lazy { ContextCompat.getColor(requireContext(), R.color.signal_alert_primary_50) } private val blockIcon by lazy { - ContextUtil.requireDrawable(requireContext(), R.drawable.ic_block_tinted_24).apply { + ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_block_24).apply { colorFilter = PorterDuffColorFilter(alertTint, PorterDuff.Mode.SRC_IN) } } private val unblockIcon by lazy { - ContextUtil.requireDrawable(requireContext(), R.drawable.ic_block_tinted_24) + ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_block_24) } private val leaveIcon by lazy { - ContextUtil.requireDrawable(requireContext(), R.drawable.ic_leave_tinted_24).apply { + ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_leave_24).apply { colorFilter = PorterDuffColorFilter(alertTint, PorterDuff.Mode.SRC_IN) } } @@ -135,7 +138,8 @@ class ConversationSettingsFragment : DSLSettingsFragment( recipientId = args.recipientId, groupId = ParcelableGroupId.get(groupId), callMessageIds = args.callMessageIds ?: longArrayOf(), - repository = ConversationSettingsRepository(requireContext()) + repository = ConversationSettingsRepository(requireContext()), + messageRequestRepository = MessageRequestRepository(requireContext()) ) } ) @@ -793,6 +797,49 @@ class ConversationSettingsFragment : DSLSettingsFragment( } } ) + + val reportSpamTint = if (state.isDeprecatedOrUnregistered) R.color.signal_alert_primary_50 else R.color.signal_alert_primary + clickPref( + title = DSLSettingsText.from(R.string.ConversationFragment_report_spam, ContextCompat.getColor(requireContext(), reportSpamTint)), + icon = DSLSettingsIcon.from(R.drawable.symbol_spam_24, reportSpamTint), + isEnabled = !state.isDeprecatedOrUnregistered, + onClick = { + BlockUnblockDialog.showReportSpamFor( + requireContext(), + viewLifecycleOwner.lifecycle, + state.recipient, + { + viewModel + .onReportSpam() + .subscribeBy { + Toast.makeText(requireContext(), R.string.ConversationFragment_reported_as_spam, Toast.LENGTH_SHORT).show() + onToolbarNavigationClicked() + } + .addTo(lifecycleDisposable) + }, + if (state.recipient.isBlocked) { + null + } else { + Runnable { + viewModel + .onBlockAndReportSpam() + .subscribeBy { result -> + when (result) { + is Result.Success -> { + Toast.makeText(requireContext(), R.string.ConversationFragment_reported_as_spam_and_blocked, Toast.LENGTH_SHORT).show() + onToolbarNavigationClicked() + } + is Result.Failure -> { + Toast.makeText(requireContext(), GroupErrors.getUserDisplayMessage(result.failure), Toast.LENGTH_SHORT).show() + } + } + } + .addTo(lifecycleDisposable) + } + } + ) + } + ) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt index c284df7afe..4b13ba7eb5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsViewModel.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.components.settings.conversation -import android.database.Cursor import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel @@ -8,11 +7,13 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.distinctUntilChanged import androidx.lifecycle.map import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject +import org.signal.core.util.Result import org.signal.core.util.ThreadUtil import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.readToList @@ -25,8 +26,10 @@ import org.thoughtcrime.securesms.database.model.StoryViewState import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.LiveGroup +import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason import org.thoughtcrime.securesms.groups.v2.GroupAddMembersResult import org.thoughtcrime.securesms.keyvalue.SignalStore +import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.RecipientUtil @@ -37,6 +40,7 @@ import org.thoughtcrime.securesms.util.livedata.Store sealed class ConversationSettingsViewModel( private val callMessageIds: LongArray, private val repository: ConversationSettingsRepository, + private val messageRequestRepository: MessageRequestRepository, specificSettingsState: SpecificSettingsState ) : ViewModel() { @@ -90,6 +94,27 @@ sealed class ConversationSettingsViewModel( sharedMediaUpdateTrigger.postValue(Unit) } + fun onReportSpam(): Maybe { + return if (store.state.threadId > 0 && store.state.recipient != Recipient.UNKNOWN) { + messageRequestRepository.reportSpamMessageRequest(store.state.recipient.id, store.state.threadId) + .observeOn(AndroidSchedulers.mainThread()) + .toSingle { Unit } + .toMaybe() + } else { + Maybe.empty() + } + } + + fun onBlockAndReportSpam(): Maybe> { + return if (store.state.threadId > 0 && store.state.recipient != Recipient.UNKNOWN) { + messageRequestRepository.blockAndReportSpamMessageRequest(store.state.recipient.id, store.state.threadId) + .observeOn(AndroidSchedulers.mainThread()) + .toMaybe() + } else { + Maybe.empty() + } + } + open fun refreshRecipient(): Unit = error("This ViewModel does not support this interaction") abstract fun setMuteUntil(muteUntil: Long) @@ -112,19 +137,15 @@ sealed class ConversationSettingsViewModel( disposable.clear() } - private fun Cursor?.ensureClosed() { - if (this != null && !this.isClosed) { - this.close() - } - } - private class RecipientSettingsViewModel( private val recipientId: RecipientId, private val callMessageIds: LongArray, - private val repository: ConversationSettingsRepository + private val repository: ConversationSettingsRepository, + messageRequestRepository: MessageRequestRepository ) : ConversationSettingsViewModel( callMessageIds, repository, + messageRequestRepository, SpecificSettingsState.RecipientSettingsState() ) { @@ -159,7 +180,7 @@ sealed class ConversationSettingsViewModel( contactLinkState = when { recipient.isSelf || recipient.isReleaseNotes || recipient.isBlocked -> ContactLinkState.NONE recipient.isSystemContact -> ContactLinkState.OPEN - recipient.hasE164() -> ContactLinkState.ADD + recipient.hasE164() && recipient.shouldShowE164() -> ContactLinkState.ADD else -> ContactLinkState.NONE } ) @@ -252,8 +273,9 @@ sealed class ConversationSettingsViewModel( private class GroupSettingsViewModel( private val groupId: GroupId, private val callMessageIds: LongArray, - private val repository: ConversationSettingsRepository - ) : ConversationSettingsViewModel(callMessageIds, repository, SpecificSettingsState.GroupSettingsState(groupId)) { + private val repository: ConversationSettingsRepository, + messageRequestRepository: MessageRequestRepository + ) : ConversationSettingsViewModel(callMessageIds, repository, messageRequestRepository, SpecificSettingsState.GroupSettingsState(groupId)) { private val liveGroup = LiveGroup(groupId) @@ -465,15 +487,16 @@ sealed class ConversationSettingsViewModel( private val recipientId: RecipientId? = null, private val groupId: GroupId? = null, private val callMessageIds: LongArray, - private val repository: ConversationSettingsRepository + private val repository: ConversationSettingsRepository, + private val messageRequestRepository: MessageRequestRepository ) : ViewModelProvider.Factory { override fun create(modelClass: Class): T { return requireNotNull( modelClass.cast( when { - recipientId != null -> RecipientSettingsViewModel(recipientId, callMessageIds, repository) - groupId != null -> GroupSettingsViewModel(groupId, callMessageIds, repository) + recipientId != null -> RecipientSettingsViewModel(recipientId, callMessageIds, repository, messageRequestRepository) + groupId != null -> GroupSettingsViewModel(groupId, callMessageIds, repository, messageRequestRepository) else -> error("One of RecipientId or GroupId required.") } ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/SharedMediaPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/SharedMediaPreference.kt index 5be0a777b7..0cb408dabc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/SharedMediaPreference.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/SharedMediaPreference.kt @@ -1,11 +1,11 @@ package org.thoughtcrime.securesms.components.settings.conversation.preferences import android.view.View +import com.bumptech.glide.Glide import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ThreadPhotoRailView import org.thoughtcrime.securesms.components.settings.PreferenceModel import org.thoughtcrime.securesms.database.MediaTable -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -40,7 +40,7 @@ object SharedMediaPreference { private val rail: ThreadPhotoRailView = itemView.findViewById(R.id.rail_view) override fun bind(model: Model) { - rail.setMediaRecords(GlideApp.with(rail), model.mediaRecords) + rail.setMediaRecords(Glide.with(rail), model.mediaRecords) rail.setListener { v, m -> model.onMediaRecordClick(v, m, ViewUtil.isLtr(rail)) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt index f18714e494..5cf6a69700 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlView.kt @@ -20,6 +20,7 @@ import org.greenrobot.eventbus.ThreadMode import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.attachments.Attachment +import org.thoughtcrime.securesms.attachments.DatabaseAttachment import org.thoughtcrime.securesms.components.RecyclerViewParentTransitionController import org.thoughtcrime.securesms.database.AttachmentTable import org.thoughtcrime.securesms.databinding.TransferControlsViewBinding @@ -108,7 +109,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att if (currentState.slides.size == 1) { val slide = currentState.slides.first() if (slide.hasVideo()) { - if (currentState.isOutgoing) { + if (currentState.isUpload) { return when (slide.transferState) { AttachmentTable.TRANSFER_PROGRESS_STARTED -> { Mode.UPLOADING_SINGLE_ITEM @@ -146,7 +147,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att } } } else { - return if (currentState.isOutgoing) { + return if (currentState.isUpload) { when (slide.transferState) { AttachmentTable.TRANSFER_PROGRESS_FAILED -> { Mode.RETRY_UPLOADING @@ -179,7 +180,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att } else { when (getTransferState(currentState.slides)) { AttachmentTable.TRANSFER_PROGRESS_STARTED -> { - return if (currentState.isOutgoing) { + return if (currentState.isUpload) { Mode.UPLOADING_GALLERY } else { Mode.DOWNLOADING_GALLERY @@ -195,7 +196,7 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att } AttachmentTable.TRANSFER_PROGRESS_FAILED -> { - return if (currentState.isOutgoing) { + return if (currentState.isUpload) { Mode.RETRY_UPLOADING } else { Mode.RETRY_DOWNLOADING @@ -557,14 +558,14 @@ class TransferControlView @JvmOverloads constructor(context: Context, attrs: Att } } val playableWhileDownloading = allStreamableOrDone - val isOutgoing = slides.any { it.asAttachment().uploadTimestamp == 0L } + val isUpload = slides.any { it.asAttachment().uploadTimestamp == 0L } && slides.all { (it.asAttachment() as? DatabaseAttachment)?.hasData == true } val result = state.copy( slides = slides, networkProgress = networkProgress, compressionProgress = compressionProgress, playableWhileDownloading = playableWhileDownloading, - isOutgoing = isOutgoing + isUpload = isUpload ) verboseLog("New state calculated and being returned for new slides: ${slidesAsListOfTimestamps(slides)}\n$result") return@updateState result diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState.kt index 95159c570a..6cb7c6b719 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState.kt @@ -21,5 +21,5 @@ data class TransferControlViewState( val networkProgress: Map = HashMap(), val compressionProgress: Map = HashMap(), val playableWhileDownloading: Boolean = false, - val isOutgoing: Boolean = false + val isUpload: Boolean = false ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/verify/SafetyNumberQrView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/verify/SafetyNumberQrView.kt index 4de5e7bb4f..59e29fb147 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/verify/SafetyNumberQrView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/verify/SafetyNumberQrView.kt @@ -9,7 +9,6 @@ import android.animation.ValueAnimator import android.content.Context import android.content.res.ColorStateList import android.graphics.Bitmap -import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Outline import android.graphics.PorterDuff @@ -26,12 +25,14 @@ import android.widget.TextView import androidx.annotation.DrawableRes import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.core.graphics.drawable.toBitmap import androidx.core.widget.ImageViewCompat import androidx.interpolator.view.animation.FastOutSlowInInterpolator import org.signal.core.util.dp import org.signal.libsignal.protocol.fingerprint.Fingerprint import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.qr.QrCodeUtil +import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.visible import java.nio.charset.Charset @@ -149,7 +150,7 @@ class SafetyNumberQrView : ConstraintLayout { fun animateVerifiedSuccess() { val qrBitmap = (qrCode.drawable as BitmapDrawable).bitmap - val qrSuccess: Bitmap = createVerifiedBitmap(qrBitmap.width, qrBitmap.height, R.drawable.ic_check_white_48dp) + val qrSuccess: Bitmap = createVerifiedBitmap(qrBitmap.width, qrBitmap.height, R.drawable.symbol_check_white_48) qrVerified.setImageBitmap(qrSuccess) qrVerified.background.setColorFilter(resources.getColor(R.color.green_500), PorterDuff.Mode.MULTIPLY) tapLabel.setText(context.getString(R.string.verify_display_fragment__successful_match)) @@ -158,7 +159,7 @@ class SafetyNumberQrView : ConstraintLayout { fun animateVerifiedFailure() { val qrBitmap = (qrCode.drawable as BitmapDrawable).bitmap - val qrSuccess: Bitmap = createVerifiedBitmap(qrBitmap.width, qrBitmap.height, R.drawable.ic_close_white_48dp) + val qrSuccess: Bitmap = createVerifiedBitmap(qrBitmap.width, qrBitmap.height, R.drawable.symbol_x_white_48) qrVerified.setImageBitmap(qrSuccess) qrVerified.background.setColorFilter(resources.getColor(R.color.red_500), PorterDuff.Mode.MULTIPLY) tapLabel.setText(context.getString(R.string.verify_display_fragment__failed_to_verify_safety_number)) @@ -211,7 +212,7 @@ class SafetyNumberQrView : ConstraintLayout { private fun createVerifiedBitmap(width: Int, height: Int, @DrawableRes id: Int): Bitmap { val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) val canvas = Canvas(bitmap) - val check = BitmapFactory.decodeResource(resources, id) + val check = ContextUtil.requireDrawable(context, id).toBitmap() val offset = ((width - check.width) / 2).toFloat() canvas.drawBitmap(check, offset, offset, null) return bitmap diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantView.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantView.java index 71246b9ecd..04b6438d79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantView.java @@ -19,6 +19,7 @@ import androidx.transition.Transition; import androidx.transition.TransitionManager; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -33,7 +34,6 @@ import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; import org.thoughtcrime.securesms.conversation.colors.ChatColors; import org.thoughtcrime.securesms.events.CallParticipant; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.AvatarUtil; @@ -408,7 +408,7 @@ private void setPipAvatar(@NonNull Recipient recipient) { : recipient.getContactPhoto(); FallbackContactPhoto fallbackPhoto = recipient.getFallbackContactPhoto(FALLBACK_PHOTO_PROVIDER); - GlideApp.with(this) + Glide.with(this) .load(contactPhoto) .fallback(fallbackPhoto.asCallCard(getContext())) .error(fallbackPhoto.asCallCard(getContext())) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/LayoutPositions.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/LayoutPositions.kt index e493f0efd2..289ca65a3d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/LayoutPositions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/LayoutPositions.kt @@ -20,7 +20,7 @@ enum class LayoutPositions( SMALL_GROUP( participantBottomViewId = ConstraintSet.PARENT_ID, participantBottomMargin = 0, - reactionBottomViewId = R.id.call_screen_above_controls_guideline, + reactionBottomViewId = R.id.call_screen_pending_recipients, reactionBottomMargin = 8 ), @@ -28,7 +28,7 @@ enum class LayoutPositions( LARGE_GROUP( participantBottomViewId = R.id.call_screen_participants_recycler, participantBottomMargin = 16, - reactionBottomViewId = R.id.call_screen_participants_recycler, + reactionBottomViewId = R.id.call_screen_pending_recipients, reactionBottomMargin = 20 ); 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 0738480c32..e6d33c3d95 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 @@ -25,6 +25,7 @@ import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.widget.Toolbar; import androidx.compose.ui.platform.ComposeView; +import androidx.constraintlayout.widget.Barrier; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; import androidx.constraintlayout.widget.Guideline; @@ -35,6 +36,7 @@ import androidx.viewpager2.widget.MarginPageTransformer; import androidx.viewpager2.widget.ViewPager2; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.google.android.material.button.MaterialButton; @@ -51,7 +53,6 @@ import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.events.CallParticipant; import org.thoughtcrime.securesms.events.WebRtcViewModel; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.ringrtc.CameraState; @@ -124,6 +125,7 @@ public class WebRtcCallView extends InsetAwareConstraintLayout { private RecyclerView groupReactionsFeed; private MultiReactionBurstLayout reactionViews; private ComposeView raiseHandSnackbar; + private Barrier pipBottomBoundaryBarrier; @@ -203,6 +205,7 @@ protected void onFinishInflate() { groupReactionsFeed = findViewById(R.id.call_screen_reactions_feed); reactionViews = findViewById(R.id.call_screen_reactions_container); raiseHandSnackbar = findViewById(R.id.call_screen_raise_hand_view); + pipBottomBoundaryBarrier = findViewById(R.id.pip_bottom_boundary_barrier); View decline = findViewById(R.id.call_screen_decline_call); View answerLabel = findViewById(R.id.call_screen_answer_call_label); @@ -355,6 +358,12 @@ public void onPageSelected(int position) { rotatableControls.add(decline); rotatableControls.add(smallLocalAudioIndicator); rotatableControls.add(ringToggle); + + pipBottomBoundaryBarrier.addOnLayoutChangeListener((v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { + if (bottom != oldBottom) { + onBarrierBottomChanged(bottom); + } + }); } @Override @@ -546,7 +555,7 @@ public void updateLocalCallParticipant(@NonNull WebRtcLocalRenderState state, if (!localAvatar.equals(previousLocalAvatar)) { previousLocalAvatar = localAvatar; - GlideApp.with(getContext().getApplicationContext()) + Glide.with(getContext().getApplicationContext()) .load(localAvatar) .transform(new CenterCrop(), new BlurTransformation(getContext(), 0.25f, BlurTransformation.MAX_RADIUS)) .diskCacheStrategy(DiskCacheStrategy.ALL) @@ -851,17 +860,17 @@ private void adjustLayoutPositions(@NonNull LayoutPositions layoutPositions) { private void moveSnackbarAboveParticipantRail(boolean aboveRail) { if (aboveRail) { - updateSnackbarBottomConstraint(callParticipantsRecycler); + updatePendingParticipantsBottomConstraint(callParticipantsRecycler); } else { - updateSnackbarBottomConstraint(aboveControlsGuideline); + updatePendingParticipantsBottomConstraint(aboveControlsGuideline); } } - private void updateSnackbarBottomConstraint(View anchor) { + private void updatePendingParticipantsBottomConstraint(View anchor) { ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(this); - constraintSet.connect(R.id.call_screen_raise_hand_view, + constraintSet.connect(R.id.call_screen_pending_recipients, ConstraintSet.BOTTOM, anchor.getId(), ConstraintSet.TOP, @@ -938,15 +947,12 @@ public void enableRingGroup(boolean enabled) { ringToggle.setActivated(enabled); } - public void onControlTopChanged(int guidelineTop, int snackBarHeight) { - int offset = 0; - if (lastState != null) { - CallParticipantsState state = lastState.getCallParticipantsState(); - if (!state.isViewingFocusedParticipant() && !state.isLargeVideoGroup()) { - offset = snackBarHeight; - } - pictureInPictureGestureHelper.setBottomVerticalBoundary(guidelineTop - offset); - } + public void onControlTopChanged() { + onBarrierBottomChanged(pipBottomBoundaryBarrier.getBottom()); + } + + private void onBarrierBottomChanged(int barrierBottom) { + pictureInPictureGestureHelper.setBottomVerticalBoundary(barrierBottom); } public interface ControlsListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt index 1d87e98e20..a79bad8fa6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt @@ -147,8 +147,8 @@ class ControlsAndInfoController( webRtcCallView.post { onControlTopChanged() } } - raiseHandComposeView.addOnLayoutChangeListener { _, _, top, _, bottom, _, _, _, _ -> - onControlTopChanged(composeViewSize = bottom - top) + raiseHandComposeView.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ -> + onControlTopChanged() } callControls.viewTreeObserver.addOnGlobalLayoutListener { @@ -184,8 +184,6 @@ class ControlsAndInfoController( callInfoComposeView.alpha = alphaCallInfo(slideOffset) callInfoComposeView.translationY = infoTranslationDistance - (infoTranslationDistance * callInfoComposeView.alpha) - - onControlTopChanged() } }) @@ -210,10 +208,10 @@ class ControlsAndInfoController( } } - fun onControlTopChanged(composeViewSize: Int = raiseHandComposeView.height) { + fun onControlTopChanged() { val guidelineTop = max(frame.top, coordinator.height - behavior.peekHeight) aboveControlsGuideline.setGuidelineBegin(guidelineTop) - webRtcCallView.onControlTopChanged(guidelineTop, composeViewSize) + webRtcCallView.onControlTopChanged() } fun addVisibilityListener(listener: BottomSheetVisibilityListener): Boolean { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt index cee9975ca0..c4648fd7da 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/RaiseHandSnackbar.kt @@ -120,7 +120,7 @@ private fun RaiseHand( modifier = modifier .padding(horizontal = 16.dp) .clip(shape = RoundedCornerShape(16.dp, 16.dp, 16.dp, 16.dp)) - .background(MaterialTheme.colorScheme.surface) + .background(SignalTheme.colors.colorSurface1) .animateContentSize() ) { val boxModifier = modifier diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChip.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChip.java index d5eee35242..731e3ddb34 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChip.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/ContactChip.java @@ -11,13 +11,13 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.google.android.material.chip.Chip; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; public final class ContactChip extends Chip { @@ -44,7 +44,7 @@ public void setContact(@NonNull SelectedContact contact) { return contact; } - public void setAvatar(@NonNull GlideRequests requestManager, @Nullable Recipient recipient, @Nullable Runnable onAvatarSet) { + public void setAvatar(@NonNull RequestManager requestManager, @Nullable Recipient recipient, @Nullable Runnable onAvatarSet) { if (recipient != null) { requestManager.clear(this); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt index 9ced4e5b68..b4771a9363 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/SelectedContacts.kt @@ -1,8 +1,8 @@ package org.thoughtcrime.securesms.contacts import android.view.View +import com.bumptech.glide.Glide import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -36,7 +36,7 @@ object SelectedContacts { chip.setOnCloseIconClickListener { onCloseIconClicked(model) } - chip.setAvatar(GlideApp.with(itemView), model.recipient, null) + chip.setAvatar(Glide.with(itemView), model.recipient, null) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java index c213932581..2a452af5e1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/avatars/TransparentContactPhoto.java @@ -32,7 +32,7 @@ public Drawable asSmallDrawable(@NonNull Context context, @NonNull AvatarColor c @Override public Drawable asCallCard(@NonNull Context context) { - return ContextCompat.getDrawable(context, R.drawable.ic_contact_picture_large); + return ContextCompat.getDrawable(context, R.drawable.symbol_person_display_40); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt index 04eb95c69b..32aad8cba7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt @@ -198,9 +198,12 @@ object ContactDiscovery { if (!SignalStore.settings().isNotifyWhenContactJoinsSignal) return Recipient.resolvedList(newUserIds) - .filter { !it.isSelf && it.hasAUserSetDisplayName(context) && !hasSession(it.id) } - .map { IncomingMessage.contactJoined(it.id, System.currentTimeMillis()) } - .map { SignalDatabase.messages.insertMessageInbox(it) } + .filter { !it.isSelf && it.hasAUserSetDisplayName(context) && !hasSession(it.id) && it.hasE164() } + .map { + Log.i(TAG, "Inserting 'contact joined' message for ${it.id}. E164: ${it.e164}") + val message = IncomingMessage.contactJoined(it.id, System.currentTimeMillis()) + SignalDatabase.messages.insertMessageInbox(message) + } .filter { it.isPresent } .map { it.get() } .forEach { result -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt index d1378c878b..375f4ddcae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt @@ -198,7 +198,7 @@ object ContactDiscoveryRefreshV2 { private fun hasCommunicatedWith(recipient: Recipient): Boolean { val localAci = SignalStore.account().requireAci() - return SignalDatabase.threads.hasThread(recipient.id) || (recipient.hasServiceId() && SignalDatabase.sessions.hasSessionFor(localAci, recipient.requireServiceId().toString())) + return SignalDatabase.threads.hasActiveThread(recipient.id) || (recipient.hasServiceId() && SignalDatabase.sessions.hasSessionFor(localAci, recipient.requireServiceId().toString())) } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java index 446e97417f..41daa4c414 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactFieldAdapter.java @@ -15,11 +15,11 @@ import androidx.recyclerview.widget.RecyclerView; import com.annimon.stream.Stream; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contactshare.Contact.Phone; -import org.thoughtcrime.securesms.mms.GlideRequests; import java.util.ArrayList; import java.util.List; @@ -31,16 +31,16 @@ class ContactFieldAdapter extends RecyclerView.Adapter { - private final Locale locale; - private final boolean selectable; - private final List fields; - private final GlideRequests glideRequests; + private final Locale locale; + private final boolean selectable; + private final List fields; + private final RequestManager requestManager; - public ContactFieldAdapter(@NonNull Locale locale, @NonNull GlideRequests glideRequests, boolean selectable) { - this.locale = locale; - this.glideRequests = glideRequests; - this.selectable = selectable; - this.fields = new ArrayList<>(); + public ContactFieldAdapter(@NonNull Locale locale, @NonNull RequestManager requestManager, boolean selectable) { + this.locale = locale; + this.requestManager = requestManager; + this.selectable = selectable; + this.fields = new ArrayList<>(); } @Override @@ -50,7 +50,7 @@ public ContactFieldAdapter(@NonNull Locale locale, @NonNull GlideRequests glideR @Override public void onBindViewHolder(@NonNull ContactFieldViewHolder holder, int position) { - holder.bind(fields.get(position), glideRequests, selectable); + holder.bind(fields.get(position), requestManager, selectable); } @Override @@ -98,7 +98,7 @@ static class ContactFieldViewHolder extends RecyclerView.ViewHolder { checkBox = itemView.findViewById(R.id.contact_field_checkbox); } - void bind(@NonNull Field field, @NonNull GlideRequests glideRequests, boolean selectable) { + void bind(@NonNull Field field, @NonNull RequestManager requestManager, boolean selectable) { value.setMaxLines(field.maxLines); value.setText(field.value); label.setText(field.label); @@ -106,7 +106,7 @@ void bind(@NonNull Field field, @NonNull GlideRequests glideRequests, boolean se if (field.iconUri != null) { avatar.setVisibility(View.VISIBLE); - glideRequests.load(field.iconUri) + requestManager.load(field.iconUri) .diskCacheStrategy(DiskCacheStrategy.NONE) .skipMemoryCache(true) .circleCrop() @@ -139,7 +139,6 @@ static class Field { final String value; final String label; - final int iconResId; final int maxLines; final Selectable selectable; @@ -148,7 +147,6 @@ static class Field { Field(@NonNull Context context, @NonNull Phone phoneNumber, @NonNull Locale locale) { this.value = ContactUtil.getPrettyPhoneNumber(phoneNumber, locale); - this.iconResId = R.drawable.ic_phone_right_unlock_solid_24; this.iconUri = null; this.maxLines = 1; this.selectable = phoneNumber; @@ -173,7 +171,6 @@ static class Field { Field(@NonNull Context context, @NonNull Email email) { this.value = email.getEmail(); - this.iconResId = R.drawable.baseline_email_white_24; this.iconUri = null; this.maxLines = 1; this.selectable = email; @@ -198,7 +195,6 @@ static class Field { Field(@NonNull Context context, @NonNull PostalAddress postalAddress) { this.value = postalAddress.toString(); - this.iconResId = R.drawable.ic_location_on_white_24dp; this.iconUri = null; this.maxLines = 3; this.selectable = postalAddress; @@ -220,7 +216,6 @@ static class Field { Field(@NonNull Avatar avatar) { this.value = ""; - this.iconResId = R.drawable.baseline_account_circle_white_24; this.iconUri = avatar.getAttachment() != null ? avatar.getAttachment().getUri() : null; this.maxLines = 1; this.selectable = avatar; diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java index b3706a789e..738ff77a00 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditActivity.java @@ -20,9 +20,10 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.util.DynamicLanguage; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -89,7 +90,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState, boolean ready) { Material3OnScrollHelper onScrollHelper = new Material3OnScrollHelper(this, Collections.singletonList(toolbar), Collections.emptyList(), this); onScrollHelper.attach(contactList); - ContactShareEditAdapter contactAdapter = new ContactShareEditAdapter(GlideApp.with(this), dynamicLanguage.getCurrentLocale(), this); + ContactShareEditAdapter contactAdapter = new ContactShareEditAdapter(Glide.with(this), dynamicLanguage.getCurrentLocale(), this); contactList.setAdapter(contactAdapter); SharedContactRepository contactRepository = new SharedContactRepository(this, AsyncTask.THREAD_POOL_EXECUTOR); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java index effc011799..6e4aa43d90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/ContactShareEditAdapter.java @@ -11,8 +11,9 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mms.GlideRequests; import java.util.ArrayList; import java.util.List; @@ -22,23 +23,23 @@ public class ContactShareEditAdapter extends RecyclerView.Adapter { - private final GlideRequests glideRequests; - private final Locale locale; - private final EventListener eventListener; - private final List contacts; + private final RequestManager requestManager; + private final Locale locale; + private final EventListener eventListener; + private final List contacts; - ContactShareEditAdapter(@NonNull GlideRequests glideRequests, @NonNull Locale locale, @NonNull EventListener eventListener) { - this.glideRequests = glideRequests; - this.locale = locale; - this.eventListener = eventListener; - this.contacts = new ArrayList<>(); + ContactShareEditAdapter(@NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull EventListener eventListener) { + this.requestManager = requestManager; + this.locale = locale; + this.eventListener = eventListener; + this.contacts = new ArrayList<>(); } @Override public @NonNull ContactEditViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new ContactEditViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_editable_contact, parent, false), locale, - glideRequests); + requestManager); } @Override @@ -67,12 +68,12 @@ static class ContactEditViewHolder extends RecyclerView.ViewHolder { private final View nameEditButton; private final ContactFieldAdapter fieldAdapter; - ContactEditViewHolder(View itemView, @NonNull Locale locale, @NonNull GlideRequests glideRequests) { + ContactEditViewHolder(View itemView, @NonNull Locale locale, @NonNull RequestManager requestManager) { super(itemView); this.name = itemView.findViewById(R.id.editable_contact_name); this.nameEditButton = itemView.findViewById(R.id.editable_contact_name_edit_button); - this.fieldAdapter = new ContactFieldAdapter(locale, glideRequests, true); + this.fieldAdapter = new ContactFieldAdapter(locale, requestManager, true); RecyclerView fields = itemView.findViewById(R.id.editable_contact_fields); fields.setLayoutManager(new LinearLayoutManager(itemView.getContext())); diff --git a/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java index 4b665ec3c7..7e3a31cf45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/contactshare/SharedContactDetailsActivity.java @@ -18,6 +18,8 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.PassphraseRequiredActivity; @@ -25,8 +27,6 @@ import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; -import org.thoughtcrime.securesms.mms.GlideApp; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -59,7 +59,7 @@ public class SharedContactDetailsActivity extends PassphraseRequiredActivity { private View messageButtonView; private View callButtonView; - private GlideRequests glideRequests; + private RequestManager requestManager; private Contact contact; private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme(); @@ -132,13 +132,13 @@ private void initViews() { messageButtonView = findViewById(R.id.contact_details_message_button); callButtonView = findViewById(R.id.contact_details_call_button); - contactFieldAdapter = new ContactFieldAdapter(dynamicLanguage.getCurrentLocale(), glideRequests, false); + contactFieldAdapter = new ContactFieldAdapter(dynamicLanguage.getCurrentLocale(), requestManager, false); RecyclerView list = findViewById(R.id.contact_details_fields); list.setLayoutManager(new LinearLayoutManager(this)); list.setAdapter(contactFieldAdapter); - glideRequests = GlideApp.with(this); + requestManager = Glide.with(this); } @SuppressLint("StaticFieldLeak") @@ -172,13 +172,15 @@ protected void onPostExecute(Intent intent) { public void presentAvatar(@Nullable Uri uri) { if (uri != null) { - glideRequests.load(new DecryptableUri(uri)) - .fallback(R.drawable.ic_contact_picture) + requestManager + .load(new DecryptableUri(uri)) + .fallback(R.drawable.symbol_person_display_40) .circleCrop() .diskCacheStrategy(DiskCacheStrategy.ALL) .into(avatarView); } else { - glideRequests.load(R.drawable.ic_contact_picture) + requestManager + .load(R.drawable.symbol_person_display_40) .circleCrop() .diskCacheStrategy(DiskCacheStrategy.ALL) .into(avatarView); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java index 3d0180cf77..1a8ec94185 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboard.java @@ -12,10 +12,11 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.InputAwareLayout; import org.thoughtcrime.securesms.mediasend.Media; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.util.StorageUtil; import java.util.Arrays; @@ -63,7 +64,7 @@ private void init(@NonNull Context context) { RecyclerView buttonList = findViewById(R.id.attachment_keyboard_button_list); buttonList.setItemAnimator(null); - mediaAdapter = new AttachmentKeyboardMediaAdapter(GlideApp.with(this), media -> { + mediaAdapter = new AttachmentKeyboardMediaAdapter(Glide.with(this), media -> { if (callback != null) { callback.onAttachmentMediaClicked(media); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java index 2a33fb9cee..8aa6692a61 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/AttachmentKeyboardMediaAdapter.java @@ -8,10 +8,11 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ThumbnailView; import org.thoughtcrime.securesms.mediasend.Media; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.adapter.StableIdGenerator; @@ -22,15 +23,15 @@ class AttachmentKeyboardMediaAdapter extends RecyclerView.Adapter { private final List media; - private final GlideRequests glideRequests; + private final RequestManager requestManager; private final Listener listener; private final StableIdGenerator idGenerator; - AttachmentKeyboardMediaAdapter(@NonNull GlideRequests glideRequests, @NonNull Listener listener) { - this.glideRequests = glideRequests; - this.listener = listener; - this.media = new ArrayList<>(); - this.idGenerator = new StableIdGenerator<>(); + AttachmentKeyboardMediaAdapter(@NonNull RequestManager requestManager, @NonNull Listener listener) { + this.requestManager = requestManager; + this.listener = listener; + this.media = new ArrayList<>(); + this.idGenerator = new StableIdGenerator<>(); setHasStableIds(true); } @@ -47,7 +48,7 @@ public long getItemId(int position) { @Override public void onBindViewHolder(@NonNull MediaViewHolder holder, int position) { - holder.bind(media.get(position), glideRequests, listener); + holder.bind(media.get(position), requestManager, listener); } @Override @@ -83,8 +84,8 @@ public MediaViewHolder(@NonNull View itemView) { videoIcon = itemView.findViewById(R.id.attachment_keyboard_item_video_icon); } - void bind(@NonNull Media media, @NonNull GlideRequests glideRequests, @NonNull Listener listener) { - image.setImageResource(glideRequests, media.getUri(), 400, 400); + void bind(@NonNull Media media, @NonNull RequestManager requestManager, @NonNull Listener listener) { + image.setImageResource(requestManager, media.getUri(), 400, 400); image.setOnClickListener(v -> listener.onMediaClicked(media)); duration.setVisibility(View.GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java index 7e0c800204..9f7e396496 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationAdapter.java @@ -39,6 +39,8 @@ import androidx.media3.common.MediaItem; +import com.bumptech.glide.RequestManager; + import org.signal.core.util.logging.Log; import org.signal.paging.PagingController; import org.thoughtcrime.securesms.BindableConversationItem; @@ -50,7 +52,6 @@ import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4Playable; import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.DateUtils; @@ -99,7 +100,7 @@ public class ConversationAdapter private final ItemClickListener clickListener; private final Context context; private final LifecycleOwner lifecycleOwner; - private final GlideRequests glideRequests; + private final RequestManager requestManager; private final Locale locale; private final Set selected; private final Calendar calendar; @@ -119,7 +120,7 @@ public class ConversationAdapter public ConversationAdapter(@NonNull Context context, @NonNull LifecycleOwner lifecycleOwner, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @Nullable ItemClickListener clickListener, boolean hasWallpaper, @@ -137,10 +138,10 @@ public boolean areContentsTheSame(@NonNull ConversationMessage oldItem, @NonNull } }); - this.lifecycleOwner = lifecycleOwner; - this.context = context; + this.lifecycleOwner = lifecycleOwner; + this.context = context; - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.locale = locale; this.clickListener = clickListener; this.selected = new HashSet<>(); @@ -276,7 +277,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi conversationMessage, Optional.ofNullable(previousMessage != null ? previousMessage.getMessageRecord() : null), Optional.ofNullable(nextMessage != null ? nextMessage.getMessageRecord() : null), - glideRequests, + requestManager, locale, selected, conversationMessage.getThreadRecipient(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationHeaderView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationHeaderView.java index 6baf455bb0..848a7d65e9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationHeaderView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationHeaderView.java @@ -15,6 +15,8 @@ import androidx.core.content.ContextCompat; import androidx.core.view.ViewKt; +import com.bumptech.glide.RequestManager; + import org.signal.core.util.DimensionUnit; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.R; @@ -23,7 +25,6 @@ import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.databinding.ConversationHeaderViewBinding; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.ContextUtil; import org.thoughtcrime.securesms.util.LongClickMovementMethod; @@ -60,8 +61,8 @@ public void setBadge(@Nullable Recipient recipient) { } } - public void setAvatar(@NonNull GlideRequests requests, @Nullable Recipient recipient) { - binding.messageRequestAvatar.setAvatar(requests, recipient, false); + public void setAvatar(@NonNull RequestManager requestManager, @Nullable Recipient recipient) { + binding.messageRequestAvatar.setAvatar(requestManager, recipient, false); if (recipient != null && recipient.shouldBlurAvatar() && recipient.getContactPhoto() != null) { binding.messageRequestAvatarTapToView.setVisibility(VISIBLE); @@ -119,43 +120,58 @@ public void setDescription(@Nullable CharSequence description, @DrawableRes int return binding.messageRequestDescription; } + public void setButton(@NonNull CharSequence button, Runnable onClick) { + binding.messageRequestButton.setText(button); + binding.messageRequestButton.setOnClickListener(v -> onClick.run()); + binding.messageRequestButton.setVisibility(View.VISIBLE); + } + public void showBackgroundBubble(boolean enabled) { if (enabled) { setBackgroundResource(R.drawable.wallpaper_bubble_background_18); - binding.messageRequestInfoOutline.setVisibility(View.INVISIBLE); - binding.messageRequestDivider.setVisibility(View.VISIBLE); } else { setBackground(null); - binding.messageRequestInfoOutline.setVisibility(View.VISIBLE); - binding.messageRequestDivider.setVisibility(View.INVISIBLE); } - hideDecoratorsIfContentIsNotPresent(); + updateOutlineVisibility(); } public void hideSubtitle() { binding.messageRequestSubtitle.setVisibility(View.GONE); + updateOutlineVisibility(); } public void showDescription() { binding.messageRequestDescription.setVisibility(View.VISIBLE); + updateOutlineVisibility(); } public void hideDescription() { binding.messageRequestDescription.setVisibility(View.GONE); + updateOutlineVisibility(); + } + + public void hideButton() { + binding.messageRequestButton.setVisibility(View.GONE); } public void setLinkifyDescription(boolean enable) { binding.messageRequestDescription.setMovementMethod(enable ? LongClickMovementMethod.getInstance(getContext()) : null); } - private void hideDecoratorsIfContentIsNotPresent() { + private void updateOutlineVisibility() { if (ViewKt.isVisible(binding.messageRequestSubtitle) || ViewKt.isVisible(binding.messageRequestDescription)) { - return; + if (getBackground() != null) { + binding.messageRequestInfoOutline.setVisibility(View.GONE); + binding.messageRequestDivider.setVisibility(View.VISIBLE); + } else { + binding.messageRequestInfoOutline.setVisibility(View.VISIBLE); + binding.messageRequestDivider.setVisibility(View.INVISIBLE); + } + } else { + binding.messageRequestInfoOutline.setVisibility(View.GONE); + binding.messageRequestDivider.setVisibility(View.GONE); } - - binding.messageRequestInfoOutline.setVisibility(View.GONE); - binding.messageRequestDivider.setVisibility(View.GONE); } private @NonNull CharSequence prependIcon(@NonNull CharSequence input, @DrawableRes int iconRes) { 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 2ddd3de655..913daf86ad 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java @@ -57,6 +57,7 @@ import androidx.media3.common.MediaItem; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.google.common.collect.Sets; @@ -69,6 +70,7 @@ import org.signal.ringrtc.CallLinkRootKey; import org.thoughtcrime.securesms.BindableConversationItem; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.attachments.Attachment; import org.thoughtcrime.securesms.attachments.AttachmentId; import org.thoughtcrime.securesms.attachments.DatabaseAttachment; import org.thoughtcrime.securesms.badges.BadgeImageView; @@ -101,8 +103,8 @@ import org.thoughtcrime.securesms.database.AttachmentTable; import org.thoughtcrime.securesms.database.MediaTable; import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.database.model.MmsMessageRecord; 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.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.events.PartProgressEvent; @@ -115,11 +117,11 @@ import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory; import org.thoughtcrime.securesms.mediapreview.MediaPreviewCache; import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Fragment; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideClickListener; +import org.thoughtcrime.securesms.mms.SlideDeck; import org.thoughtcrime.securesms.mms.SlidesClickedListener; import org.thoughtcrime.securesms.mms.TextSlide; import org.thoughtcrime.securesms.mms.VideoSlide; @@ -187,7 +189,7 @@ public final class ConversationItem extends RelativeLayout implements BindableCo private Locale locale; private boolean groupThread; private LiveRecipient author; - private GlideRequests glideRequests; + private RequestManager requestManager; private Optional previousMessage; private ConversationItemDisplayMode displayMode; @@ -349,7 +351,7 @@ public void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull ConversationMessage conversationMessage, @NonNull Optional previousMessageRecord, @NonNull Optional nextMessageRecord, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient conversationRecipient, @@ -371,7 +373,7 @@ public void bind(@NonNull LifecycleOwner lifecycleOwner, this.messageRecord = conversationMessage.getMessageRecord(); this.nextMessageRecord = nextMessageRecord; this.locale = locale; - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.batchSelected = batchSelected; this.conversationRecipient = conversationRecipient.live(); this.groupThread = conversationRecipient.isGroup(); @@ -701,7 +703,7 @@ public void unbind() { bodyBubble.setVideoPlayerProjection(null); bodyBubble.setQuoteViewProjection(null); - glideRequests = null; + requestManager = null; } @Override @@ -1114,7 +1116,7 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, if (joinCallLinkStub.resolved()) joinCallLinkStub.get().setVisibility(View.GONE); paymentViewStub.setVisibility(View.GONE); - sharedContactStub.get().setContact(((MmsMessageRecord) messageRecord).getSharedContacts().get(0), glideRequests, locale); + sharedContactStub.get().setContact(((MmsMessageRecord) messageRecord).getSharedContacts().get(0), requestManager, locale); sharedContactStub.get().setEventListener(sharedContactEventListener); sharedContactStub.get().setOnClickListener(sharedContactClickListener); sharedContactStub.get().setOnLongClickListener(passthroughClickListener); @@ -1156,14 +1158,14 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, mediaThumbnailStub.require().setVisibility(VISIBLE); mediaThumbnailStub.require().setMinimumThumbnailWidth(readDimen(R.dimen.media_bubble_min_width_with_content)); mediaThumbnailStub.require().setMaximumThumbnailHeight(readDimen(R.dimen.media_bubble_max_height)); - mediaThumbnailStub.require().setImageResource(glideRequests, Collections.singletonList(new ImageSlide(linkPreview.getThumbnail().get())), showControls, false); + mediaThumbnailStub.require().setImageResource(requestManager, Collections.singletonList(new ImageSlide(linkPreview.getThumbnail().get())), showControls, false); mediaThumbnailStub.require().setThumbnailClickListener(new LinkPreviewThumbnailClickListener()); mediaThumbnailStub.require().setStartTransferClickListener(downloadClickListener); mediaThumbnailStub.require().setCancelTransferClickListener(attachmentCancelClickListener); mediaThumbnailStub.require().setPlayVideoClickListener(playVideoClickListener); mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener); - linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, false); + linkPreviewStub.get().setLinkPreview(requestManager, linkPreview, false); setThumbnailCorners(messageRecord, previousRecord, nextRecord, isGroupThread); setLinkPreviewCorners(messageRecord, previousRecord, nextRecord, isGroupThread, true); @@ -1172,7 +1174,7 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, ViewUtil.updateLayoutParamsIfNonNull(groupSenderHolder, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); ViewUtil.setTopMargin(linkPreviewStub.get(), 0); } else { - linkPreviewStub.get().setLinkPreview(glideRequests, linkPreview, true, !isContentCondensed(), displayMode.getScheduleMessageMode()); + linkPreviewStub.get().setLinkPreview(requestManager, linkPreview, true, !isContentCondensed(), displayMode.getScheduleMessageMode()); linkPreviewStub.get().setDownloadClickedListener(downloadClickListener); setLinkPreviewCorners(messageRecord, previousRecord, nextRecord, isGroupThread, false); ViewUtil.updateLayoutParams(bodyText, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); @@ -1256,11 +1258,11 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, if (hasSticker(messageRecord)) { //noinspection ConstantConditions - stickerStub.get().setSlide(glideRequests, ((MmsMessageRecord) messageRecord).getSlideDeck().getStickerSlide()); + stickerStub.get().setSlide(requestManager, ((MmsMessageRecord) messageRecord).getSlideDeck().getStickerSlide()); stickerStub.get().setThumbnailClickListener(new StickerClickListener()); } else { //noinspection ConstantConditions - stickerStub.get().setSlide(glideRequests, ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlide()); + stickerStub.get().setSlide(requestManager, ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlide()); stickerStub.get().setThumbnailClickListener((v, slide) -> performClick()); } @@ -1285,7 +1287,8 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, if (joinCallLinkStub.resolved()) joinCallLinkStub.get().setVisibility(View.GONE); paymentViewStub.setVisibility(View.GONE); - List thumbnailSlides = ((MmsMessageRecord) messageRecord).getSlideDeck().getThumbnailSlides(); + final SlideDeck slideDeck = ((MmsMessageRecord) messageRecord).getSlideDeck(); + List thumbnailSlides = slideDeck.getThumbnailSlides(); mediaThumbnailStub.require().setMinimumThumbnailWidth(readDimen(isCaptionlessMms(messageRecord) ? R.dimen.media_bubble_min_width_solo : R.dimen.media_bubble_min_width_with_content)); mediaThumbnailStub.require().setMaximumThumbnailHeight(readDimen(isContentCondensed() ? R.dimen.media_bubble_max_height_condensed @@ -1297,7 +1300,7 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, mediaThumbnailStub.require().setOnLongClickListener(passthroughClickListener); mediaThumbnailStub.require().setOnClickListener(passthroughClickListener); mediaThumbnailStub.require().showShade(messageRecord.isDisplayBodyEmpty(getContext()) && !hasExtraText(messageRecord)); - mediaThumbnailStub.require().setImageResource(glideRequests, + mediaThumbnailStub.require().setImageResource(requestManager, thumbnailSlides, showControls, false); @@ -1306,7 +1309,11 @@ private void setMediaAttributes(@NonNull MessageRecord messageRecord, mediaThumbnailStub.require().setStartTransferClickListener(downloadClickListener); } else { mediaThumbnailStub.require().setConversationColor(Color.TRANSPARENT); - mediaThumbnailStub.require().setStartTransferClickListener(new ResendClickListener(messageRecord)); + if (doAnySlidesLackData(slideDeck)) { + mediaThumbnailStub.require().setStartTransferClickListener(downloadClickListener); + } else { + mediaThumbnailStub.require().setStartTransferClickListener(new ResendClickListener(messageRecord)); + } } mediaThumbnailStub.require().setBorderless(false); @@ -1509,8 +1516,8 @@ private void setContactPhoto(@NonNull Recipient recipient) { } }); - contactPhoto.setAvatar(glideRequests, recipient, false); - badgeImageView.setBadgeFromRecipient(recipient, glideRequests); + contactPhoto.setAvatar(requestManager, recipient, false); + badgeImageView.setBadgeFromRecipient(recipient, requestManager); badgeImageView.setClickable(false); } @@ -1539,7 +1546,7 @@ private void linkifyMessageBody(@NonNull Spannable messageBody, } private void setStatusIcons(MessageRecord messageRecord, boolean hasWallpaper) { - bodyText.setCompoundDrawablesWithIntrinsicBounds(0, 0, messageRecord.isKeyExchange() ? R.drawable.ic_menu_login : 0, 0); + bodyText.setCompoundDrawablesWithIntrinsicBounds(0, 0, messageRecord.isKeyExchange() ? R.drawable.symbol_key_24 : 0, 0); if (!messageRecord.isMediaPending() && messageRecord.isFailed()) { alertView.setFailed(); @@ -1573,7 +1580,7 @@ private void setQuote(@NonNull MessageRecord current, @NonNull Optional 0) { if (!isInActiveGroup) { @@ -121,17 +132,13 @@ internal object ConversationOptionsMenu { menuInflater.inflate(R.menu.conversation, menu) - if (isInMessageRequest && !recipient.isBlocked) { - hideMenuItem(menu, R.id.menu_conversation_settings) - } - if (!recipient.isGroup && !isPushAvailable && !recipient.isReleaseNotes) { menuInflater.inflate(R.menu.conversation_insecure, menu) } if (recipient.isMuted) menuInflater.inflate(R.menu.conversation_muted, menu) else menuInflater.inflate(R.menu.conversation_unmuted, menu) - if (!recipient.isGroup && (recipient.contactUri == null) && !recipient.isReleaseNotes && !recipient.isSelf && recipient.hasE164()) { + if (!recipient.isGroup && recipient.contactUri == null && !recipient.isReleaseNotes && !recipient.isSelf && recipient.hasE164() && recipient.shouldShowE164()) { menuInflater.inflate(R.menu.conversation_add_to_contacts, menu) } @@ -139,8 +146,6 @@ internal object ConversationOptionsMenu { if (isPushAvailable) { hideMenuItem(menu, R.id.menu_call_secure) hideMenuItem(menu, R.id.menu_video_secure) - } else { - hideMenuItem(menu, R.id.menu_call_insecure) } hideMenuItem(menu, R.id.menu_mute_notifications) } @@ -151,8 +156,6 @@ internal object ConversationOptionsMenu { hideMenuItem(menu, R.id.menu_video_secure) hideMenuItem(menu, R.id.menu_expiring_messages) hideMenuItem(menu, R.id.menu_expiring_messages_off) - } else { - hideMenuItem(menu, R.id.menu_call_insecure) } hideMenuItem(menu, R.id.menu_mute_notifications) } @@ -197,9 +200,8 @@ internal object ConversationOptionsMenu { override fun onMenuItemSelected(menuItem: MenuItem): Boolean { when (menuItem.itemId) { - R.id.menu_call_secure -> callback.handleDial(true) + R.id.menu_call_secure -> callback.handleDial() R.id.menu_video_secure -> callback.handleVideo() - R.id.menu_call_insecure -> callback.handleDial(false) R.id.menu_view_media -> callback.handleViewMedia() R.id.menu_add_shortcut -> callback.handleAddShortcut() R.id.menu_search -> callback.handleSearch() @@ -214,6 +216,11 @@ internal object ConversationOptionsMenu { R.id.menu_expiring_messages_off, R.id.menu_expiring_messages -> callback.handleSelectMessageExpiration() R.id.menu_create_bubble -> callback.handleCreateBubble() R.id.home -> callback.handleGoHome() + R.id.menu_block -> callback.handleBlock() + R.id.menu_unblock -> callback.handleUnblock() + R.id.menu_report_spam -> callback.handleReportSpam() + R.id.menu_accept -> callback.handleMessageRequestAccept() + R.id.menu_delete_chat -> callback.handleDeleteConversation() R.id.edittext_bold, R.id.edittext_italic, R.id.edittext_strikethrough, @@ -250,7 +257,7 @@ internal object ConversationOptionsMenu { val hasActiveGroupCall: Boolean, val distributionType: Int, val threadId: Long, - val isInMessageRequest: Boolean, + val messageRequestState: MessageRequestState, val isInBubble: Boolean ) @@ -264,7 +271,7 @@ internal object ConversationOptionsMenu { fun onOptionsMenuCreated(menu: Menu) fun handleVideo() - fun handleDial(isSecure: Boolean) + fun handleDial() fun handleViewMedia() fun handleAddShortcut() fun handleSearch() @@ -282,5 +289,10 @@ internal object ConversationOptionsMenu { fun showExpiring(recipient: Recipient) fun clearExpiring() fun handleFormatText(@IdRes id: Int) + fun handleBlock() + fun handleUnblock() + fun handleReportSpam() + fun handleMessageRequestAccept() + fun handleDeleteConversation() } } 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 dae2642e0a..daffed9555 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationStickerSuggestionAdapter.java @@ -8,24 +8,24 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +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.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideRequests; import java.util.ArrayList; import java.util.List; public class ConversationStickerSuggestionAdapter extends RecyclerView.Adapter { - private final GlideRequests glideRequests; + private final RequestManager requestManager; private final EventListener eventListener; private final List stickers; - public ConversationStickerSuggestionAdapter(@NonNull GlideRequests glideRequests, @NonNull EventListener eventListener) { - this.glideRequests = glideRequests; + public ConversationStickerSuggestionAdapter(@NonNull RequestManager requestManager, @NonNull EventListener eventListener) { + this.requestManager = requestManager; this.eventListener = eventListener; this.stickers = new ArrayList<>(); } @@ -37,7 +37,7 @@ public ConversationStickerSuggestionAdapter(@NonNull GlideRequests glideRequests @Override public void onBindViewHolder(@NonNull StickerSuggestionViewHolder viewHolder, int i) { - viewHolder.bind(glideRequests, eventListener, stickers.get(i)); + viewHolder.bind(requestManager, eventListener, stickers.get(i)); } @Override @@ -65,8 +65,8 @@ static class StickerSuggestionViewHolder extends RecyclerView.ViewHolder { this.image = itemView.findViewById(R.id.sticker_suggestion_item_image); } - void bind(@NonNull GlideRequests glideRequests, @NonNull EventListener eventListener, @NonNull StickerRecord sticker) { - glideRequests.load(new DecryptableUri(sticker.getUri())) + void bind(@NonNull RequestManager requestManager, @NonNull EventListener eventListener, @NonNull StickerRecord sticker) { + requestManager.load(new DecryptableUri(sticker.getUri())) .transition(DrawableTransitionOptions.withCrossFade()) .fitCenter() .into(image); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java index cfd3251162..076d9d1ad7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java @@ -17,12 +17,12 @@ import com.annimon.stream.Collectors; import com.annimon.stream.Stream; +import com.bumptech.glide.RequestManager; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.avatar.view.AvatarView; import org.thoughtcrime.securesms.badges.BadgeImageView; import org.thoughtcrime.securesms.database.model.StoryViewState; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.ContextUtil; import org.thoughtcrime.securesms.util.DrawableUtil; @@ -106,7 +106,7 @@ public void clearExpiring() { updateSubtitleVisibility(); } - public void setTitle(@NonNull GlideRequests glideRequests, @Nullable Recipient recipient) { + public void setTitle(@NonNull RequestManager requestManager, @Nullable Recipient recipient) { isSelf = recipient != null && recipient.isSelf(); this.subtitleContainer.setVisibility(View.VISIBLE); @@ -118,7 +118,8 @@ public void setTitle(@NonNull GlideRequests glideRequests, @Nullable Recipient r Drawable endDrawable = null; if (recipient != null && recipient.isBlocked()) { - startDrawable = ContextUtil.requireDrawable(getContext(), R.drawable.ic_block_white_18dp); + startDrawable = ContextUtil.requireDrawable(getContext(), R.drawable.symbol_block_16); + startDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); } else if (recipient != null && recipient.isMuted()) { startDrawable = ContextUtil.requireDrawable(getContext(), R.drawable.ic_bell_disabled_16); startDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); @@ -143,7 +144,7 @@ public void setTitle(@NonNull GlideRequests glideRequests, @Nullable Recipient r title.setCompoundDrawablesRelativeWithIntrinsicBounds(startDrawable, null, endDrawable, null); if (recipient != null) { - this.avatar.displayChatAvatar(glideRequests, recipient, false); + this.avatar.displayChatAvatar(requestManager, recipient, false); } if (recipient == null || recipient.isSelf()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java index 1bdee30bec..5248ec8a51 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -21,9 +21,11 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.Transformations; +import com.bumptech.glide.RequestManager; import com.google.android.material.button.MaterialButton; import com.google.common.collect.Sets; +import org.signal.core.util.concurrent.ListenableFuture; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BindableConversationItem; import org.thoughtcrime.securesms.R; @@ -40,7 +42,6 @@ import org.thoughtcrime.securesms.database.model.UpdateDescription; import org.thoughtcrime.securesms.groups.LiveGroup; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.DateUtils; @@ -50,7 +51,6 @@ import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.thoughtcrime.securesms.verify.VerifyIdentityActivity; import org.whispersystems.signalservice.api.push.ServiceId; @@ -121,7 +121,7 @@ public void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull ConversationMessage conversationMessage, @NonNull Optional previousMessageRecord, @NonNull Optional nextMessageRecord, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull Set batchSelected, @NonNull Recipient conversationRecipient, @@ -560,8 +560,24 @@ private void present(@NonNull ConversationMessage conversationMessage, eventListener.onSendPaymentClicked(conversationMessage.getMessageRecord().getFromRecipient().getId()); } }); + } else if (conversationMessage.getMessageRecord().isReportedSpam()) { + actionButton.setText(R.string.ConversationUpdateItem_learn_more); + actionButton.setVisibility(VISIBLE); + actionButton.setOnClickListener(v -> { + if (batchSelected.isEmpty() && eventListener != null) { + eventListener.onReportSpamLearnMoreClicked(); + } + }); + } else if (conversationMessage.getMessageRecord().isMessageRequestAccepted()) { + actionButton.setText(R.string.ConversationUpdateItem_options); + actionButton.setVisibility(VISIBLE); + actionButton.setOnClickListener(v -> { + if (batchSelected.isEmpty() && eventListener != null) { + eventListener.onMessageRequestAcceptOptionsClicked(); + } + }); // MOLLY: Ensure presentTimer() is called above for call logs - } else{ + } else { actionButton.setVisibility(GONE); actionButton.setOnClickListener(null); if (conversationMessage.getMessageRecord().isCallLog()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt index 55d8ce4c4f..606d2e90d5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ScheduledMessagesBottomSheet.kt @@ -12,6 +12,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.util.StreamUtil import org.signal.core.util.concurrent.LifecycleDisposable @@ -38,7 +39,6 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionPlayerHolder import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionRecycler import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.mms.TextSlide import org.thoughtcrime.securesms.recipients.Recipient @@ -91,7 +91,7 @@ class ScheduledMessagesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment val colorizer = Colorizer() - messageAdapter = ConversationAdapter(requireContext(), viewLifecycleOwner, GlideApp.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), colorizer).apply { + messageAdapter = ConversationAdapter(requireContext(), viewLifecycleOwner, Glide.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), colorizer).apply { setCondensedMode(ConversationItemDisplayMode.Condensed(scheduleMessageMode = true)) } @@ -273,6 +273,9 @@ class ScheduledMessagesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment override fun onActivatePaymentsClicked() = Unit override fun onSendPaymentClicked(recipientId: RecipientId) = Unit override fun onEditedIndicatorClicked(messageRecord: MessageRecord) = Unit + override fun onShowSafetyTips(forGroup: Boolean) = Unit + override fun onReportSpamLearnMoreClicked() = Unit + override fun onMessageRequestAcceptOptionsClicked() = Unit } companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/SignalBottomActionBarController.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/SignalBottomActionBarController.kt index b9d2bba3ca..9b8255cb4a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/SignalBottomActionBarController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/SignalBottomActionBarController.kt @@ -5,10 +5,10 @@ import android.view.ViewTreeObserver import androidx.core.view.doOnPreDraw import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView +import org.signal.core.util.concurrent.ListenableFuture.Listener import org.signal.core.util.dp import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar import org.thoughtcrime.securesms.util.ViewUtil -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener import java.util.concurrent.ExecutionException class SignalBottomActionBarController( diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/NameColors.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/NameColors.kt deleted file mode 100644 index dfd693307c..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/colors/NameColors.kt +++ /dev/null @@ -1,63 +0,0 @@ -package org.thoughtcrime.securesms.conversation.colors - -import androidx.lifecycle.LiveData -import androidx.lifecycle.map -import androidx.lifecycle.switchMap -import com.annimon.stream.Stream -import org.signal.core.util.MapUtil -import org.thoughtcrime.securesms.conversation.colors.ChatColorsPalette.Names.all -import org.thoughtcrime.securesms.groups.GroupId -import org.thoughtcrime.securesms.groups.LiveGroup -import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry.FullMember -import org.thoughtcrime.securesms.recipients.Recipient -import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.DefaultValueLiveData -import java.util.Optional - -object NameColors { - - fun createSessionMembersCache(): MutableMap> { - return mutableMapOf() - } - - fun getNameColorsMapLiveData( - recipientId: LiveData, - sessionMemberCache: MutableMap> - ): LiveData> { - val recipient = recipientId.switchMap { r: RecipientId? -> Recipient.live(r!!).liveData } - val group = recipient.map { obj: Recipient -> obj.groupId } - val groupMembers = group.switchMap { g: Optional -> - g.map { groupId: GroupId -> this.getSessionGroupRecipients(groupId, sessionMemberCache) } - .orElseGet { DefaultValueLiveData(emptySet()) } - } - return groupMembers.map { members: Set? -> - val sorted = Stream.of(members) - .filter { member: Recipient? -> member != Recipient.self() } - .sortBy { obj: Recipient -> obj.requireStringId() } - .toList() - val names = all - val colors: MutableMap = HashMap() - for (i in sorted.indices) { - colors[sorted[i].id] = names[i % names.size] - } - colors - } - } - - private fun getSessionGroupRecipients(groupId: GroupId, sessionMemberCache: MutableMap>): LiveData> { - val fullMembers = LiveGroup(groupId) - .fullMembers - .map { members: List? -> - Stream.of(members) - .map { it.member } - .toList() - } - - return fullMembers.map { currentMembership: List? -> - val cachedMembers: MutableSet = MapUtil.getOrDefault(sessionMemberCache, groupId, HashSet()).toMutableSet() - cachedMembers.addAll(currentMembership!!) - sessionMemberCache[groupId] = cachedMembers - cachedMembers - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt index a88769f7ef..34e9f3b417 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/drafts/DraftRepository.kt @@ -4,6 +4,7 @@ import android.content.Context import android.net.Uri import android.text.Spannable import android.text.SpannableString +import com.bumptech.glide.Glide import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.Base64 @@ -33,7 +34,6 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyboard.KeyboardUtil import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mms.GifSlide -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.ImageSlide import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.mms.QuoteId @@ -97,7 +97,7 @@ class DraftRepository( } if (shareMedia != null && shareContentType != null && borderless) { - val details = KeyboardUtil.getImageDetails(GlideApp.with(context), shareMedia) + val details = KeyboardUtil.getImageDetails(Glide.with(context), shareMedia) if (details == null || !details.hasTransparency) { return ShareOrDraftData.SetMedia(shareMedia, shareMediaType!!, null) to null diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt index 1091efd565..71929a0798 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/quotes/MessageQuotesBottomSheet.kt @@ -10,6 +10,7 @@ import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import org.signal.core.util.concurrent.LifecycleDisposable @@ -35,7 +36,6 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionRecycler import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange import org.thoughtcrime.securesms.linkpreview.LinkPreview -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.BottomSheetUtil @@ -73,7 +73,7 @@ class MessageQuotesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment() { val colorizer = Colorizer() - messageAdapter = ConversationAdapter(requireContext(), viewLifecycleOwner, GlideApp.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), colorizer).apply { + messageAdapter = ConversationAdapter(requireContext(), viewLifecycleOwner, Glide.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), colorizer).apply { setCondensedMode(ConversationItemDisplayMode.Condensed(scheduleMessageMode = false)) } @@ -252,6 +252,10 @@ class MessageQuotesBottomSheet : FixedRoundedCornerBottomSheetDialogFragment() { dismiss() getAdapterListener().onEditedIndicatorClicked(messageRecord) } + + override fun onShowSafetyTips(forGroup: Boolean) = Unit + override fun onReportSpamLearnMoreClicked() = Unit + override fun onMessageRequestAcceptOptionsClicked() = Unit } companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt index c271b0f92a..9eeaa4a573 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/edit/EditMessageHistoryDialog.kt @@ -10,6 +10,7 @@ import androidx.core.view.doOnNextLayout import androidx.fragment.app.FragmentManager import androidx.fragment.app.viewModels import androidx.recyclerview.widget.LinearLayoutManager +import com.bumptech.glide.Glide import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import io.reactivex.rxjava3.kotlin.subscribeBy @@ -36,7 +37,6 @@ import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionPlayerHolder import org.thoughtcrime.securesms.giph.mp4.GiphyMp4ProjectionRecycler import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.BottomSheetUtil @@ -85,7 +85,7 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { val messageAdapter = ConversationAdapter( requireContext(), viewLifecycleOwner, - GlideApp.with(this), + Glide.with(this), Locale.getDefault(), ConversationAdapterListener(), conversationRecipient.hasWallpaper(), @@ -164,6 +164,9 @@ class EditMessageHistoryDialog : FixedRoundedCornerBottomSheetDialogFragment() { override fun onActivatePaymentsClicked() = Unit override fun onSendPaymentClicked(recipientId: RecipientId) = Unit override fun onEditedIndicatorClicked(messageRecord: MessageRecord) = Unit + override fun onShowSafetyTips(forGroup: Boolean) = Unit + override fun onReportSpamLearnMoreClicked() = Unit + override fun onMessageRequestAcceptOptionsClicked() = Unit } companion object { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeAdapter.java index 04606087cb..2faa2558b0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/error/SafetyNumberChangeAdapter.java @@ -64,7 +64,7 @@ void bind(@NonNull ChangedRecipient changedRecipient) { if (changedRecipient.isUnverified() || changedRecipient.isVerified()) { subtitle.setText(R.string.safety_number_change_dialog__previous_verified); - Drawable check = DrawableUtil.tint(ContextUtil.requireDrawable(itemView.getContext(), R.drawable.check), ContextCompat.getColor(itemView.getContext(), R.color.signal_text_secondary)); + Drawable check = DrawableUtil.tint(ContextUtil.requireDrawable(itemView.getContext(), R.drawable.symbol_check_24), ContextCompat.getColor(itemView.getContext(), R.color.signal_text_secondary)); check.setBounds(0, 0, ViewUtil.dpToPx(12), ViewUtil.dpToPx(12)); subtitle.setCompoundDrawables(check, null, null, null); } else if (changedRecipient.getRecipient().hasAUserSetDisplayName(itemView.getContext())) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt index 58715d7ce1..78ae08dab2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt @@ -13,6 +13,7 @@ import androidx.core.view.children import androidx.lifecycle.LifecycleOwner import androidx.media3.common.MediaItem import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager import org.signal.core.util.logging.Log import org.signal.core.util.toOptional import org.thoughtcrime.securesms.BindableConversationItem @@ -49,8 +50,6 @@ import org.thoughtcrime.securesms.databinding.V2ConversationItemTextOnlyOutgoing import org.thoughtcrime.securesms.giph.mp4.GiphyMp4PlaybackPolicyEnforcer import org.thoughtcrime.securesms.groups.v2.GroupDescriptionUtil import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.messagerequests.MessageRequestState -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.CachedInflater @@ -63,7 +62,7 @@ import java.util.Optional class ConversationAdapterV2( private val lifecycleOwner: LifecycleOwner, - override val glideRequests: GlideRequests, + override val requestManager: RequestManager, override val clickListener: ItemClickListener, private var hasWallpaper: Boolean, private val colorizer: Colorizer, @@ -336,7 +335,7 @@ class ConversationAdapterV2( model.conversationMessage, previousMessage, nextMessage, - glideRequests, + requestManager, Locale.getDefault(), _selected, model.conversationMessage.threadRecipient, @@ -364,7 +363,7 @@ class ConversationAdapterV2( model.conversationMessage, previousMessage, nextMessage, - glideRequests, + requestManager, Locale.getDefault(), _selected, model.conversationMessage.threadRecipient, @@ -392,7 +391,7 @@ class ConversationAdapterV2( model.conversationMessage, previousMessage, nextMessage, - glideRequests, + requestManager, Locale.getDefault(), _selected, model.conversationMessage.threadRecipient, @@ -420,7 +419,7 @@ class ConversationAdapterV2( model.conversationMessage, previousMessage, nextMessage, - glideRequests, + requestManager, Locale.getDefault(), _selected, model.conversationMessage.threadRecipient, @@ -448,7 +447,7 @@ class ConversationAdapterV2( model.conversationMessage, previousMessage, nextMessage, - glideRequests, + requestManager, Locale.getDefault(), _selected, model.conversationMessage.threadRecipient, @@ -569,7 +568,7 @@ class ConversationAdapterV2( val (recipient, groupInfo, sharedGroups, messageRequestState) = model.recipientInfo val isSelf = recipient.id == Recipient.self().id - conversationBanner.setAvatar(glideRequests, recipient) + conversationBanner.setAvatar(requestManager, recipient) conversationBanner.showBackgroundBubble(recipient.hasWallpaper()) val title: String = conversationBanner.setTitle(recipient) conversationBanner.setAbout(recipient) @@ -594,13 +593,25 @@ class ConversationAdapterV2( } } - if (sharedGroups.isEmpty() || isSelf) { + conversationBanner.hideButton() + + if (messageRequestState?.isAccepted == false && sharedGroups.isEmpty() && !isSelf && !recipient.isGroup) { + conversationBanner.setDescription(context.getString(R.string.ConversationUpdateItem_no_groups_in_common_review_requests_carefully), R.drawable.symbol_error_circle_24) + conversationBanner.setButton(context.getString(R.string.ConversationFragment_safety_tips)) { + clickListener.onShowSafetyTips(false) + } + } else if (messageRequestState?.isAccepted == false && recipient.isGroup && !groupInfo.hasExistingContacts) { + conversationBanner.setDescription(context.getString(R.string.ConversationUpdateItem_no_contacts_in_this_group_review_requests_carefully), R.drawable.symbol_error_circle_24) + conversationBanner.setButton(context.getString(R.string.ConversationFragment_safety_tips)) { + clickListener.onShowSafetyTips(true) + } + } else if (sharedGroups.isEmpty() || isSelf) { if (TextUtils.isEmpty(groupInfo.description)) { conversationBanner.setLinkifyDescription(false) conversationBanner.hideDescription() } else { conversationBanner.setLinkifyDescription(true) - val linkifyWebLinks = messageRequestState == MessageRequestState.NONE + val linkifyWebLinks = messageRequestState?.isAccepted == true conversationBanner.showDescription() GroupDescriptionUtil.setText( diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationDialogs.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationDialogs.kt index c684454aa7..c99f0b53ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationDialogs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationDialogs.kt @@ -10,12 +10,10 @@ import org.signal.core.util.concurrent.SignalExecutors import org.signal.core.util.concurrent.SimpleTask import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity -import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord.NoGroupsInCommon import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.sms.MessageSender -import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.verify.VerifyIdentityActivity /** @@ -82,24 +80,7 @@ object ConversationDialogs { dialog.show() } - fun displayInMemoryMessageDialog(context: Context, messageRecord: MessageRecord) { - if (messageRecord is NoGroupsInCommon) { - val isGroup = messageRecord.isGroup - MaterialAlertDialogBuilder(context, R.style.ThemeOverlay_Signal_MaterialAlertDialog) - .setMessage( - if (isGroup) { - R.string.GroupsInCommonMessageRequest__none_of_your_contacts_or_people_you_chat_with_are_in_this_group - } else { - R.string.GroupsInCommonMessageRequest__you_have_no_groups_in_common_with_this_person - } - ) - .setNeutralButton(R.string.GroupsInCommonMessageRequest__about_message_requests) { _, _ -> - CommunicationActions.openBrowserLink(context, context.getString(R.string.GroupsInCommonMessageRequest__support_article)) - } - .setPositiveButton(R.string.GroupsInCommonMessageRequest__okay, null) - .show() - } - } + fun displayInMemoryMessageDialog(context: Context, messageRecord: MessageRecord) = Unit fun displayMessageCouldNotBeSentDialog(context: Context, messageRecord: MessageRecord) { MaterialAlertDialogBuilder(context) 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 ee5120066f..4374452628 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 @@ -66,6 +66,7 @@ import androidx.recyclerview.widget.ConcatAdapter import androidx.recyclerview.widget.ConversationLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.BaseTransientBottomBar.Duration import com.google.android.material.snackbar.Snackbar @@ -83,6 +84,7 @@ import org.signal.core.util.PendingIntentFlags import org.signal.core.util.Result import org.signal.core.util.ThreadUtil import org.signal.core.util.concurrent.LifecycleDisposable +import org.signal.core.util.concurrent.ListenableFuture import org.signal.core.util.concurrent.addTo import org.signal.core.util.dp import org.signal.core.util.logging.Log @@ -235,11 +237,9 @@ import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult import org.thoughtcrime.securesms.messagedetails.MessageDetailsFragment import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository -import org.thoughtcrime.securesms.messagerequests.MessageRequestState import org.thoughtcrime.securesms.mms.AttachmentManager import org.thoughtcrime.securesms.mms.AudioSlide import org.thoughtcrime.securesms.mms.GifSlide -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.ImageSlide import org.thoughtcrime.securesms.mms.MediaConstraints import org.thoughtcrime.securesms.mms.QuoteModel @@ -284,6 +284,7 @@ import org.thoughtcrime.securesms.util.Debouncer import org.thoughtcrime.securesms.util.DeleteDialog import org.thoughtcrime.securesms.util.Dialogs import org.thoughtcrime.securesms.util.DrawableUtil +import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.FullscreenHelper import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil @@ -296,7 +297,6 @@ import org.thoughtcrime.securesms.util.StorageUtil import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.WindowUtil -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture import org.thoughtcrime.securesms.util.createActivityViewModel import org.thoughtcrime.securesms.util.doAfterNextLayout import org.thoughtcrime.securesms.util.fragments.requireListener @@ -1132,7 +1132,7 @@ class ConversationFragment : var inputDisabled = true when { inputReadyState.isClientExpired || inputReadyState.isUnauthorized -> disabledInputView.showAsExpiredOrUnauthorized(inputReadyState.isClientExpired, inputReadyState.isUnauthorized) - inputReadyState.messageRequestState != MessageRequestState.NONE && inputReadyState.messageRequestState != MessageRequestState.NONE_HIDDEN -> disabledInputView.showAsMessageRequest(inputReadyState.conversationRecipient, inputReadyState.messageRequestState) + !inputReadyState.messageRequestState.isAccepted -> disabledInputView.showAsMessageRequest(inputReadyState.conversationRecipient, inputReadyState.messageRequestState) inputReadyState.isActiveGroup == false -> disabledInputView.showAsNoLongerAMember() inputReadyState.isRequestingMember == true -> disabledInputView.showAsRequestingMember() inputReadyState.isAnnouncementGroup == true && inputReadyState.isAdmin == false -> disabledInputView.showAsAnnouncementGroupAdminsOnly() @@ -1195,7 +1195,7 @@ class ConversationFragment : ) conversationActivityResultContracts.launchMediaEditor(listOf(media), recipientId, composeText.textTrimmed) } else { - attachmentManager.setMedia(GlideApp.with(this), uri, mediaType, MediaConstraints.getPushMediaConstraints(), width, height) + attachmentManager.setMedia(Glide.with(this), uri, mediaType, MediaConstraints.getPushMediaConstraints(), width, height) } } @@ -1291,7 +1291,7 @@ class ConversationFragment : val titleView = binding.conversationTitleView.root - titleView.setTitle(GlideApp.with(this), recipient) + titleView.setTitle(Glide.with(this), recipient) if (recipient.expiresInSeconds > 0) { titleView.showExpiring(recipient) } else { @@ -1435,7 +1435,7 @@ class ConversationFragment : is ShareOrDraftData.SetLocation -> attachmentManager.setLocation(data.location, MediaConstraints.getPushMediaConstraints()) is ShareOrDraftData.SetEditMessage -> { composeText.setDraftText(data.draftText) - inputPanel.enterEditMessageMode(GlideApp.with(this), data.messageEdit, true) + inputPanel.enterEditMessageMode(Glide.with(this), data.messageEdit, true) } is ShareOrDraftData.SetMedia -> { @@ -1523,7 +1523,7 @@ class ConversationFragment : adapter = ConversationAdapterV2( lifecycleOwner = viewLifecycleOwner, - glideRequests = GlideApp.with(this), + requestManager = Glide.with(this), clickListener = ConversationItemClickListener(), hasWallpaper = args.wallpaper != null, colorizer = colorizer, @@ -1531,7 +1531,7 @@ class ConversationFragment : chatColorsDataProvider = viewModel::chatColorsSnapshot ) - typingIndicatorAdapter = ConversationTypingIndicatorAdapter(GlideApp.with(this)) + typingIndicatorAdapter = ConversationTypingIndicatorAdapter(Glide.with(this)) scrollToPositionDelegate = ScrollToPositionDelegate( recyclerView = binding.conversationItemRecycler, @@ -1629,7 +1629,7 @@ class ConversationFragment : } else if (state.hasLinks() && !state.linkPreview.isPresent) { inputPanel.setLinkPreviewNoPreview(state.error) } else { - inputPanel.setLinkPreview(GlideApp.with(this), state.linkPreview) + inputPanel.setLinkPreview(Glide.with(this), state.linkPreview) } updateToggleButtonState() @@ -1646,7 +1646,7 @@ class ConversationFragment : val keyboardPage = when (keyboardMode) { TextSecurePreferences.MediaKeyboardMode.EMOJI -> if (isSystemEmojiPreferred) KeyboardPage.STICKER else KeyboardPage.EMOJI TextSecurePreferences.MediaKeyboardMode.STICKER -> KeyboardPage.STICKER - TextSecurePreferences.MediaKeyboardMode.GIF -> KeyboardPage.GIF + TextSecurePreferences.MediaKeyboardMode.GIF -> if (FeatureFlags.gifSearchAvailable()) KeyboardPage.GIF else KeyboardPage.STICKER } inputPanel.setMediaKeyboardToggleMode(keyboardPage) @@ -1833,7 +1833,7 @@ class ConversationFragment : composeTextEventsListener?.typingStatusEnabled = false composeText.setText("") composeTextEventsListener?.typingStatusEnabled = true - attachmentManager.clear(GlideApp.with(this@ConversationFragment), false) + attachmentManager.clear(Glide.with(this@ConversationFragment), false) inputPanel.clearQuote() } scrollToPositionDelegate.markListCommittedVersion() @@ -2066,6 +2066,128 @@ class ConversationFragment : composeText.clearFocus() } + //region Message Request Helpers + + @SuppressLint("CheckResult") + private fun onReportSpam() { + val recipient = viewModel.recipientSnapshot + if (recipient == null) { + Log.w(TAG, "[onBlockClicked] No recipient!") + return + } + + BlockUnblockDialog.showReportSpamFor( + requireContext(), + lifecycle, + recipient, + { + messageRequestViewModel + .onReportSpam() + .doOnSubscribe { binding.conversationDisabledInput.showBusy() } + .doOnTerminate { binding.conversationDisabledInput.hideBusy() } + .subscribeBy { + Log.d(TAG, "report spam complete") + toast(R.string.ConversationFragment_reported_as_spam) + } + }, + if (recipient.isBlocked) { + null + } else { + Runnable { + messageRequestViewModel + .onBlockAndReportSpam() + .doOnSubscribe { binding.conversationDisabledInput.showBusy() } + .doOnTerminate { binding.conversationDisabledInput.hideBusy() } + .subscribeBy { result -> + when (result) { + is Result.Success -> { + Log.d(TAG, "report spam complete") + toast(R.string.ConversationFragment_reported_as_spam_and_blocked) + } + is Result.Failure -> { + Log.d(TAG, "report spam failed ${result.failure}") + toast(GroupErrors.getUserDisplayMessage(result.failure)) + } + } + } + } + } + ) + } + + @SuppressLint("CheckResult") + private fun onBlock() { + val recipient = viewModel.recipientSnapshot + if (recipient == null) { + Log.w(TAG, "[onBlockClicked] No recipient!") + return + } + + BlockUnblockDialog.showBlockFor( + requireContext(), + lifecycle, + recipient + ) { + messageRequestViewModel + .onBlock() + .subscribeWithShowProgress("block") + } + } + + @SuppressLint("CheckResult") + private fun onUnblock() { + val recipient = viewModel.recipientSnapshot + if (recipient == null) { + Log.w(TAG, "[onUnblockClicked] No recipient!") + return + } + + BlockUnblockDialog.showUnblockFor( + requireContext(), + lifecycle, + recipient + ) { + messageRequestViewModel + .onUnblock() + .subscribeWithShowProgress("unblock") + } + } + + private fun onMessageRequestAccept() { + messageRequestViewModel + .onAccept() + .subscribeWithShowProgress("accept message request") + .addTo(disposables) + } + + private fun onDeleteConversation() { + val recipient = viewModel.recipientSnapshot + if (recipient == null) { + Log.w(TAG, "[onDeleteConversation] No recipient!") + return + } + + ConversationDialogs.displayDeleteDialog(requireContext(), recipient) { + messageRequestViewModel + .onDelete() + .subscribeWithShowProgress("delete message request") + } + } + + private fun Single>.subscribeWithShowProgress(logMessage: String): Disposable { + return doOnSubscribe { binding.conversationDisabledInput.showBusy() } + .doOnTerminate { binding.conversationDisabledInput.hideBusy() } + .subscribeBy { result -> + when (result) { + is Result.Success -> Log.d(TAG, "$logMessage complete") + is Result.Failure -> { + Log.d(TAG, "$logMessage failed ${result.failure}") + toast(GroupErrors.getUserDisplayMessage(result.failure)) + } + } + } + } + private inner class BackPressedDelegate : OnBackPressedCallback(true) { override fun handleOnBackPressed() { Log.d(TAG, "onBackPressed()") @@ -2082,6 +2204,8 @@ class ConversationFragment : } } + // endregion + //region Message action handling private fun handleReplyToMessage(conversationMessage: ConversationMessage) { @@ -2097,7 +2221,7 @@ class ConversationFragment : val author = conversationMessage.messageRecord.fromRecipient inputPanel.setQuote( - GlideApp.with(this), + Glide.with(this), conversationMessage.messageRecord.dateSent, author, body, @@ -2115,7 +2239,7 @@ class ConversationFragment : viewModel.resolveMessageToEdit(conversationMessage) .subscribeBy { updatedMessage -> - inputPanel.enterEditMessageMode(GlideApp.with(this), updatedMessage, false) + inputPanel.enterEditMessageMode(Glide.with(this), updatedMessage, false) } .addTo(disposables) } @@ -2921,6 +3045,31 @@ class ConversationFragment : CommunicationActions.startVideoCall(this@ConversationFragment, callLinkRootKey) } + override fun onShowSafetyTips(forGroup: Boolean) { + SafetyTipsBottomSheetDialog.show(childFragmentManager, forGroup) + } + + override fun onReportSpamLearnMoreClicked() { + MaterialAlertDialogBuilder(requireContext()) + .setTitle(R.string.ConversationFragment_reported_spam) + .setMessage(R.string.ConversationFragment_reported_spam_message) + .setPositiveButton(android.R.string.ok, null) + .show() + } + + override fun onMessageRequestAcceptOptionsClicked() { + val recipient: Recipient? = viewModel.recipientSnapshot + + if (recipient != null) { + MaterialAlertDialogBuilder(requireContext()) + .setMessage(getString(R.string.ConversationFragment_you_accepted_a_message_request_from_s, recipient.getDisplayName(requireContext()))) + .setPositiveButton(R.string.ConversationFragment_block) { _, _ -> onBlock() } + .setNegativeButton(R.string.ConversationFragment_report_spam) { _, _ -> onReportSpam() } + .setNeutralButton(R.string.ConversationFragment__cancel, null) + .show() + } + } + private fun MessageRecord.getAudioUriForLongClick(): Uri? { val playbackState = getVoiceNoteMediaController().voiceNotePlaybackState.value if (playbackState == null || !playbackState.isPlaying) { @@ -2950,7 +3099,7 @@ class ConversationFragment : hasActiveGroupCall = groupCallViewModel.hasOngoingGroupCallSnapshot, distributionType = args.distributionType, threadId = args.threadId, - isInMessageRequest = viewModel.hasMessageRequestState, + messageRequestState = viewModel.messageRequestState, isInBubble = args.conversationScreenType.isInBubble ) } @@ -3033,14 +3182,9 @@ class ConversationFragment : this@ConversationFragment.handleVideoCall() } - override fun handleDial(isSecure: Boolean) { + override fun handleDial() { val recipient: Recipient = viewModel.recipientSnapshot ?: return - - if (isSecure) { - CommunicationActions.startVoiceCall(this@ConversationFragment, recipient) - } else { - CommunicationActions.startInsecureCall(this@ConversationFragment, recipient) - } + CommunicationActions.startVoiceCall(this@ConversationFragment, recipient) } override fun handleViewMedia() { @@ -3064,7 +3208,7 @@ class ConversationFragment : requireActivity().registerReceiver(pinnedShortcutReceiver, IntentFilter(ACTION_PINNED_SHORTCUT)) } - viewModel.getContactPhotoIcon(requireContext(), GlideApp.with(this@ConversationFragment)) + viewModel.getContactPhotoIcon(requireContext(), Glide.with(this@ConversationFragment)) .subscribe { infoCompat -> val intent = Intent(ACTION_PINNED_SHORTCUT) val callback = PendingIntent.getBroadcast(requireContext(), 902, intent, PendingIntentFlags.mutable()) @@ -3183,6 +3327,26 @@ class ConversationFragment : override fun handleFormatText(id: Int) { composeText.handleFormatText(id) } + + override fun handleBlock() { + onBlock() + } + + override fun handleUnblock() { + onUnblock() + } + + override fun handleReportSpam() { + onReportSpam() + } + + override fun handleMessageRequestAccept() { + onMessageRequestAccept() + } + + override fun handleDeleteConversation() { + onDeleteConversation() + } } private inner class OnReactionsSelectedListener : ConversationReactionOverlay.OnReactionSelectedListener { @@ -3439,7 +3603,7 @@ class ConversationFragment : .toTypedArray() MaterialAlertDialogBuilder(requireContext()) - .setIcon(R.drawable.ic_warning) + .setIcon(R.drawable.symbol_error_triangle_fill_24) .setTitle(R.string.ConversationFragment__no_longer_verified) .setItems(unverifiedNames) { _, which: Int -> VerifyIdentityActivity.startOrShowExchangeMessagesDialog(requireContext(), unverifiedIdentities[which], false) } .show() @@ -3494,66 +3658,23 @@ class ConversationFragment : } override fun onAcceptMessageRequestClicked() { - messageRequestViewModel - .onAccept() - .subscribeWithShowProgress("accept message request") - .addTo(disposables) + onMessageRequestAccept() } - override fun onDeleteGroupClicked() { - val recipient = viewModel.recipientSnapshot - if (recipient == null) { - Log.w(TAG, "[onDeleteGroupClicked] No recipient!") - return - } - - ConversationDialogs.displayDeleteDialog(requireContext(), recipient) { - messageRequestViewModel - .onDelete() - .subscribeWithShowProgress("delete message request") - } + override fun onDeleteClicked() { + onDeleteConversation() } override fun onBlockClicked() { - val recipient = viewModel.recipientSnapshot - if (recipient == null) { - Log.w(TAG, "[onBlockClicked] No recipient!") - return - } - - BlockUnblockDialog.showBlockAndReportSpamFor( - requireContext(), - lifecycle, - recipient, - { - messageRequestViewModel - .onBlock() - .subscribeWithShowProgress("block") - }, - { - messageRequestViewModel - .onBlockAndReportSpam() - .subscribeWithShowProgress("block") - } - ) + onBlock() } override fun onUnblockClicked() { - val recipient = viewModel.recipientSnapshot - if (recipient == null) { - Log.w(TAG, "[onUnblockClicked] No recipient!") - return - } + onUnblock() + } - BlockUnblockDialog.showUnblockFor( - requireContext(), - lifecycle, - recipient - ) { - messageRequestViewModel - .onUnblock() - .subscribeWithShowProgress("unblock") - } + override fun onReportSpamClicked() { + onReportSpam() } override fun onInviteToSignal(recipient: Recipient) { @@ -3568,20 +3689,6 @@ class ConversationFragment : override fun onUnmuteReleaseNotesChannel() { viewModel.muteConversation(0L) } - - private fun Single>.subscribeWithShowProgress(logMessage: String): Disposable { - return doOnSubscribe { binding.conversationDisabledInput.showBusy() } - .doOnTerminate { binding.conversationDisabledInput.hideBusy() } - .subscribeBy { result -> - when (result) { - is Result.Success -> Log.d(TAG, "$logMessage complete") - is Result.Failure -> { - Log.d(TAG, "$logMessage failed ${result.failure}") - toast(GroupErrors.getUserDisplayMessage(result.failure)) - } - } - } - } } //endregion 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 2d870a9d21..980b27c5c1 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 @@ -13,6 +13,8 @@ import android.os.Build import android.text.SpannableStringBuilder import androidx.core.content.pm.ShortcutInfoCompat import androidx.core.graphics.drawable.IconCompat +import com.bumptech.glide.Glide +import com.bumptech.glide.RequestManager import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -75,8 +77,6 @@ import org.thoughtcrime.securesms.keyboard.KeyboardUtil import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.messagerequests.MessageRequestState -import org.thoughtcrime.securesms.mms.GlideApp -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.mms.OutgoingMessage import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.mms.QuoteModel @@ -123,7 +123,7 @@ class ConversationRepository( */ fun getKeyboardImageDetails(uri: Uri): Maybe { return MaybeCompat.fromCallable { - KeyboardUtil.getImageDetails(GlideApp.with(applicationContext), uri) + KeyboardUtil.getImageDetails(Glide.with(applicationContext), uri) }.subscribeOn(Schedulers.io()) } @@ -366,7 +366,7 @@ class ConversationRepository( fun getRequestReviewState(recipient: Recipient, group: GroupRecord?, messageRequest: MessageRequestState): Single { return Single.fromCallable { - if (group == null && messageRequest != MessageRequestState.INDIVIDUAL) { + if (group == null && messageRequest.state != MessageRequestState.State.INDIVIDUAL) { return@fromCallable RequestReviewState() } @@ -474,12 +474,12 @@ class ConversationRepository( .joinTo(buffer = SpannableStringBuilder(), separator = "\n") } - fun getRecipientContactPhotoBitmap(context: Context, glideRequests: GlideRequests, recipient: Recipient): Single { + fun getRecipientContactPhotoBitmap(context: Context, requestManager: RequestManager, recipient: Recipient): Single { val fallback = recipient.fallbackContactPhoto.asDrawable(context, recipient.avatarColor, false) return Single .create { emitter -> - glideRequests + requestManager .asBitmap() .load(recipient.contactPhoto) .error(fallback) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter.kt index 30b3c258a2..d3046e72f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationTypingIndicatorAdapter.kt @@ -8,14 +8,14 @@ package org.thoughtcrime.securesms.conversation.v2 import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager import org.signal.core.util.toInt import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ConversationTypingView -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.recipients.Recipient class ConversationTypingIndicatorAdapter( - private val glideRequests: GlideRequests + private val requestManager: RequestManager ) : RecyclerView.Adapter() { private var state: State = State() @@ -42,16 +42,16 @@ class ConversationTypingIndicatorAdapter( override fun getItemCount(): Int = state.typists.isNotEmpty().toInt() override fun onBindViewHolder(holder: ViewHolder, position: Int) { - holder.bind(glideRequests, state) + holder.bind(requestManager, state) } class ViewHolder(private val conversationTypingView: ConversationTypingView) : RecyclerView.ViewHolder(conversationTypingView) { fun bind( - glideRequests: GlideRequests, + requestManager: RequestManager, state: State ) { conversationTypingView.setTypists( - glideRequests, + requestManager, state.typists, state.isGroupThread, state.hasWallpaper 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 3fb1ee2173..4832fe438b 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 @@ -11,6 +11,7 @@ import android.net.Uri import android.os.Build import androidx.core.content.pm.ShortcutInfoCompat import androidx.lifecycle.ViewModel +import com.bumptech.glide.RequestManager import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Completable @@ -58,7 +59,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository import org.thoughtcrime.securesms.messagerequests.MessageRequestState -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.mms.QuoteModel import org.thoughtcrime.securesms.mms.Slide import org.thoughtcrime.securesms.mms.SlideDeck @@ -132,9 +132,11 @@ class ConversationViewModel( private val _inputReadyState: Observable val inputReadyState: Observable - private val hasMessageRequestStateSubject: BehaviorSubject = BehaviorSubject.createDefault(false) + private val hasMessageRequestStateSubject: BehaviorSubject = BehaviorSubject.createDefault(MessageRequestState()) val hasMessageRequestState: Boolean - get() = hasMessageRequestStateSubject.value ?: false + get() = hasMessageRequestStateSubject.value?.state != MessageRequestState.State.NONE + val messageRequestState: MessageRequestState + get() = hasMessageRequestStateSubject.value ?: MessageRequestState() private val refreshReminder: Subject = PublishSubject.create() val reminder: Observable> @@ -239,7 +241,7 @@ class ConversationViewModel( isUnauthorized = TextSecurePreferences.isUnauthorizedReceived(ApplicationDependencies.getApplication()) ) }.doOnNext { - hasMessageRequestStateSubject.onNext(it.messageRequestState != MessageRequestState.NONE) + hasMessageRequestStateSubject.onNext(it.messageRequestState) } inputReadyState = _inputReadyState.observeOn(AndroidSchedulers.mainThread()) @@ -348,9 +350,9 @@ class ConversationViewModel( .addTo(disposables) } - fun getContactPhotoIcon(context: Context, glideRequests: GlideRequests): Single { + fun getContactPhotoIcon(context: Context, requestManager: RequestManager): Single { return recipient.firstOrError().flatMap { - repository.getRecipientContactPhotoBitmap(context, glideRequests, it) + repository.getRecipientContactPhotoBitmap(context, requestManager, it) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt index 94cca3146c..17a0c7ca48 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt @@ -17,7 +17,6 @@ import androidx.core.content.ContextCompat import com.google.android.material.button.MaterialButton import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.messagerequests.MessageRequestState -import org.thoughtcrime.securesms.messagerequests.MessageRequestViewModel import org.thoughtcrime.securesms.messagerequests.MessageRequestsBottomView import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.SpanUtil @@ -80,13 +79,14 @@ class DisabledInputView @JvmOverloads constructor( existingView = messageRequestView, create = { MessageRequestsBottomView(context) }, bind = { - setMessageData(MessageRequestViewModel.MessageData(recipient, messageRequestState)) + setMessageRequestData(recipient, messageRequestState) setWallpaperEnabled(recipient.hasWallpaper()) setAcceptOnClickListener { listener?.onAcceptMessageRequestClicked() } - setDeleteOnClickListener { listener?.onDeleteGroupClicked() } + setDeleteOnClickListener { listener?.onDeleteClicked() } setBlockOnClickListener { listener?.onBlockClicked() } setUnblockOnClickListener { listener?.onUnblockClicked() } + setReportOnClickListener { listener?.onReportSpamClicked() } } ) } @@ -226,10 +226,11 @@ class DisabledInputView @JvmOverloads constructor( fun onCancelGroupRequestClicked() fun onShowAdminsBottomSheetDialog() fun onAcceptMessageRequestClicked() - fun onDeleteGroupClicked() + fun onDeleteClicked() fun onBlockClicked() fun onUnblockClicked() fun onInviteToSignal(recipient: Recipient) fun onUnmuteReleaseNotesChannel() + fun onReportSpamClicked() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageRequestViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageRequestViewModel.kt index cfdd8704b7..9e330eeed3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageRequestViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/MessageRequestViewModel.kt @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.conversation.v2 import androidx.lifecycle.ViewModel import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import org.signal.core.util.Result import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason @@ -57,6 +58,14 @@ class MessageRequestViewModel( .observeOn(AndroidSchedulers.mainThread()) } + fun onReportSpam(): Completable { + return recipientId + .flatMapCompletable { recipientId -> + messageRequestRepository.reportSpamMessageRequest(recipientId, threadId) + } + .observeOn(AndroidSchedulers.mainThread()) + } + fun onBlockAndReportSpam(): Single> { return recipientId .flatMap { recipientId -> diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/SafetyTipsBottomSheetDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/SafetyTipsBottomSheetDialog.kt new file mode 100644 index 0000000000..a5d7ce0d87 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/SafetyTipsBottomSheetDialog.kt @@ -0,0 +1,277 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.conversation.v2 + +import android.content.res.Configuration +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.rememberNestedScrollInteropConnection +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.core.os.bundleOf +import androidx.fragment.app.FragmentManager +import kotlinx.coroutines.launch +import org.signal.core.ui.BottomSheets +import org.signal.core.ui.Buttons +import org.signal.core.ui.theme.SignalTheme +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.compose.ComposeBottomSheetDialogFragment + +/** + * Shows tips about typical spam and fraud messages. + */ +class SafetyTipsBottomSheetDialog : ComposeBottomSheetDialogFragment() { + companion object { + private const val FOR_GROUP_ARG = "for_group" + + fun show(fragmentManager: FragmentManager, forGroup: Boolean) { + SafetyTipsBottomSheetDialog() + .apply { + arguments = bundleOf( + FOR_GROUP_ARG to forGroup + ) + } + .show(fragmentManager, "SAFETY_TIPS") + } + } + + override val peekHeightPercentage: Float = 1f + + @Composable + override fun SheetContent() { + val nestedScrollInterop = rememberNestedScrollInteropConnection() + SafetyTipsContent( + forGroup = requireArguments().getBoolean(FOR_GROUP_ARG, false), + modifier = Modifier.nestedScroll(nestedScrollInterop) + ) + } +} + +data class SafetyTipData( + @DrawableRes val heroImage: Int, + @StringRes val titleText: Int, + @StringRes val messageText: Int +) + +private val tips = listOf( + SafetyTipData(heroImage = R.drawable.safety_tip1, titleText = R.string.SafetyTips_tip1_title, messageText = R.string.SafetyTips_tip1_message), + SafetyTipData(heroImage = R.drawable.safety_tip2, titleText = R.string.SafetyTips_tip2_title, messageText = R.string.SafetyTips_tip2_message), + SafetyTipData(heroImage = R.drawable.safety_tip3, titleText = R.string.SafetyTips_tip3_title, messageText = R.string.SafetyTips_tip3_message), + SafetyTipData(heroImage = R.drawable.safety_tip4, titleText = R.string.SafetyTips_tip4_title, messageText = R.string.SafetyTips_tip4_message) +) + +@Preview +@Composable +private fun SafetyTipsContentPreview() { + SignalTheme { + Surface { + SafetyTipsContent() + } + } +} + +@OptIn(ExperimentalFoundationApi::class) +@Composable +private fun SafetyTipsContent(forGroup: Boolean = false, modifier: Modifier = Modifier) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier.fillMaxWidth() + ) { + BottomSheets.Handle() + } + + val size = remember { tips.size } + val pagerState = rememberPagerState( + pageCount = { size } + ) + val scrollState = rememberScrollState() + + Column( + modifier = Modifier.fillMaxWidth() + ) { + Column( + modifier = modifier + .fillMaxWidth() + .weight(weight = 1f, fill = false) + .padding(top = 22.dp) + .verticalScroll(state = scrollState) + ) { + Text( + text = stringResource(id = R.string.SafetyTips_title), + style = MaterialTheme.typography.headlineMedium.copy(textAlign = TextAlign.Center), + modifier = Modifier + .padding(start = 24.dp, end = 24.dp, bottom = 4.dp, top = 26.dp) + .fillMaxWidth() + ) + + Text( + text = if (forGroup) stringResource(id = R.string.SafetyTips_subtitle_group) else stringResource(id = R.string.SafetyTips_subtitle_individual), + style = MaterialTheme.typography.bodyMedium.copy(color = MaterialTheme.colorScheme.onSurfaceVariant), + modifier = Modifier + .padding(start = 36.dp, end = 36.dp) + .fillMaxWidth() + ) + + HorizontalPager( + state = pagerState, + beyondBoundsPageCount = size, + modifier = Modifier.padding(top = 24.dp) + ) { + SafetyTip(tips[it]) + } + + Row( + Modifier + .fillMaxWidth() + .padding(top = 20.dp), + horizontalArrangement = Arrangement.Center + ) { + repeat(pagerState.pageCount) { iteration -> + val color = if (pagerState.currentPage == iteration) { + MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.8f) + } else { + MaterialTheme.colorScheme.onSecondaryContainer.copy(alpha = 0.3f) + } + Box( + modifier = Modifier + .padding(3.dp) + .clip(CircleShape) + .background(color) + .size(8.dp) + ) + } + } + } + + Surface( + shadowElevation = if (scrollState.canScrollForward) 8.dp else 0.dp, + modifier = Modifier.fillMaxWidth(), + color = SignalTheme.colors.colorSurface1, + contentColor = MaterialTheme.colorScheme.onSurface + ) { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + modifier = Modifier + .padding(start = 24.dp, end = 24.dp, bottom = 36.dp, top = 24.dp) + .fillMaxWidth() + ) { + val coroutineScope = rememberCoroutineScope() + + TextButton( + onClick = { + coroutineScope.launch { + pagerState.animateScrollToPage(pagerState.currentPage - 1) + } + }, + enabled = pagerState.currentPage > 0, + modifier = Modifier + ) { + Text(text = stringResource(id = R.string.SafetyTips_previous_tip)) + } + + Buttons.LargeTonal( + onClick = { + coroutineScope.launch { + pagerState.animateScrollToPage(pagerState.currentPage + 1) + } + }, + enabled = pagerState.currentPage + 1 < pagerState.pageCount + ) { + Text(text = stringResource(id = R.string.SafetyTips_next_tip)) + } + } + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun SafetyTipPreview() { + SignalTheme { + Surface { + SafetyTip(tips[0]) + } + } +} + +@Composable +private fun SafetyTip(safetyTip: SafetyTipData) { + Surface( + shape = RoundedCornerShape(18.dp), + color = colorResource(id = R.color.safety_tip_background), + contentColor = MaterialTheme.colorScheme.onSurface, + modifier = Modifier + .fillMaxWidth() + .padding(start = 24.dp, end = 24.dp) + ) { + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = Modifier + .fillMaxWidth() + ) { + Surface( + shape = RoundedCornerShape(12.dp), + color = colorResource(id = R.color.safety_tip_image_background), + modifier = Modifier + .padding(12.dp) + .fillMaxWidth() + ) { + Image( + painter = painterResource(id = safetyTip.heroImage), + contentDescription = null, + modifier = Modifier + .padding(16.dp) + ) + } + + Text( + text = stringResource(id = safetyTip.titleText), + style = MaterialTheme.typography.titleMedium, + modifier = Modifier + .padding(start = 24.dp, end = 24.dp, top = 8.dp, bottom = 4.dp) + ) + + Text( + text = stringResource(id = safetyTip.messageText), + style = MaterialTheme.typography.bodyLarge.copy(color = MaterialTheme.colorScheme.onSurfaceVariant, textAlign = TextAlign.Center), + modifier = Modifier + .padding(start = 24.dp, end = 24.dp, bottom = 24.dp) + ) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt index ac470e45d8..317e4d6907 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource.kt @@ -15,7 +15,6 @@ import org.thoughtcrime.securesms.conversation.ConversationMessage import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory import org.thoughtcrime.securesms.database.MessageTable import org.thoughtcrime.securesms.database.SignalDatabase -import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord.NoGroupsInCommon import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord.RemovedContactHidden import org.thoughtcrime.securesms.database.model.InMemoryMessageRecord.UniversalExpireTimerUpdate import org.thoughtcrime.securesms.database.model.MessageRecord @@ -72,7 +71,6 @@ class ConversationDataSource( val startTime = System.currentTimeMillis() val size: Int = getSizeInternal() + THREAD_HEADER_COUNT + - messageRequestData.includeWarningUpdateMessage().toInt() + messageRequestData.isHidden.toInt() + showUniversalExpireTimerUpdate.toInt() @@ -108,10 +106,6 @@ class ConversationDataSource( } } - if (messageRequestData.includeWarningUpdateMessage() && (start + length >= totalSize)) { - records.add(NoGroupsInCommon(threadId, messageRequestData.isGroup)) - } - if (messageRequestData.isHidden && (start + length >= totalSize)) { records.add(RemovedContactHidden(threadId)) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout.kt new file mode 100644 index 0000000000..b51192149f --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/ShrinkWrapLinearLayout.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.conversation.v2.items + +import android.content.Context +import android.util.AttributeSet +import androidx.appcompat.widget.LinearLayoutCompat + +/** + * Custom LinearLayoutCompat that will intercept EXACTLY measure-specs and + * overwrite them with AT_MOST. This guarantees that wrap_content is respected + * when the Layout is within a constraintlayout. + */ +class ShrinkWrapLinearLayout @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null +) : LinearLayoutCompat(context, attrs) { + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val shrinkWrapWidthSpec = shrinkWrapWidthMeasureSpec(widthMeasureSpec) + super.onMeasure(shrinkWrapWidthSpec, heightMeasureSpec) + } + + private fun shrinkWrapWidthMeasureSpec(widthMeasureSpec: Int): Int { + val mode = MeasureSpec.getMode(widthMeasureSpec) + val size = MeasureSpec.getSize(widthMeasureSpec) + + return if (mode == MeasureSpec.EXACTLY) { + MeasureSpec.makeMeasureSpec(size, MeasureSpec.AT_MOST) + } else { + widthMeasureSpec + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext.kt index 405201bb9d..e58f6c9792 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationContext.kt @@ -5,19 +5,19 @@ package org.thoughtcrime.securesms.conversation.v2.items +import com.bumptech.glide.RequestManager import org.thoughtcrime.securesms.conversation.ConversationAdapter import org.thoughtcrime.securesms.conversation.ConversationItemDisplayMode import org.thoughtcrime.securesms.conversation.colors.Colorizer import org.thoughtcrime.securesms.conversation.mutiselect.MultiselectPart import org.thoughtcrime.securesms.database.model.MessageRecord -import org.thoughtcrime.securesms.mms.GlideRequests /** * Describes the Adapter "context" that would normally have been * visible to an inner class. */ interface V2ConversationContext { - val glideRequests: GlideRequests + val requestManager: RequestManager val displayMode: ConversationItemDisplayMode val clickListener: ConversationAdapter.ItemClickListener val selectedItems: Set diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemMediaViewHolder.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemMediaViewHolder.kt index 2872734938..418a8204f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemMediaViewHolder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemMediaViewHolder.kt @@ -77,7 +77,7 @@ class V2ConversationItemMediaViewHolder>( binding.quoteStub.visibility = View.VISIBLE quoteView.setQuote( - conversationContext.glideRequests, + conversationContext.requestManager, quote.id, Recipient.live(quote.author).get(), quote.displayText, diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt index d45c80de5b..3bf35b4e9f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder.kt @@ -531,8 +531,8 @@ open class V2ConversationItemTextOnlyViewHolder>( binding.senderBadge.visible = shape.isEndingShape binding.senderName.text = sender.getDisplayName(context) - binding.senderPhoto.setAvatar(conversationContext.glideRequests, sender, false) - binding.senderBadge.setBadgeFromRecipient(sender, conversationContext.glideRequests) + binding.senderPhoto.setAvatar(conversationContext.requestManager, sender, false) + binding.senderBadge.setBadgeFromRecipient(sender, conversationContext.requestManager) binding.senderPhoto.setOnClickListener { conversationContext.clickListener.onGroupMemberClicked( conversationMessage.messageRecord.fromRecipient.id, @@ -560,7 +560,7 @@ open class V2ConversationItemTextOnlyViewHolder>( binding.body.setCompoundDrawablesWithIntrinsicBounds( 0, 0, - if (record.isKeyExchange) R.drawable.ic_menu_login else 0, + if (record.isKeyExchange) R.drawable.symbol_key_24 else 0, 0 ) @@ -632,6 +632,9 @@ open class V2ConversationItemTextOnlyViewHolder>( } binding.footerDate.setText(errorMessage) + binding.footerDate.setOnClickListener { + conversationContext.clickListener.onMessageWithErrorClicked(record) + } } else if (record.isPendingInsecureSmsFallback) { binding.footerDate.setText(R.string.ConversationItem_click_to_approve_unencrypted) } else if (record.isRateLimited) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemThumbnail.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemThumbnail.kt index 256b28d3ec..b08531473f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemThumbnail.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemThumbnail.kt @@ -115,10 +115,10 @@ class V2ConversationItemThumbnail @JvmOverloads constructor( thumbnailSlide = thumbnail this.fastPreflightId = fastPreflightId - conversationContext.glideRequests.clear(this) + conversationContext.requestManager.clear(this) if (placeholderTarget != null) { - conversationContext.glideRequests.clear(placeholderTarget) + conversationContext.requestManager.clear(placeholderTarget) } val thumbnailUri = thumbnail.uri @@ -147,7 +147,7 @@ class V2ConversationItemThumbnail @JvmOverloads constructor( if (thumbnailBlur != null) { val placeholderTarget = PlaceholderTarget(this) conversationContext - .glideRequests + .requestManager .load(thumbnailBlur) .centerInside() .dontAnimate() @@ -159,7 +159,7 @@ class V2ConversationItemThumbnail @JvmOverloads constructor( if (thumbnailUri != null) { conversationContext - .glideRequests + .requestManager .load(DecryptableStreamUriLoader.DecryptableUri(thumbnailUri)) .centerInside() .dontAnimate() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java index e9962a59fe..3e065e3430 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListAdapter.java @@ -13,13 +13,13 @@ import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.signal.paging.PagingController; import org.thoughtcrime.securesms.BindableConversationListItem; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.conversationlist.model.Conversation; -import org.thoughtcrime.securesms.conversationlist.model.ConversationReader; import org.thoughtcrime.securesms.conversationlist.model.ConversationSet; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.CachedInflater; import org.thoughtcrime.securesms.util.ViewUtil; @@ -46,8 +46,8 @@ private enum Payload { } private final LifecycleOwner lifecycleOwner; - private final GlideRequests glideRequests; - private final OnConversationClickListener onConversationClickListener; + private final RequestManager requestManager; + private final OnConversationClickListener onConversationClickListener; private final ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked; private ConversationSet selectedConversations = new ConversationSet(); private final Set typingSet = new HashSet<>(); @@ -55,14 +55,14 @@ private enum Payload { private PagingController pagingController; protected ConversationListAdapter(@NonNull LifecycleOwner lifecycleOwner, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull OnConversationClickListener onConversationClickListener, @NonNull ClearFilterViewHolder.OnClearFilterClickListener onClearFilterClicked) { super(new ConversationDiffCallback()); this.lifecycleOwner = lifecycleOwner; - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.onConversationClickListener = onConversationClickListener; this.onClearFilterClicked = onClearFilterClicked; } @@ -151,7 +151,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi casted.getConversationListItem().bind(lifecycleOwner, conversation.getThreadRecord(), - glideRequests, + requestManager, Locale.getDefault(), typingSet, selectedConversations); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java index beffad736e..12d0e9cbc6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListDataSource.java @@ -84,7 +84,12 @@ public int size() { if (!MessageTypes.isGroupV2(record.getType())) { needsResolve.add(record.getRecipient().getId()); } else if (MessageTypes.isGroupUpdate(record.getType())) { - UpdateDescription description = MessageRecord.getGv2ChangeDescription(ApplicationDependencies.getApplication(), record.getBody(), null); + UpdateDescription description; + if (record.getMessageExtras() != null) { + description = MessageRecord.getGv2ChangeDescription(ApplicationDependencies.getApplication(), record.getMessageExtras(), null); + } else { + description = MessageRecord.getGv2ChangeDescription(ApplicationDependencies.getApplication(), record.getBody(), null); + } needsResolve.addAll(description.getMentioned().stream().map(RecipientId::from).collect(Collectors.toList())); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index f293b4175b..40b2499ab5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -43,9 +43,6 @@ import android.widget.Toast; import androidx.activity.OnBackPressedCallback; -import androidx.activity.result.ActivityResultCallback; -import androidx.activity.result.ActivityResultLauncher; -import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; import androidx.annotation.IdRes; @@ -71,6 +68,7 @@ import com.airbnb.lottie.SimpleColorFilter; import com.annimon.stream.Stream; +import com.bumptech.glide.Glide; import com.google.android.material.animation.ArgbEvaluatorCompat; import com.google.android.material.appbar.AppBarLayout; import com.google.android.material.appbar.CollapsingToolbarLayout; @@ -135,6 +133,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.events.ReminderUpdateEvent; import org.thoughtcrime.securesms.groups.SelectionLimits; +import org.thoughtcrime.securesms.jobs.RefreshOwnProfileJob; import org.thoughtcrime.securesms.jobs.ServiceOutageDetectionJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.lock.v2.CreateSvrPinActivity; @@ -145,11 +144,9 @@ import org.thoughtcrime.securesms.megaphone.MegaphoneActionController; import org.thoughtcrime.securesms.megaphone.MegaphoneViewBuilder; import org.thoughtcrime.securesms.megaphone.Megaphones; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.notifications.MarkReadReceiver; import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile; import org.thoughtcrime.securesms.permissions.Permissions; -import org.thoughtcrime.securesms.profiles.manage.EditProfileActivity; import org.thoughtcrime.securesms.profiles.manage.UsernameEditFragment; import org.thoughtcrime.securesms.ratelimit.RecaptchaProofBottomSheetFragment; import org.thoughtcrime.securesms.recipients.Recipient; @@ -193,7 +190,6 @@ import kotlin.Unit; -import static android.app.Activity.RESULT_CANCELED; import static android.app.Activity.RESULT_OK; @@ -319,7 +315,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat storyContextMenuCallbacks, callButtonClickCallbacks, getViewLifecycleOwner(), - GlideApp.with(this) + Glide.with(this) ); }, new ConversationListSearchAdapter.ChatFilterRepository() @@ -832,7 +828,7 @@ private void initializeVoiceNotePlayer() { private void initializeListAdapters() { - defaultAdapter = new ConversationListAdapter(getViewLifecycleOwner(), GlideApp.with(this), this, this); + defaultAdapter = new ConversationListAdapter(getViewLifecycleOwner(), Glide.with(this), this, this); setAdapter(defaultAdapter); @@ -1013,6 +1009,7 @@ private void updateReminders() { } else if (CdsPermanentErrorReminder.isEligible()) { return Optional.of(new CdsPermanentErrorReminder()); } else if (UsernameOutOfSyncReminder.isEligible()) { + ApplicationDependencies.getJobManager().add(new RefreshOwnProfileJob()); return Optional.of(new UsernameOutOfSyncReminder()); } else { return Optional.empty(); @@ -1159,7 +1156,7 @@ private void handleDelete(@NonNull Collection ids) { protected void onPreExecute() { dialog = SignalProgressDialog.show(requireActivity(), context.getString(R.string.ConversationListFragment_deleting), - context.getString(R.string.ConversationListFragment_deleting_selected_conversations), + context.getResources().getQuantityString(R.plurals.ConversationListFragment_deleting_selected_conversations, conversationsCount), true, false); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java index 7318afa06d..35554c5c3a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java @@ -43,6 +43,7 @@ import androidx.lifecycle.Observer; import androidx.lifecycle.Transformations; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.makeramen.roundedimageview.RoundedDrawable; @@ -72,7 +73,6 @@ import org.thoughtcrime.securesms.database.model.UpdateDescription; import org.thoughtcrime.securesms.glide.GlideLiveDataTarget; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; @@ -113,7 +113,7 @@ public final class ConversationListItem extends ConstraintLayout implements Bind private Set typingThreads; private LiveRecipient recipient; private long threadId; - private GlideRequests glideRequests; + private RequestManager requestManager; private EmojiTextView subjectView; private TypingIndicatorView typingView; private FromTextView fromView; @@ -206,7 +206,7 @@ protected void onLayout(boolean changed, int left, int top, int right, int botto @Override public void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull ThreadRecord thread, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager glideRequests, @NonNull Locale locale, @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations) @@ -216,14 +216,14 @@ public void bind(@NonNull LifecycleOwner lifecycleOwner, public void bindThread(@NonNull LifecycleOwner lifecycleOwner, @NonNull ThreadRecord thread, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations, @Nullable String highlightSubstring) { this.threadId = thread.getThreadId(); - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.unreadCount = thread.getUnreadCount(); this.lastSeen = thread.getLastSeen(); this.thread = thread; @@ -245,7 +245,7 @@ public void bindThread(@NonNull LifecycleOwner lifecycleOwner, this.typingThreads = typingThreads; updateTypingIndicator(typingThreads); - LiveData displayBody = getThreadDisplayBody(getContext(), thread, glideRequests, thumbSize, thumbTarget); + LiveData displayBody = getThreadDisplayBody(getContext(), thread, requestManager, thumbSize, thumbTarget); setSubjectViewText(displayBody.getValue()); observeDisplayBody(lifecycleOwner, displayBody); @@ -272,7 +272,7 @@ public void bindThread(@NonNull LifecycleOwner lifecycleOwner, setSelectedConversations(selectedConversations); setBadgeFromRecipient(recipient.get()); setUnreadIndicator(thread); - this.contactPhotoImage.setAvatar(glideRequests, recipient.get(), !batchMode); + this.contactPhotoImage.setAvatar(requestManager, recipient.get(), !batchMode); } private void setBadgeFromRecipient(Recipient recipient) { @@ -286,11 +286,11 @@ private void setBadgeFromRecipient(Recipient recipient) { public void bindMessage(@NonNull LifecycleOwner lifecycleOwner, @NonNull MessageResult messageResult, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @Nullable String highlightSubstring) { - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.locale = locale; this.highlightSubstring = highlightSubstring; @@ -313,15 +313,15 @@ public void bindMessage(@NonNull LifecycleOwner lifecycleOwner, setSelectedConversations(new ConversationSet()); setBadgeFromRecipient(recipient.get()); - contactPhotoImage.setAvatar(glideRequests, recipient.get(), !batchMode, false); + contactPhotoImage.setAvatar(requestManager, recipient.get(), !batchMode, false); } public void bindGroupWithMembers(@NonNull LifecycleOwner lifecycleOwner, @NonNull ContactSearchData.GroupWithMembers groupWithMembers, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale) { - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.locale = locale; this.highlightSubstring = groupWithMembers.getQuery(); @@ -344,7 +344,7 @@ public void bindGroupWithMembers(@NonNull LifecycleOwner lifecycleOwner, setSelectedConversations(new ConversationSet()); setBadgeFromRecipient(recipient.get()); - contactPhotoImage.setAvatar(glideRequests, recipient.get(), !batchMode); + contactPhotoImage.setAvatar(requestManager, recipient.get(), !batchMode); } private @NonNull Single joinMembersToDisplayBody(@NonNull List members, @NonNull String highlightSubstring) { @@ -363,7 +363,7 @@ public void unbind() { if (this.recipient != null) { observeRecipient(null, null); setSelectedConversations(new ConversationSet()); - contactPhotoImage.setAvatar(glideRequests, null, !batchMode); + contactPhotoImage.setAvatar(requestManager, null, !batchMode); } observeDisplayBody(null, null); @@ -379,7 +379,7 @@ public void setSelectedConversations(@NonNull ConversationSet conversations) { setSelected(selected); if (recipient != null) { - contactPhotoImage.setAvatar(glideRequests, recipient.get(), !batchMode); + contactPhotoImage.setAvatar(requestManager, recipient.get(), !batchMode); } if (batchMode && selected) { @@ -452,8 +452,8 @@ private void observeRecipient(@Nullable LifecycleOwner lifecycleOwner, @Nullable } private void observeDisplayBody(@Nullable LifecycleOwner lifecycleOwner, @Nullable LiveData displayBody) { - if (displayBody == null && glideRequests != null) { - glideRequests.clear(thumbTarget); + if (displayBody == null && requestManager != null) { + requestManager.clear(thumbTarget); } if (this.displayBody != null) { @@ -552,13 +552,13 @@ private void onRecipientChanged(@NonNull Recipient recipient) { } else { fromView.setText(recipient, false); } - contactPhotoImage.setAvatar(glideRequests, recipient, !batchMode, false); + contactPhotoImage.setAvatar(requestManager, recipient, !batchMode, false); setBadgeFromRecipient(recipient); } private static @NonNull LiveData getThreadDisplayBody(@NonNull Context context, @NonNull ThreadRecord thread, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @Px int thumbSize, @NonNull GlideLiveDataTarget thumbTarget) { @@ -572,7 +572,11 @@ private void onRecipientChanged(@NonNull Recipient recipient) { } } else if (MessageTypes.isGroupUpdate(thread.getType())) { if (thread.getRecipient().isPushV2Group()) { - return emphasisAdded(context, MessageRecord.getGv2ChangeDescription(context, thread.getBody(), null), defaultTint); + if (thread.getMessageExtras() != null) { + return emphasisAdded(context, MessageRecord.getGv2ChangeDescription(context, thread.getMessageExtras(), null), defaultTint); + } else { + return emphasisAdded(context, MessageRecord.getGv2ChangeDescription(context, thread.getBody(), null), defaultTint); + } } else { return emphasisAdded(context, context.getString(R.string.ThreadRecord_group_updated), R.drawable.ic_update_group_16, defaultTint); } @@ -655,7 +659,7 @@ private void onRecipientChanged(@NonNull Recipient recipient) { MessageStyler.style(thread.getDate(), thread.getBodyRanges(), sourceBody); CharSequence body = StringUtil.replace(sourceBody, '\n', " "); - LiveData finalBody = Transformations.map(createFinalBodyWithMediaIcon(context, body, thread, glideRequests, thumbSize, thumbTarget), updatedBody -> { + LiveData finalBody = Transformations.map(createFinalBodyWithMediaIcon(context, body, thread, requestManager, thumbSize, thumbTarget), updatedBody -> { if (thread.getRecipient().isGroup()) { RecipientId groupMessageSender = thread.getGroupMessageSender(); if (!groupMessageSender.isUnknown()) { @@ -674,7 +678,7 @@ private void onRecipientChanged(@NonNull Recipient recipient) { private static LiveData createFinalBodyWithMediaIcon(@NonNull Context context, @NonNull CharSequence body, @NonNull ThreadRecord thread, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @Px int thumbSize, @NonNull GlideLiveDataTarget thumbTarget) { @@ -696,7 +700,7 @@ private static LiveData createFinalBodyWithMediaIcon(@NonNull Cont return LiveDataUtil.just(body); } - glideRequests.asBitmap() + requestManager.asBitmap() .load(new DecryptableStreamUriLoader.DecryptableUri(thread.getSnippetUri())) .override(thumbSize, thumbSize) .transform( diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAction.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAction.java index e88dbd2909..8a2e5cd3d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAction.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItemAction.java @@ -8,11 +8,12 @@ import androidx.annotation.NonNull; import androidx.lifecycle.LifecycleOwner; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.BindableConversationListItem; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.conversationlist.model.ConversationSet; import org.thoughtcrime.securesms.database.model.ThreadRecord; -import org.thoughtcrime.securesms.mms.GlideRequests; import java.util.Locale; import java.util.Set; @@ -42,7 +43,7 @@ public void onFinishInflate() { @Override public void bind(@NonNull LifecycleOwner lifecycleOwner, @NonNull ThreadRecord thread, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull Locale locale, @NonNull Set typingThreads, @NonNull ConversationSet selectedConversations) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt index 797650ddab..9a23eeb37e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListSearchAdapter.kt @@ -5,6 +5,7 @@ import android.view.View import android.widget.TextView import androidx.core.os.bundleOf import androidx.lifecycle.LifecycleOwner +import com.bumptech.glide.RequestManager import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.contacts.paged.ArbitraryRepository import org.thoughtcrime.securesms.contacts.paged.ContactSearchAdapter @@ -12,7 +13,6 @@ import org.thoughtcrime.securesms.contacts.paged.ContactSearchConfiguration import org.thoughtcrime.securesms.contacts.paged.ContactSearchData import org.thoughtcrime.securesms.contacts.paged.ContactSearchKey import org.thoughtcrime.securesms.conversationlist.model.ConversationSet -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder @@ -32,7 +32,7 @@ class ConversationListSearchAdapter( storyContextMenuCallbacks: StoryContextMenuCallbacks, callButtonClickCallbacks: CallButtonClickCallbacks, lifecycleOwner: LifecycleOwner, - glideRequests: GlideRequests + requestManager: RequestManager ) : ContactSearchAdapter(context, fixedContacts, displayOptions, onClickedCallbacks, longClickCallbacks, storyContextMenuCallbacks, callButtonClickCallbacks), TimestampPayloadSupport { companion object { @@ -42,11 +42,11 @@ class ConversationListSearchAdapter( init { registerFactory( ThreadModel::class.java, - LayoutFactory({ ThreadViewHolder(onClickedCallbacks::onThreadClicked, lifecycleOwner, glideRequests, it) }, R.layout.conversation_list_item_view) + LayoutFactory({ ThreadViewHolder(onClickedCallbacks::onThreadClicked, lifecycleOwner, requestManager, it) }, R.layout.conversation_list_item_view) ) registerFactory( MessageModel::class.java, - LayoutFactory({ MessageViewHolder(onClickedCallbacks::onMessageClicked, lifecycleOwner, glideRequests, it) }, R.layout.conversation_list_item_view) + LayoutFactory({ MessageViewHolder(onClickedCallbacks::onMessageClicked, lifecycleOwner, requestManager, it) }, R.layout.conversation_list_item_view) ) registerFactory( ChatFilterMappingModel::class.java, @@ -62,7 +62,7 @@ class ConversationListSearchAdapter( ) registerFactory( GroupWithMembersModel::class.java, - LayoutFactory({ GroupWithMembersViewHolder(onClickedCallbacks::onGroupWithMembersClicked, lifecycleOwner, glideRequests, it) }, R.layout.conversation_list_item_view) + LayoutFactory({ GroupWithMembersViewHolder(onClickedCallbacks::onGroupWithMembersClicked, lifecycleOwner, requestManager, it) }, R.layout.conversation_list_item_view) ) } @@ -105,7 +105,7 @@ class ConversationListSearchAdapter( private class ThreadViewHolder( private val threadListener: OnClickedCallback, private val lifecycleOwner: LifecycleOwner, - private val glideRequests: GlideRequests, + private val requestManager: RequestManager, itemView: View ) : ConversationListItemViewHolder(itemView) { override fun fullBind(model: ThreadModel) { @@ -116,7 +116,7 @@ class ConversationListSearchAdapter( (itemView as ConversationListItem).bindThread( lifecycleOwner, model.thread.threadRecord, - glideRequests, + requestManager, Locale.getDefault(), emptySet(), ConversationSet(), @@ -128,7 +128,7 @@ class ConversationListSearchAdapter( private class MessageViewHolder( private val messageListener: OnClickedCallback, private val lifecycleOwner: LifecycleOwner, - private val glideRequests: GlideRequests, + private val requestManager: RequestManager, itemView: View ) : ConversationListItemViewHolder(itemView) { override fun fullBind(model: MessageModel) { @@ -139,7 +139,7 @@ class ConversationListSearchAdapter( (itemView as ConversationListItem).bindMessage( lifecycleOwner, model.message.messageResult, - glideRequests, + requestManager, Locale.getDefault(), model.message.query ) @@ -149,7 +149,7 @@ class ConversationListSearchAdapter( private class GroupWithMembersViewHolder( private val groupWithMembersListener: OnClickedCallback, private val lifecycleOwner: LifecycleOwner, - private val glideRequests: GlideRequests, + private val requestManager: RequestManager, itemView: View ) : ConversationListItemViewHolder(itemView) { override fun fullBind(model: GroupWithMembersModel) { @@ -160,7 +160,7 @@ class ConversationListSearchAdapter( (itemView as ConversationListItem).bindGroupWithMembers( lifecycleOwner, model.groupWithMembers, - glideRequests, + requestManager, Locale.getDefault() ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java index 79ec5e3f9b..c556281d43 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/PreKeyUtil.java @@ -201,8 +201,8 @@ public synchronized static void storeSignedPreKey(@NonNull SignalProtocolStore p } public synchronized static void storeLastResortKyberPreKey(@NonNull SignalServiceAccountDataStore protocolStore, @NonNull PreKeyMetadataStore metadataStore, KyberPreKeyRecord record) { - Log.i(TAG, "Storing kyber prekeys..."); - protocolStore.storeKyberPreKey(record.getId(), record); + Log.i(TAG, "Storing last resort kyber prekeys..."); + protocolStore.storeLastResortKyberPreKey(record.getId(), record); metadataStore.setNextKyberPreKeyId((record.getId() + 1) % Medium.MAX_VALUE); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java index 8ff0dad6bc..70460bf38f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/PublicKey.java @@ -37,13 +37,6 @@ public class PublicKey { private final ECPublicKey publicKey; private int id; - public PublicKey(PublicKey publicKey) { - this.id = publicKey.id; - - // FIXME :: This not strictly an accurate copy constructor. - this.publicKey = publicKey.publicKey; - } - public PublicKey(int id, ECPublicKey publicKey) { this.publicKey = publicKey; this.id = id; @@ -59,10 +52,6 @@ public PublicKey(byte[] bytes, int offset) throws InvalidKeyException { this.publicKey = Curve.decodePoint(bytes, offset + 3); } - public PublicKey(byte[] bytes) throws InvalidKeyException { - this(bytes, 0); - } - public int getType() { return publicKey.getType(); } @@ -79,20 +68,6 @@ public ECPublicKey getKey() { return publicKey; } - public String getFingerprint() { - return Hex.toString(getFingerprintBytes()); - } - - public byte[] getFingerprintBytes() { - try { - MessageDigest md = MessageDigest.getInstance("SHA-1"); - return md.digest(serialize()); - } catch (NoSuchAlgorithmException nsae) { - Log.w(TAG, "LocalKeyPair", nsae); - throw new IllegalArgumentException("SHA-1 isn't supported!"); - } - } - public byte[] serialize() { byte[] keyIdBytes = Conversions.mediumToByteArray(id); byte[] serializedPoint = publicKey.serialize(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl.java index dcb40d4c75..ac0fcb3355 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalServiceAccountDataStoreImpl.java @@ -204,7 +204,7 @@ public void storeKyberPreKey(int kyberPreKeyId, KyberPreKeyRecord record) { @Override public void storeLastResortKyberPreKey(int kyberPreKeyId, @NonNull KyberPreKeyRecord kyberPreKeyRecord) { - kyberPreKeyStore.storeKyberPreKey(kyberPreKeyId, kyberPreKeyRecord); + kyberPreKeyStore.storeLastResortKyberPreKey(kyberPreKeyId, kyberPreKeyRecord); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt index 0ff7b35c78..6bec116e8d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/AttachmentTable.kt @@ -1227,7 +1227,7 @@ class AttachmentTable( } val isUsedElsewhere = isAttachmentFileUsedByOtherAttachments(attachmentId, dataInfo) - val isSameQuality = transformProperties?.sentMediaQuality == sharedDataInfo.transformProperties?.sentMediaQuality + val isSameQuality = (transformProperties?.sentMediaQuality ?: 0) == (sharedDataInfo.transformProperties?.sentMediaQuality ?: 0) Log.i(TAG, "[deduplicateAttachment] Potential duplicate data file found. usedElsewhere: " + isUsedElsewhere + " sameQuality: " + isSameQuality + " otherFile: " + sharedDataInfo.file.absolutePath) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt index 96a396cf70..7f288cdf23 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt @@ -6,6 +6,7 @@ import android.database.Cursor import android.text.TextUtils import androidx.annotation.WorkerThread import androidx.core.content.contentValuesOf +import okio.ByteString import org.intellij.lang.annotations.Language import org.signal.core.util.SqlUtil import org.signal.core.util.SqlUtil.appendArg @@ -32,6 +33,7 @@ import org.signal.core.util.withinTransaction import org.signal.libsignal.zkgroup.groups.GroupMasterKey import org.signal.storageservice.protos.groups.Member import org.signal.storageservice.protos.groups.local.DecryptedGroup +import org.signal.storageservice.protos.groups.local.DecryptedPendingMember import org.thoughtcrime.securesms.contacts.paged.ContactSearchSortOrder import org.thoughtcrime.securesms.contacts.paged.collections.ContactSearchIterator import org.thoughtcrime.securesms.crypto.SenderKeyUtil @@ -57,6 +59,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPoin import org.whispersystems.signalservice.api.push.DistributionId import org.whispersystems.signalservice.api.push.ServiceId import org.whispersystems.signalservice.api.push.ServiceId.ACI +import org.whispersystems.signalservice.api.push.ServiceId.ACI.Companion.parseOrNull import org.whispersystems.signalservice.api.push.ServiceId.PNI import java.io.Closeable import java.security.SecureRandom @@ -604,6 +607,27 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT } } + fun getGroupInviter(groupId: GroupId): Recipient? { + val groupRecord: Optional = getGroup(groupId) + + if (groupRecord.isPresent && groupRecord.get().isV2Group) { + val pendingMembers: List = groupRecord.get().requireV2GroupProperties().decryptedGroup.pendingMembers + val invitedByAci: ByteString? = DecryptedGroupUtil.findPendingByServiceId(pendingMembers, Recipient.self().requireAci()) + .or { DecryptedGroupUtil.findPendingByServiceId(pendingMembers, Recipient.self().requirePni()) } + .map { it.addedByAci } + .orElse(null) + + if (invitedByAci != null) { + val serviceId: ServiceId? = parseOrNull(invitedByAci) + if (serviceId != null) { + return Recipient.externalPush(serviceId) + } + } + } + + return null + } + @CheckReturnValue fun create(groupId: GroupId.V1, title: String?, members: Collection, avatar: SignalServiceAttachmentPointer?): Boolean { if (groupExists(groupId.deriveV2MigrationGroupId())) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/KyberPreKeyTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/KyberPreKeyTable.kt index 22da29809d..558ba3e241 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/KyberPreKeyTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/KyberPreKeyTable.kt @@ -49,13 +49,15 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab val CREATE_INDEXES = arrayOf( "CREATE INDEX IF NOT EXISTS $INDEX_ACCOUNT_KEY ON $TABLE_NAME ($ACCOUNT_ID, $KEY_ID, $LAST_RESORT, $SERIALIZED)" ) + + const val PNI_ACCOUNT_ID = "PNI" } fun get(serviceId: ServiceId, keyId: Int): KyberPreKey? { return readableDatabase .select(LAST_RESORT, SERIALIZED) .from("$TABLE_NAME INDEXED BY $INDEX_ACCOUNT_KEY") - .where("$ACCOUNT_ID = ? AND $KEY_ID = ?", serviceId, keyId) + .where("$ACCOUNT_ID = ? AND $KEY_ID = ?", serviceId.toAccountId(), keyId) .run() .readToSingleObject { cursor -> KyberPreKey( @@ -69,7 +71,7 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab return readableDatabase .select(LAST_RESORT, SERIALIZED) .from("$TABLE_NAME INDEXED BY $INDEX_ACCOUNT_KEY") - .where("$ACCOUNT_ID = ?", serviceId) + .where("$ACCOUNT_ID = ?", serviceId.toAccountId()) .run() .readToList { cursor -> KyberPreKey( @@ -83,7 +85,7 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab return readableDatabase .select(LAST_RESORT, SERIALIZED) .from("$TABLE_NAME INDEXED BY $INDEX_ACCOUNT_KEY") - .where("$ACCOUNT_ID = ? AND $LAST_RESORT = ?", serviceId, 1) + .where("$ACCOUNT_ID = ? AND $LAST_RESORT = ?", serviceId.toAccountId(), 1) .run() .readToList { cursor -> KyberPreKey( @@ -96,7 +98,7 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab fun contains(serviceId: ServiceId, keyId: Int): Boolean { return readableDatabase .exists("$TABLE_NAME INDEXED BY $INDEX_ACCOUNT_KEY") - .where("$ACCOUNT_ID = ? AND $KEY_ID = ?", serviceId, keyId) + .where("$ACCOUNT_ID = ? AND $KEY_ID = ?", serviceId.toAccountId(), keyId) .run() } @@ -104,7 +106,7 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab writableDatabase .insertInto(TABLE_NAME) .values( - ACCOUNT_ID to serviceId.toString(), + ACCOUNT_ID to serviceId.toAccountId(), KEY_ID to keyId, TIMESTAMP to record.timestamp, SERIALIZED to record.serialize(), @@ -116,14 +118,14 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab fun deleteIfNotLastResort(serviceId: ServiceId, keyId: Int) { writableDatabase .delete("$TABLE_NAME INDEXED BY $INDEX_ACCOUNT_KEY") - .where("$ACCOUNT_ID = ? AND $KEY_ID = ? AND $LAST_RESORT = ?", serviceId, keyId, 0) + .where("$ACCOUNT_ID = ? AND $KEY_ID = ? AND $LAST_RESORT = ?", serviceId.toAccountId(), keyId, 0) .run() } fun delete(serviceId: ServiceId, keyId: Int) { writableDatabase .delete("$TABLE_NAME INDEXED BY $INDEX_ACCOUNT_KEY") - .where("$ACCOUNT_ID = ? AND $KEY_ID = ?", serviceId, keyId) + .where("$ACCOUNT_ID = ? AND $KEY_ID = ?", serviceId.toAccountId(), keyId) .run() } @@ -131,7 +133,7 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab writableDatabase .update(TABLE_NAME) .values(STALE_TIMESTAMP to staleTime) - .where("$ACCOUNT_ID = ? AND $STALE_TIMESTAMP = 0 AND $LAST_RESORT = 0", serviceId) + .where("$ACCOUNT_ID = ? AND $STALE_TIMESTAMP = 0 AND $LAST_RESORT = 0", serviceId.toAccountId()) .run() } @@ -161,8 +163,8 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab LIMIT $minCount ) """, - serviceId, - serviceId + serviceId.toAccountId(), + serviceId.toAccountId() ) .run() @@ -173,4 +175,11 @@ class KyberPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Datab val record: KyberPreKeyRecord, val lastResort: Boolean ) + + private fun ServiceId.toAccountId(): String { + return when (this) { + is ServiceId.ACI -> this.toString() + is ServiceId.PNI -> PNI_ACCOUNT_ID + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt index b0e7817e62..338f8d47a0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageSendLogTables.kt @@ -5,6 +5,7 @@ import android.content.Context import android.database.sqlite.SQLiteConstraintException import org.signal.core.util.CursorUtil import org.signal.core.util.SqlUtil +import org.signal.core.util.delete import org.signal.core.util.logging.Log import org.signal.core.util.readToList import org.signal.core.util.requireBoolean @@ -313,8 +314,6 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal } fun deleteAllRelatedToMessage(messageId: Long) { - if (!FeatureFlags.retryReceipts()) return - val db = databaseHelper.signalWritableDatabase val query = "${MslPayloadTable.ID} IN (SELECT ${MslMessageTable.PAYLOAD_ID} FROM ${MslMessageTable.TABLE_NAME} WHERE ${MslMessageTable.MESSAGE_ID} = ?)" val args = SqlUtil.buildArgs(messageId) @@ -323,14 +322,10 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal } fun deleteEntryForRecipient(dateSent: Long, recipientId: RecipientId, device: Int) { - if (!FeatureFlags.retryReceipts()) return - deleteEntriesForRecipient(listOf(dateSent), recipientId, device) } fun deleteEntriesForRecipient(dateSent: List, recipientId: RecipientId, device: Int) { - if (!FeatureFlags.retryReceipts()) return - val db = databaseHelper.signalWritableDatabase db.beginTransaction() try { @@ -360,15 +355,25 @@ class MessageSendLogTables constructor(context: Context?, databaseHelper: Signal } } - fun deleteAll() { + fun deleteAllForRecipient(recipientId: RecipientId) { if (!FeatureFlags.retryReceipts()) return + writableDatabase + .delete(MslRecipientTable.TABLE_NAME) + .where("${MslRecipientTable.RECIPIENT_ID} = ?", recipientId) + .run() + + writableDatabase + .delete(MslPayloadTable.TABLE_NAME) + .where("${MslPayloadTable.ID} NOT IN (SELECT ${MslRecipientTable.PAYLOAD_ID} FROM ${MslRecipientTable.TABLE_NAME})") + .run() + } + + fun deleteAll() { databaseHelper.signalWritableDatabase.delete(MslPayloadTable.TABLE_NAME, null, null) } fun trimOldMessages(currentTime: Long, maxAge: Long) { - if (!FeatureFlags.retryReceipts()) return - val db = databaseHelper.signalWritableDatabase val query = "${MslPayloadTable.DATE_SENT} < ?" val args = SqlUtil.buildArgs(currentTime - maxAge) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt index 53d5bbe9f2..03898c4837 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt @@ -108,6 +108,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateDetails import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExportState +import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails import org.thoughtcrime.securesms.database.model.databaseprotos.SessionSwitchoverEvent import org.thoughtcrime.securesms.database.model.databaseprotos.ThreadMergeEvent @@ -131,7 +132,6 @@ import org.thoughtcrime.securesms.revealable.ViewOnceExpirationInfo import org.thoughtcrime.securesms.revealable.ViewOnceUtil import org.thoughtcrime.securesms.sms.GroupV2UpdateMessageUtil import org.thoughtcrime.securesms.stories.Stories.isFeatureEnabled -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.JsonUtils import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.MessageConstraintsUtil @@ -207,6 +207,7 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat const val LATEST_REVISION_ID = "latest_revision_id" const val ORIGINAL_MESSAGE_ID = "original_message_id" const val REVISION_NUMBER = "revision_number" + const val MESSAGE_EXTRAS = "message_extras" const val QUOTE_NOT_PRESENT_ID = 0L const val QUOTE_TARGET_MISSING_ID = -1L @@ -264,7 +265,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat $SCHEDULED_DATE INTEGER DEFAULT -1, $LATEST_REVISION_ID INTEGER DEFAULT NULL REFERENCES $TABLE_NAME ($ID) ON DELETE CASCADE, $ORIGINAL_MESSAGE_ID INTEGER DEFAULT NULL REFERENCES $TABLE_NAME ($ID) ON DELETE CASCADE, - $REVISION_NUMBER INTEGER DEFAULT 0 + $REVISION_NUMBER INTEGER DEFAULT 0, + $MESSAGE_EXTRAS BLOB DEFAULT NULL ) """ @@ -343,7 +345,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat SCHEDULED_DATE, LATEST_REVISION_ID, ORIGINAL_MESSAGE_ID, - REVISION_NUMBER + REVISION_NUMBER, + MESSAGE_EXTRAS ) private val MMS_PROJECTION: Array = MMS_PROJECTION_BASE + "NULL AS ${AttachmentTable.ATTACHMENT_JSON_ALIAS}" @@ -402,6 +405,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat $LATEST_REVISION_ID IS NULL AND $TYPE & ${MessageTypes.KEY_EXCHANGE_IDENTITY_DEFAULT_BIT} = 0 AND $TYPE & ${MessageTypes.KEY_EXCHANGE_IDENTITY_VERIFIED_BIT} = 0 AND + $TYPE & ${MessageTypes.SPECIAL_TYPES_MASK} != ${MessageTypes.SPECIAL_TYPE_REPORTED_SPAM} AND + $TYPE & ${MessageTypes.SPECIAL_TYPES_MASK} != ${MessageTypes.SPECIAL_TYPE_MESSAGE_REQUEST_ACCEPTED} AND $TYPE NOT IN ( ${MessageTypes.PROFILE_CHANGE_TYPE}, ${MessageTypes.GV1_MIGRATION_TYPE}, @@ -1139,7 +1144,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat } fun insertSessionSwitchoverEvent(recipientId: RecipientId, threadId: Long, event: SessionSwitchoverEvent) { - check(!FeatureFlags.blockSessionSwitchoverEvents()) { "Should not occur in a non-PNP world!" } writableDatabase .insertInto(TABLE_NAME) .values( @@ -1733,7 +1737,9 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat $TYPE != ${MessageTypes.CHANGE_NUMBER_TYPE} AND $TYPE != ${MessageTypes.SMS_EXPORT_TYPE} AND $TYPE != ${MessageTypes.BOOST_REQUEST_TYPE} AND - $TYPE & ${MessageTypes.GROUP_V2_LEAVE_BITS} != ${MessageTypes.GROUP_V2_LEAVE_BITS} + $TYPE & ${MessageTypes.GROUP_V2_LEAVE_BITS} != ${MessageTypes.GROUP_V2_LEAVE_BITS} AND + $TYPE & ${MessageTypes.SPECIAL_TYPES_MASK} != ${MessageTypes.SPECIAL_TYPE_REPORTED_SPAM} AND + $TYPE & ${MessageTypes.SPECIAL_TYPES_MASK} != ${MessageTypes.SPECIAL_TYPE_MESSAGE_REQUEST_ACCEPTED} ) """ @@ -2393,6 +2399,18 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat sentTimeMillis = timestamp, expiresIn = expiresIn ) + } else if (MessageTypes.isReportedSpam(outboxType)) { + OutgoingMessage.reportSpamMessage( + threadRecipient = threadRecipient, + sentTimeMillis = timestamp, + expiresIn = expiresIn + ) + } else if (MessageTypes.isMessageRequestAccepted(outboxType)) { + OutgoingMessage.messageRequestAcceptMessage( + threadRecipient = threadRecipient, + sentTimeMillis = timestamp, + expiresIn = expiresIn + ) } else { val giftBadge: GiftBadge? = if (body != null && MessageTypes.isGiftBadge(outboxType)) { GiftBadge.ADAPTER.decode(Base64.decode(body)) @@ -2557,7 +2575,15 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val isNotStoryGroupReply = retrieved.parentStoryId == null || !retrieved.parentStoryId.isGroupReply() - if (!MessageTypes.isPaymentsActivated(type) && !MessageTypes.isPaymentsRequestToActivate(type) && !MessageTypes.isExpirationTimerUpdate(type) && !retrieved.storyType.isStory && isNotStoryGroupReply && !silent) { + if (!MessageTypes.isPaymentsActivated(type) && + !MessageTypes.isPaymentsRequestToActivate(type) && + !MessageTypes.isReportedSpam(type) && + !MessageTypes.isMessageRequestAccepted(type) && + !MessageTypes.isExpirationTimerUpdate(type) && + !retrieved.storyType.isStory && + isNotStoryGroupReply && + !silent + ) { val incrementUnreadMentions = retrieved.mentions.isNotEmpty() && retrieved.mentions.any { it.recipientId == Recipient.self().id } threads.incrementUnread(threadId, 1, if (incrementUnreadMentions) 1 else 0) ThreadUpdateJob.enqueue(threadId) @@ -2787,6 +2813,22 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat hasSpecialType = true } + if (message.isReportSpam) { + if (hasSpecialType) { + throw MmsException("Cannot insert message with multiple special types.") + } + type = type or MessageTypes.SPECIAL_TYPE_REPORTED_SPAM + hasSpecialType = true + } + + if (message.isMessageRequestAccept) { + if (hasSpecialType) { + throw MmsException("Cannot insert message with multiple special types.") + } + type = type or MessageTypes.SPECIAL_TYPE_MESSAGE_REQUEST_ACCEPTED + hasSpecialType = true + } + val earlyDeliveryReceipts: Map = earlyDeliveryReceiptCache.remove(message.sentTimeMillis) if (earlyDeliveryReceipts.isNotEmpty()) { @@ -2950,12 +2992,12 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat ApplicationDependencies.getDatabaseObserver().notifyStoryObservers(message.threadRecipient.id) } - notifyConversationListListeners() - if (!message.isIdentityVerified && !message.isIdentityDefault) { - TrimThreadJob.enqueueAsync(threadId) + ThreadUpdateJob.enqueue(threadId) } + TrimThreadJob.enqueueAsync(threadId) + return messageId } @@ -3542,6 +3584,13 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat .run() } + fun hasReportSpamMessage(threadId: Long): Boolean { + return readableDatabase + .exists(TABLE_NAME) + .where("$THREAD_ID = $threadId AND ($TYPE & ${MessageTypes.SPECIAL_TYPES_MASK}) = ${MessageTypes.SPECIAL_TYPE_REPORTED_SPAM}") + .run() + } + private val outgoingInsecureMessageClause = "($TYPE & ${MessageTypes.BASE_TYPE_MASK}) = ${MessageTypes.BASE_SENT_TYPE} AND NOT ($TYPE & ${MessageTypes.SECURE_MESSAGE_BIT})" private val outgoingSecureMessageClause = "($TYPE & ${MessageTypes.BASE_TYPE_MASK}) = ${MessageTypes.BASE_SENT_TYPE} AND ($TYPE & ${MessageTypes.SECURE_MESSAGE_BIT or MessageTypes.PUSH_MESSAGE_BIT})" @@ -4020,6 +4069,33 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat .take(limit) } + fun getGroupReportSpamMessageServerData(threadId: Long, inviter: RecipientId, timestamp: Long, limit: Int): List { + val data: MutableList = ArrayList() + + val incomingGroupUpdateClause = "($TYPE & ${MessageTypes.BASE_TYPE_MASK}) = ${MessageTypes.BASE_INBOX_TYPE} AND ($TYPE & ${MessageTypes.GROUP_UPDATE_BIT}) != 0" + + readableDatabase + .select(FROM_RECIPIENT_ID, SERVER_GUID, DATE_RECEIVED) + .from(TABLE_NAME) + .where("$FROM_RECIPIENT_ID = ? AND $THREAD_ID = ? AND $DATE_RECEIVED <= ? AND $incomingGroupUpdateClause", inviter, threadId, timestamp) + .orderBy("$DATE_RECEIVED DESC") + .limit(limit) + .run() + .forEach { cursor -> + val serverGuid: String? = cursor.requireString(SERVER_GUID) + + if (serverGuid != null && serverGuid.isNotEmpty()) { + data += ReportSpamData( + recipientId = RecipientId.from(cursor.requireLong(FROM_RECIPIENT_ID)), + serverGuid = serverGuid, + dateReceived = cursor.requireLong(DATE_RECEIVED) + ) + } + } + + return data + } + @Throws(NoSuchMessageException::class) private fun getMessageExportState(messageId: MessageId): MessageExportState { return readableDatabase @@ -4996,6 +5072,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat val originalMessageId: MessageId? = cursor.requireLong(ORIGINAL_MESSAGE_ID).let { if (it == 0L) null else MessageId(it) } val editCount = cursor.requireInt(REVISION_NUMBER) val isRead = cursor.requireBoolean(READ) + val messageExtraBytes = cursor.requireBlob(MESSAGE_EXTRAS) + val messageExtras = if (messageExtraBytes != null) MessageExtras.ADAPTER.decode(messageExtraBytes) else null if (!TextSecurePreferences.isReadReceiptsEnabled(context)) { hasReadReceipt = false @@ -5083,7 +5161,8 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat latestRevisionId, originalMessageId, editCount, - isRead + isRead, + messageExtras ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java index c85f02479e..97608092f4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTypes.java @@ -113,6 +113,8 @@ public interface MessageTypes { long SPECIAL_TYPE_GIFT_BADGE = 0x200000000L; long SPECIAL_TYPE_PAYMENTS_NOTIFICATION = 0x300000000L; long SPECIAL_TYPE_PAYMENTS_ACTIVATE_REQUEST = 0x400000000L; + long SPECIAL_TYPE_REPORTED_SPAM = 0x500000000L; + long SPECIAL_TYPE_MESSAGE_REQUEST_ACCEPTED = 0x600000000L; long SPECIAL_TYPE_PAYMENTS_ACTIVATED = 0x800000000L; long IGNORABLE_TYPESMASK_WHEN_COUNTING = END_SESSION_BIT | KEY_EXCHANGE_IDENTITY_UPDATE_BIT | KEY_EXCHANGE_IDENTITY_VERIFIED_BIT; @@ -137,6 +139,14 @@ static boolean isPaymentsActivated(long type) { return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_PAYMENTS_ACTIVATED; } + static boolean isReportedSpam(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_REPORTED_SPAM; + } + + static boolean isMessageRequestAccepted(long type) { + return (type & SPECIAL_TYPES_MASK) == SPECIAL_TYPE_MESSAGE_REQUEST_ACCEPTED; + } + static boolean isDraftMessageType(long type) { return (type & BASE_TYPE_MASK) == BASE_DRAFT_TYPE; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyTable.kt index c40a4eb8ab..1cac549f05 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/OneTimePreKeyTable.kt @@ -38,10 +38,12 @@ class OneTimePreKeyTable(context: Context, databaseHelper: SignalDatabase) : Dat UNIQUE($ACCOUNT_ID, $KEY_ID) ) """ + + const val PNI_ACCOUNT_ID = "PNI" } fun get(serviceId: ServiceId, keyId: Int): PreKeyRecord? { - readableDatabase.query(TABLE_NAME, null, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId, keyId), null, null, null).use { cursor -> + readableDatabase.query(TABLE_NAME, null, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId.toAccountId(), keyId), null, null, null).use { cursor -> if (cursor.moveToFirst()) { try { val publicKey = Curve.decodePoint(Base64.decode(cursor.requireNonNullString(PUBLIC_KEY)), 0) @@ -60,7 +62,7 @@ class OneTimePreKeyTable(context: Context, databaseHelper: SignalDatabase) : Dat fun insert(serviceId: ServiceId, keyId: Int, record: PreKeyRecord) { val contentValues = contentValuesOf( - ACCOUNT_ID to serviceId.toString(), + ACCOUNT_ID to serviceId.toAccountId(), KEY_ID to keyId, PUBLIC_KEY to Base64.encodeWithPadding(record.keyPair.publicKey.serialize()), PRIVATE_KEY to Base64.encodeWithPadding(record.keyPair.privateKey.serialize()) @@ -71,14 +73,14 @@ class OneTimePreKeyTable(context: Context, databaseHelper: SignalDatabase) : Dat fun delete(serviceId: ServiceId, keyId: Int) { val database = databaseHelper.signalWritableDatabase - database.delete(TABLE_NAME, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId, keyId)) + database.delete(TABLE_NAME, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId.toAccountId(), keyId)) } fun markAllStaleIfNecessary(serviceId: ServiceId, staleTime: Long) { writableDatabase .update(TABLE_NAME) .values(STALE_TIMESTAMP to staleTime) - .where("$ACCOUNT_ID = ? AND $STALE_TIMESTAMP = 0", serviceId) + .where("$ACCOUNT_ID = ? AND $STALE_TIMESTAMP = 0", serviceId.toAccountId()) .run() } @@ -105,11 +107,18 @@ class OneTimePreKeyTable(context: Context, databaseHelper: SignalDatabase) : Dat LIMIT $minCount ) """, - serviceId, - serviceId + serviceId.toAccountId(), + serviceId.toAccountId() ) .run() Log.i(TAG, "Deleted $count stale one-time EC prekeys.") } + + private fun ServiceId.toAccountId(): String { + return when (this) { + is ServiceId.ACI -> this.toString() + is ServiceId.PNI -> PNI_ACCOUNT_ID + } + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index aa1ebf7617..3007095537 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -33,6 +33,7 @@ import org.signal.core.util.requireLong import org.signal.core.util.requireNonNullString import org.signal.core.util.requireString import org.signal.core.util.select +import org.signal.core.util.toInt import org.signal.core.util.update import org.signal.core.util.updateAll import org.signal.core.util.withinTransaction @@ -111,6 +112,7 @@ import java.util.LinkedList import java.util.Objects import java.util.Optional import java.util.concurrent.TimeUnit +import kotlin.jvm.optionals.getOrNull import kotlin.math.max open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper) { @@ -180,6 +182,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da const val REPORTING_TOKEN = "reporting_token" const val PHONE_NUMBER_SHARING = "phone_number_sharing" const val PHONE_NUMBER_DISCOVERABLE = "phone_number_discoverable" + const val PNI_SIGNATURE_VERIFIED = "pni_signature_verified" const val SEARCH_PROFILE_NAME = "search_signal_profile" const val SORT_NAME = "sort_name" @@ -247,7 +250,8 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da $NEEDS_PNI_SIGNATURE INTEGER DEFAULT 0, $REPORTING_TOKEN BLOB DEFAULT NULL, $PHONE_NUMBER_SHARING INTEGER DEFAULT ${PhoneNumberSharingState.UNKNOWN.id}, - $PHONE_NUMBER_DISCOVERABLE INTEGER DEFAULT ${PhoneNumberDiscoverableState.UNKNOWN.id} + $PHONE_NUMBER_DISCOVERABLE INTEGER DEFAULT ${PhoneNumberDiscoverableState.UNKNOWN.id}, + $PNI_SIGNATURE_VERIFIED INTEGER DEFAULT 0 ) """ @@ -826,7 +830,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da val recipientId: RecipientId if (id < 0) { Log.w(TAG, "[applyStorageSyncContactInsert] Failed to insert. Possibly merging.") - recipientId = getAndPossiblyMergePnpVerified(insert.aci.orNull(), insert.pni.orNull(), insert.number.orNull()) + recipientId = getAndPossiblyMerge(aci = insert.aci.orNull(), pni = insert.pni.orNull(), e164 = insert.number.orNull(), pniVerified = insert.isPniSignatureVerified) db.update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(recipientId)) } else { recipientId = RecipientId.from(id) @@ -864,7 +868,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da var recipientId = getByColumn(STORAGE_SERVICE_ID, Base64.encodeWithPadding(update.old.id.raw)).get() Log.w(TAG, "[applyStorageSyncContactUpdate] Found user $recipientId. Possibly merging.") - recipientId = getAndPossiblyMergePnpVerified(update.new.aci.orElse(null), update.new.pni.orElse(null), update.new.number.orElse(null)) + recipientId = getAndPossiblyMerge(aci = update.new.aci.orElse(null), pni = update.new.pni.orElse(null), e164 = update.new.number.orElse(null), pniVerified = update.new.isPniSignatureVerified) Log.w(TAG, "[applyStorageSyncContactUpdate] Merged into $recipientId") db.update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(recipientId)) @@ -1110,6 +1114,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da SYSTEM_NICKNAME, "$TABLE_NAME.$STORAGE_SERVICE_PROTO", "$TABLE_NAME.$UNREGISTERED_TIMESTAMP", + "$TABLE_NAME.$PNI_SIGNATURE_VERIFIED", "${GroupTable.TABLE_NAME}.${GroupTable.V2_MASTER_KEY}", "${ThreadTable.TABLE_NAME}.${ThreadTable.ARCHIVED}", "${ThreadTable.TABLE_NAME}.${ThreadTable.READ}", @@ -2244,13 +2249,16 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * Removes the target recipient's E164+PNI, then creates a new recipient with that E164+PNI. * Done so we can match a split contact during storage sync. */ - fun splitForStorageSync(storageId: ByteArray) { - val record = getByStorageId(storageId)!! - if (record.aci == null || record.pni == null) { - Log.w(TAG, "Invalid state for split, ignoring.") + fun splitForStorageSyncIfNecessary(aci: ACI) { + val recipientId = getByAci(aci).getOrNull() ?: return + val record = getRecord(recipientId) + + if (record.pni == null && record.e164 == null) { return } + Log.i(TAG, "Splitting $recipientId for storage sync", true) + writableDatabase .update(TABLE_NAME) .values( @@ -2366,7 +2374,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da } } - val finalId: RecipientId = writePnpChangeSetToDisk(changeSet, pni) + val finalId: RecipientId = writePnpChangeSetToDisk(changeSet, pni, pniVerified) return ProcessPnpTupleResult( finalId = finalId, @@ -2380,7 +2388,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da } @VisibleForTesting - fun writePnpChangeSetToDisk(changeSet: PnpChangeSet, inputPni: PNI?): RecipientId { + fun writePnpChangeSetToDisk(changeSet: PnpChangeSet, inputPni: PNI?, pniVerified: Boolean): RecipientId { var hadThreadMerge = false for (operation in changeSet.operations) { @Exhaustive @@ -2396,7 +2404,10 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da is PnpOperation.RemovePni -> { writableDatabase .update(TABLE_NAME) - .values(PNI_COLUMN to null) + .values( + PNI_COLUMN to null, + PNI_SIGNATURE_VERIFIED to 0 + ) .where("$ID = ?", operation.recipientId) .run() } @@ -2407,7 +2418,8 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da .values( ACI_COLUMN to operation.aci.toString(), REGISTERED to RegisteredState.REGISTERED.id, - UNREGISTERED_TIMESTAMP to 0 + UNREGISTERED_TIMESTAMP to 0, + PNI_SIGNATURE_VERIFIED to pniVerified.toInt() ) .where("$ID = ?", operation.recipientId) .run() @@ -2427,14 +2439,15 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da .values( PNI_COLUMN to operation.pni.toString(), REGISTERED to RegisteredState.REGISTERED.id, - UNREGISTERED_TIMESTAMP to 0 + UNREGISTERED_TIMESTAMP to 0, + PNI_SIGNATURE_VERIFIED to 0 ) .where("$ID = ?", operation.recipientId) .run() } is PnpOperation.Merge -> { - val mergeResult: MergeResult = merge(operation.primaryId, operation.secondaryId, inputPni) + val mergeResult: MergeResult = merge(operation.primaryId, operation.secondaryId, inputPni, pniVerified) hadThreadMerge = hadThreadMerge || mergeResult.neededThreadMerge } @@ -2448,14 +2461,14 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da try { SignalDatabase.messages.insertSessionSwitchoverEvent(operation.recipientId, threadId, event) } catch (e: Exception) { - Log.e(TAG, "About to crash! Breadcrumbs: ${changeSet.breadCrumbs}, Operations: ${changeSet.operations}, ID: ${changeSet.id}") + Log.e(TAG, "About to crash! Breadcrumbs: ${changeSet.breadCrumbs}, Operations: ${changeSet.operations}, ID: ${changeSet.id}", true) val allPnis: Set = getAllPnis() val pnisWithSessions: Set = sessions.findAllThatHaveAnySession(allPnis) - Log.e(TAG, "We know of ${allPnis.size} PNIs, and there are sessions with ${pnisWithSessions.size} of them.") + Log.e(TAG, "We know of ${allPnis.size} PNIs, and there are sessions with ${pnisWithSessions.size} of them.", true) val record = getRecord(operation.recipientId) - Log.e(TAG, "ID: ${record.id}, E164: ${record.e164}, ACI: ${record.aci}, PNI: ${record.pni}, Registered: ${record.registered}") + Log.e(TAG, "ID: ${record.id}, E164: ${record.e164}, ACI: ${record.aci}, PNI: ${record.pni}, Registered: ${record.registered}", true) if (record.aci != null && record.aci == SignalStore.account().aci) { if (pnisWithSessions.contains(SignalStore.account().pni!!)) { @@ -2513,7 +2526,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da } is PnpIdResolver.PnpInsert -> { - val id: Long = writableDatabase.insert(TABLE_NAME, null, buildContentValuesForNewUser(changeSet.id.e164, changeSet.id.pni, changeSet.id.aci)) + val id: Long = writableDatabase.insert(TABLE_NAME, null, buildContentValuesForNewUser(changeSet.id.e164, changeSet.id.pni, changeSet.id.aci, pniVerified)) RecipientId.from(id) } } @@ -3387,7 +3400,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da fun getRecipientsForMultiDeviceSync(): List { val subquery = "SELECT ${ThreadTable.TABLE_NAME}.${ThreadTable.RECIPIENT_ID} FROM ${ThreadTable.TABLE_NAME}" - val selection = "$REGISTERED = ? AND $GROUP_ID IS NULL AND $ID != ? AND ($SYSTEM_CONTACT_URI NOT NULL OR $ID IN ($subquery))" + val selection = "$REGISTERED = ? AND $GROUP_ID IS NULL AND $ID != ? AND ($ACI_COLUMN NOT NULL OR $E164 NOT NULL) AND ($SYSTEM_CONTACT_URI NOT NULL OR $ID IN ($subquery))" val args = arrayOf(RegisteredState.REGISTERED.id.toString(), Recipient.self().id.serialize()) val recipients: MutableList = ArrayList() @@ -3781,7 +3794,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da * Merges one ACI recipient with an E164 recipient. It is assumed that the E164 recipient does * *not* have an ACI. */ - private fun merge(primaryId: RecipientId, secondaryId: RecipientId, newPni: PNI? = null): MergeResult { + private fun merge(primaryId: RecipientId, secondaryId: RecipientId, newPni: PNI? = null, pniVerified: Boolean): MergeResult { ensureInTransaction() val db = writableDatabase val primaryRecord = getRecord(primaryId) @@ -3842,7 +3855,8 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da SYSTEM_CONTACT_URI to secondaryRecord.systemContactUri, PROFILE_SHARING to (primaryRecord.profileSharing || secondaryRecord.profileSharing), CAPABILITIES to max(primaryRecord.capabilities.rawBits, secondaryRecord.capabilities.rawBits), - MENTION_SETTING to if (primaryRecord.mentionSetting != MentionSetting.ALWAYS_NOTIFY) primaryRecord.mentionSetting.id else secondaryRecord.mentionSetting.id + MENTION_SETTING to if (primaryRecord.mentionSetting != MentionSetting.ALWAYS_NOTIFY) primaryRecord.mentionSetting.id else secondaryRecord.mentionSetting.id, + PNI_SIGNATURE_VERIFIED to pniVerified.toInt() ) if (primaryRecord.profileSharing || secondaryRecord.profileSharing) { @@ -3867,13 +3881,14 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da check(writableDatabase.inTransaction()) { "Must be in a transaction!" } } - private fun buildContentValuesForNewUser(e164: String?, pni: PNI?, aci: ACI?): ContentValues { + private fun buildContentValuesForNewUser(e164: String?, pni: PNI?, aci: ACI?, pniVerified: Boolean): ContentValues { check(e164 != null || pni != null || aci != null) { "Must provide some sort of identifier!" } val values = contentValuesOf( E164 to e164, ACI_COLUMN to aci?.toString(), PNI_COLUMN to pni?.toString(), + PNI_SIGNATURE_VERIFIED to pniVerified.toInt(), STORAGE_SERVICE_ID to Base64.encodeWithPadding(StorageSyncHelper.generateKey()), AVATAR_COLOR to AvatarColorHash.forAddress((aci ?: pni)?.toString(), e164).serialize() ) @@ -3909,6 +3924,7 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da put(MUTE_UNTIL, contact.muteUntil) put(STORAGE_SERVICE_ID, Base64.encodeWithPadding(contact.id.raw)) put(HIDDEN, contact.isHidden) + put(PNI_SIGNATURE_VERIFIED, contact.isPniSignatureVerified.toInt()) if (contact.hasUnknownFields()) { put(STORAGE_SERVICE_PROTO, Base64.encodeWithPadding(Objects.requireNonNull(contact.serializeUnknownFields()))) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTableCursorUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTableCursorUtil.kt index 502d8d490b..d3f093447c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTableCursorUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTableCursorUtil.kt @@ -209,25 +209,16 @@ object RecipientTableCursorUtil { } fun getSyncExtras(cursor: Cursor): RecipientRecord.SyncExtras { - val storageProtoRaw = cursor.optionalString(RecipientTable.STORAGE_SERVICE_PROTO).orElse(null) - val storageProto = if (storageProtoRaw != null) Base64.decodeOrThrow(storageProtoRaw) else null - val archived = cursor.optionalBoolean(ThreadTable.ARCHIVED).orElse(false) - val forcedUnread = cursor.optionalInt(ThreadTable.READ).map { status: Int -> status == ThreadTable.ReadStatus.FORCED_UNREAD.serialize() }.orElse(false) - val groupMasterKey = cursor.optionalBlob(GroupTable.V2_MASTER_KEY).map { GroupUtil.requireMasterKey(it) }.orElse(null) - val identityKey = cursor.optionalString(RecipientTable.IDENTITY_KEY).map { Base64.decodeOrThrow(it) }.orElse(null) - val identityStatus = cursor.optionalInt(RecipientTable.IDENTITY_STATUS).map { VerifiedStatus.forState(it) }.orElse(VerifiedStatus.DEFAULT) - val unregisteredTimestamp = cursor.optionalLong(RecipientTable.UNREGISTERED_TIMESTAMP).orElse(0) - val systemNickname = cursor.optionalString(RecipientTable.SYSTEM_NICKNAME).orElse(null) - return RecipientRecord.SyncExtras( - storageProto = storageProto, - groupMasterKey = groupMasterKey, - identityKey = identityKey, - identityStatus = identityStatus, - isArchived = archived, - isForcedUnread = forcedUnread, - unregisteredTimestamp = unregisteredTimestamp, - systemNickname = systemNickname + storageProto = cursor.optionalString(RecipientTable.STORAGE_SERVICE_PROTO).orElse(null)?.let { Base64.decodeOrThrow(it) }, + groupMasterKey = cursor.optionalBlob(GroupTable.V2_MASTER_KEY).map { GroupUtil.requireMasterKey(it) }.orElse(null), + identityKey = cursor.optionalString(RecipientTable.IDENTITY_KEY).map { Base64.decodeOrThrow(it) }.orElse(null), + identityStatus = cursor.optionalInt(RecipientTable.IDENTITY_STATUS).map { VerifiedStatus.forState(it) }.orElse(VerifiedStatus.DEFAULT), + isArchived = cursor.optionalBoolean(ThreadTable.ARCHIVED).orElse(false), + isForcedUnread = cursor.optionalInt(ThreadTable.READ).map { status: Int -> status == ThreadTable.ReadStatus.FORCED_UNREAD.serialize() }.orElse(false), + unregisteredTimestamp = cursor.optionalLong(RecipientTable.UNREGISTERED_TIMESTAMP).orElse(0), + systemNickname = cursor.optionalString(RecipientTable.SYSTEM_NICKNAME).orElse(null), + pniSignatureVerified = cursor.optionalBoolean(RecipientTable.PNI_SIGNATURE_VERIFIED).orElse(false) ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyTable.kt index 01d64f2b9d..3396b316dc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SignedPreKeyTable.kt @@ -28,6 +28,7 @@ class SignedPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Data const val PRIVATE_KEY = "private_key" const val SIGNATURE = "signature" const val TIMESTAMP = "timestamp" + const val CREATE_TABLE = """ CREATE TABLE $TABLE_NAME ( $ID INTEGER PRIMARY KEY, @@ -40,10 +41,12 @@ class SignedPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Data UNIQUE($ACCOUNT_ID, $KEY_ID) ) """ + + const val PNI_ACCOUNT_ID = "PNI" } fun get(serviceId: ServiceId, keyId: Int): SignedPreKeyRecord? { - readableDatabase.query(TABLE_NAME, null, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId, keyId), null, null, null).use { cursor -> + readableDatabase.query(TABLE_NAME, null, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId.toAccountId(), keyId), null, null, null).use { cursor -> if (cursor.moveToFirst()) { try { val publicKey = Curve.decodePoint(Base64.decode(cursor.requireNonNullString(PUBLIC_KEY)), 0) @@ -64,7 +67,7 @@ class SignedPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Data fun getAll(serviceId: ServiceId): List { val results: MutableList = LinkedList() - readableDatabase.query(TABLE_NAME, null, "$ACCOUNT_ID = ?", SqlUtil.buildArgs(serviceId), null, null, null).use { cursor -> + readableDatabase.query(TABLE_NAME, null, "$ACCOUNT_ID = ?", SqlUtil.buildArgs(serviceId.toAccountId()), null, null, null).use { cursor -> while (cursor.moveToNext()) { try { val keyId = cursor.requireInt(KEY_ID) @@ -86,7 +89,7 @@ class SignedPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Data fun insert(serviceId: ServiceId, keyId: Int, record: SignedPreKeyRecord) { val contentValues = contentValuesOf( - ACCOUNT_ID to serviceId.toString(), + ACCOUNT_ID to serviceId.toAccountId(), KEY_ID to keyId, PUBLIC_KEY to Base64.encodeWithPadding(record.keyPair.publicKey.serialize()), PRIVATE_KEY to Base64.encodeWithPadding(record.keyPair.privateKey.serialize()), @@ -97,6 +100,13 @@ class SignedPreKeyTable(context: Context, databaseHelper: SignalDatabase) : Data } fun delete(serviceId: ServiceId, keyId: Int) { - writableDatabase.delete(TABLE_NAME, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId, keyId)) + writableDatabase.delete(TABLE_NAME, "$ACCOUNT_ID = ? AND $KEY_ID = ?", SqlUtil.buildArgs(serviceId.toAccountId(), keyId)) + } + + private fun ServiceId.toAccountId(): String { + return when (this) { + is ServiceId.ACI -> this.toString() + is ServiceId.PNI -> PNI_ACCOUNT_ID + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java index 382f81bcc7..530042c6a2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java @@ -1,9 +1,11 @@ package org.thoughtcrime.securesms.database; import android.content.Context; +import android.text.SpannableStringBuilder; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; import org.signal.core.util.logging.Log; @@ -32,24 +34,28 @@ private ThreadBodyUtil() { public static @NonNull ThreadBody getFormattedBodyFor(@NonNull Context context, @NonNull MessageRecord record) { if (record.isMms()) { - return getFormattedBodyForMms(context, (MmsMessageRecord) record); + return getFormattedBodyForMms(context, (MmsMessageRecord) record, null); } return new ThreadBody(record.getBody()); } - private static @NonNull ThreadBody getFormattedBodyForMms(@NonNull Context context, @NonNull MmsMessageRecord record) { + public static @NonNull CharSequence getFormattedBodyForNotification(@NonNull Context context, @NonNull MessageRecord record, @Nullable CharSequence bodyOverride) { + return getFormattedBodyForMms(context, (MmsMessageRecord) record, bodyOverride).body; + } + + private static @NonNull ThreadBody getFormattedBodyForMms(@NonNull Context context, @NonNull MmsMessageRecord record, @Nullable CharSequence bodyOverride) { if (record.getSharedContacts().size() > 0) { Contact contact = record.getSharedContacts().get(0); return new ThreadBody(ContactUtil.getStringSummary(context, contact).toString()); } else if (record.getSlideDeck().getDocumentSlide() != null) { - return format(context, record, EmojiStrings.FILE, R.string.ThreadRecord_file); + return format(context, record, EmojiStrings.FILE, R.string.ThreadRecord_file, bodyOverride); } else if (record.getSlideDeck().getAudioSlide() != null) { - return format(context, record, EmojiStrings.AUDIO, R.string.ThreadRecord_voice_message); + return format(context, record, EmojiStrings.AUDIO, R.string.ThreadRecord_voice_message, bodyOverride); } else if (MessageRecordUtil.hasSticker(record)) { String emoji = getStickerEmoji(record); - return format(context, record, emoji, R.string.ThreadRecord_sticker); + return format(context, record, emoji, R.string.ThreadRecord_sticker, bodyOverride); } else if (MessageRecordUtil.hasGiftBadge(record)) { return format(EmojiStrings.GIFT, getGiftSummary(context, record)); } else if (MessageRecordUtil.isStoryReaction(record)) { @@ -77,11 +83,11 @@ private ThreadBodyUtil() { } if (hasGif) { - return format(context, record, EmojiStrings.GIF, R.string.ThreadRecord_gif); + return format(context, record, EmojiStrings.GIF, R.string.ThreadRecord_gif, bodyOverride); } else if (hasVideo) { - return format(context, record, EmojiStrings.VIDEO, R.string.ThreadRecord_video); + return format(context, record, EmojiStrings.VIDEO, R.string.ThreadRecord_video, bodyOverride); } else if (hasImage) { - return format(context, record, EmojiStrings.PHOTO, R.string.ThreadRecord_photo); + return format(context, record, EmojiStrings.PHOTO, R.string.ThreadRecord_photo, bodyOverride); } else if (TextUtils.isEmpty(record.getBody())) { return new ThreadBody(context.getString(R.string.ThreadRecord_media_message)); } else { @@ -153,18 +159,25 @@ private ThreadBodyUtil() { return ""; } } - - private static @NonNull ThreadBody format(@NonNull Context context, @NonNull MessageRecord record, @NonNull String emoji, @StringRes int defaultStringRes) { - CharSequence body = getBodyOrDefault(context, record, defaultStringRes).getBody(); + + private static @NonNull ThreadBody format(@NonNull Context context, + @NonNull MessageRecord record, + @NonNull String emoji, + @StringRes int defaultStringRes, + @Nullable CharSequence bodyOverride) + { + CharSequence body = !TextUtils.isEmpty(bodyOverride) ? bodyOverride + : TextUtils.isEmpty(record.getBody()) ? context.getString(defaultStringRes) + : getBody(context, record).getBody(); return format(emoji, body); } private static @NonNull ThreadBody format(@NonNull CharSequence prefix, @NonNull CharSequence body) { - return new ThreadBody(String.format("%s %s", prefix, body), prefix.length() + 1); - } - - private static @NonNull ThreadBody getBodyOrDefault(@NonNull Context context, @NonNull MessageRecord record, @StringRes int defaultStringRes) { - return TextUtils.isEmpty(record.getBody()) ? new ThreadBody(context.getString(defaultStringRes)) : getBody(context, record); + SpannableStringBuilder builder = new SpannableStringBuilder(); + builder.append(prefix) + .append(" ") + .append(body); + return new ThreadBody(builder, prefix.length() + 1); } private static @NonNull ThreadBody getBody(@NonNull Context context, @NonNull MessageRecord record) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt index 3904ec724b..d2f954bf02 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadTable.kt @@ -17,6 +17,7 @@ import org.signal.core.util.exists import org.signal.core.util.logging.Log import org.signal.core.util.or import org.signal.core.util.readToList +import org.signal.core.util.readToSingleLong import org.signal.core.util.requireBoolean import org.signal.core.util.requireInt import org.signal.core.util.requireLong @@ -43,6 +44,7 @@ import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.ThreadRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList +import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras import org.thoughtcrime.securesms.database.model.serialize import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.groups.BadGroupIdException @@ -95,6 +97,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa const val SNIPPET_URI = "snippet_uri" const val SNIPPET_CONTENT_TYPE = "snippet_content_type" const val SNIPPET_EXTRAS = "snippet_extras" + const val SNIPPET_MESSAGE_EXTRAS = "snippet_message_extras" const val ARCHIVED = "archived" const val STATUS = "status" const val HAS_DELIVERY_RECEIPT = "has_delivery_receipt" @@ -135,7 +138,8 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa $LAST_SCROLLED INTEGER DEFAULT 0, $PINNED INTEGER DEFAULT 0, $UNREAD_SELF_MENTION_COUNT INTEGER DEFAULT 0, - $ACTIVE INTEGER DEFAULT 0 + $ACTIVE INTEGER DEFAULT 0, + $SNIPPET_MESSAGE_EXTRAS BLOB DEFAULT NULL ) """ @@ -162,6 +166,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa SNIPPET_URI, SNIPPET_CONTENT_TYPE, SNIPPET_EXTRAS, + SNIPPET_MESSAGE_EXTRAS, ARCHIVED, STATUS, HAS_DELIVERY_RECEIPT, @@ -221,7 +226,8 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa expiresIn: Long, readReceiptCount: Int, unreadCount: Int, - unreadMentionCount: Int + unreadMentionCount: Int, + messageExtras: MessageExtras? ) { var extraSerialized: String? = null @@ -247,7 +253,8 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa EXPIRES_IN to expiresIn, ACTIVE to 1, UNREAD_COUNT to unreadCount, - UNREAD_SELF_MENTION_COUNT to unreadMentionCount + UNREAD_SELF_MENTION_COUNT to unreadMentionCount, + SNIPPET_MESSAGE_EXTRAS to messageExtras?.encode() ) writableDatabase @@ -1233,6 +1240,13 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa return getThreadIdIfExistsFor(recipientId) > -1 } + fun hasActiveThread(recipientId: RecipientId): Boolean { + return readableDatabase + .exists(TABLE_NAME) + .where("$RECIPIENT_ID = ? AND $ACTIVE = 1", recipientId) + .run() + } + fun updateLastSeenAndMarkSentAndLastScrolledSilenty(threadId: Long) { writableDatabase .update(TABLE_NAME) @@ -1477,7 +1491,8 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa expiresIn = 0, readReceiptCount = 0, unreadCount = 0, - unreadMentionCount = 0 + unreadMentionCount = 0, + messageExtras = null ) } return@withinTransaction true @@ -1506,7 +1521,8 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa expiresIn = record.expiresIn, readReceiptCount = record.hasReadReceipt().toInt(), unreadCount = unreadCount, - unreadMentionCount = unreadMentionCount + unreadMentionCount = unreadMentionCount, + messageExtras = record.messageExtras ) if (notifyListeners) { @@ -1568,64 +1584,69 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa check(databaseHelper.signalWritableDatabase.inTransaction()) { "Must be in a transaction!" } Log.w(TAG, "Merging threads. Primary: $primaryRecipientId, Secondary: $secondaryRecipientId", true) - val primary: ThreadRecord? = getThreadRecord(getThreadIdFor(primaryRecipientId)) - val secondary: ThreadRecord? = getThreadRecord(getThreadIdFor(secondaryRecipientId)) + val primaryThreadId: Long? = getThreadIdFor(primaryRecipientId) + val secondaryThreadId: Long? = getThreadIdFor(secondaryRecipientId) - return if (primary != null && secondary == null) { + return if (primaryThreadId != null && secondaryThreadId == null) { Log.w(TAG, "[merge] Only had a thread for primary. Returning that.", true) - MergeResult(threadId = primary.threadId, previousThreadId = -1, neededMerge = false) - } else if (primary == null && secondary != null) { + MergeResult(threadId = primaryThreadId, previousThreadId = -1, neededMerge = false) + } else if (primaryThreadId == null && secondaryThreadId != null) { Log.w(TAG, "[merge] Only had a thread for secondary. Updating it to have the recipientId of the primary.", true) writableDatabase .update(TABLE_NAME) .values(RECIPIENT_ID to primaryRecipientId.serialize()) - .where("$ID = ?", secondary.threadId) + .where("$ID = ?", secondaryThreadId) .run() synchronized(threadIdCache) { threadIdCache.remove(secondaryRecipientId) } - MergeResult(threadId = secondary.threadId, previousThreadId = -1, neededMerge = false) - } else if (primary == null && secondary == null) { + MergeResult(threadId = secondaryThreadId, previousThreadId = -1, neededMerge = false) + } else if (primaryThreadId == null && secondaryThreadId == null) { Log.w(TAG, "[merge] No thread for either.") MergeResult(threadId = -1, previousThreadId = -1, neededMerge = false) } else { Log.w(TAG, "[merge] Had a thread for both. Deleting the secondary and merging the attributes together.", true) - check(primary != null) - check(secondary != null) + check(primaryThreadId != null) + check(secondaryThreadId != null) for (table in threadIdDatabaseTables) { - table.remapThread(secondary.threadId, primary.threadId) + table.remapThread(secondaryThreadId, primaryThreadId) } writableDatabase .delete(TABLE_NAME) - .where("$ID = ?", secondary.threadId) + .where("$ID = ?", secondaryThreadId) .run() synchronized(threadIdCache) { threadIdCache.remove(secondaryRecipientId) } - if (primary.expiresIn != secondary.expiresIn) { - val values = ContentValues() - if (primary.expiresIn == 0L) { - values.put(EXPIRES_IN, secondary.expiresIn) - } else if (secondary.expiresIn == 0L) { - values.put(EXPIRES_IN, primary.expiresIn) + val primaryExpiresIn = getExpiresIn(primaryThreadId) + val secondaryExpiresIn = getExpiresIn(secondaryThreadId) + + val values = ContentValues() + values.put(ACTIVE, true) + + if (primaryExpiresIn != secondaryExpiresIn) { + if (primaryExpiresIn == 0L) { + values.put(EXPIRES_IN, secondaryExpiresIn) + } else if (secondaryExpiresIn == 0L) { + values.put(EXPIRES_IN, primaryExpiresIn) } else { - values.put(EXPIRES_IN, min(primary.expiresIn, secondary.expiresIn)) + values.put(EXPIRES_IN, min(primaryExpiresIn, secondaryExpiresIn)) } - - writableDatabase - .update(TABLE_NAME) - .values(values) - .where("$ID = ?", primary.threadId) - .run() } - RemappedRecords.getInstance().addThread(secondary.threadId, primary.threadId) + writableDatabase + .update(TABLE_NAME) + .values(values) + .where("$ID = ?", primaryThreadId) + .run() - MergeResult(threadId = primary.threadId, previousThreadId = secondary.threadId, neededMerge = true) + RemappedRecords.getInstance().addThread(secondaryThreadId, primaryThreadId) + + MergeResult(threadId = primaryThreadId, previousThreadId = secondaryThreadId, neededMerge = true) } } @@ -1645,6 +1666,15 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa } } + private fun getExpiresIn(threadId: Long): Long { + return readableDatabase + .select(EXPIRES_IN) + .from(TABLE_NAME) + .where("$ID = $threadId") + .run() + .readToSingleLong() + } + private fun SQLiteDatabase.deactivateThreads() { deactivateThread(query = null) } @@ -1665,6 +1695,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa SNIPPET_URI to null, SNIPPET_CONTENT_TYPE to null, SNIPPET_EXTRAS to null, + SNIPPET_MESSAGE_EXTRAS to null, UNREAD_COUNT to 0, ARCHIVED to 0, STATUS to 0, @@ -1896,6 +1927,7 @@ class ThreadTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTa val hasReadReceipt = TextSecurePreferences.isReadReceiptsEnabled(context) && cursor.requireBoolean(HAS_READ_RECEIPT) val extraString = cursor.getString(cursor.getColumnIndexOrThrow(SNIPPET_EXTRAS)) + val messageExtras = cursor.getBlob(cursor.getColumnIndexOrThrow(SNIPPET_MESSAGE_EXTRAS)) val extra: Extra? = if (extraString != null) { try { JsonUtils.fromJson(extraString, Extra::class.java) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt index d5ffcc9ca4..fd7bf3eca9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/SignalDatabaseMigrations.kt @@ -74,6 +74,9 @@ import org.thoughtcrime.securesms.database.helpers.migration.V213_FixUsernameInE import org.thoughtcrime.securesms.database.helpers.migration.V214_PhoneNumberSharingColumn import org.thoughtcrime.securesms.database.helpers.migration.V215_RemoveAttachmentUniqueId import org.thoughtcrime.securesms.database.helpers.migration.V216_PhoneNumberDiscoverable +import org.thoughtcrime.securesms.database.helpers.migration.V217_MessageTableExtrasColumn +import org.thoughtcrime.securesms.database.helpers.migration.V218_RecipientPniSignatureVerified +import org.thoughtcrime.securesms.database.helpers.migration.V219_PniPreKeyStores /** * Contains all of the database migrations for [SignalDatabase]. Broken into a separate file for cleanliness. @@ -151,10 +154,13 @@ object SignalDatabaseMigrations { 213 to V213_FixUsernameInE164Column, 214 to V214_PhoneNumberSharingColumn, 215 to V215_RemoveAttachmentUniqueId, - 216 to V216_PhoneNumberDiscoverable + 216 to V216_PhoneNumberDiscoverable, + 217 to V217_MessageTableExtrasColumn, + 218 to V218_RecipientPniSignatureVerified, + 219 to V219_PniPreKeyStores ) - const val DATABASE_VERSION = 216 + const val DATABASE_VERSION = 219 @JvmStatic fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V217_MessageTableExtrasColumn.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V217_MessageTableExtrasColumn.kt new file mode 100644 index 0000000000..a8a24d2bd2 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V217_MessageTableExtrasColumn.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase + +/** + * Adds a message_extras column to the messages table. This allows us to + * store extra data for messages in a more future proof and structured way. + */ +@Suppress("ClassName") +object V217_MessageTableExtrasColumn : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("ALTER TABLE message ADD COLUMN message_extras BLOB DEFAULT NULL") + db.execSQL("ALTER TABLE thread ADD COLUMN snippet_message_extras BLOB DEFAULT NULL") + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V218_RecipientPniSignatureVerified.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V218_RecipientPniSignatureVerified.kt new file mode 100644 index 0000000000..23b17a92e9 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V218_RecipientPniSignatureVerified.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase + +/** + * Adds a pni_signature_verified column to the recipient table, letting us track whether the ACI/PNI association is verified and sync that to storage service. + */ +@Suppress("ClassName") +object V218_RecipientPniSignatureVerified : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL("ALTER TABLE recipient ADD COLUMN pni_signature_verified INTEGER DEFAULT 0") + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V219_PniPreKeyStores.kt b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V219_PniPreKeyStores.kt new file mode 100644 index 0000000000..6fe2802e8e --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/helpers/migration/V219_PniPreKeyStores.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.database.helpers.migration + +import android.app.Application +import net.zetetic.database.sqlcipher.SQLiteDatabase + +/** + * Changes our PNI prekey stores to use a constant indicating it's for a PNI rather than the specific PNI. + */ +@Suppress("ClassName") +object V219_PniPreKeyStores : SignalDatabaseMigration { + override fun migrate(context: Application, db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { + db.execSQL( + """ + UPDATE one_time_prekeys + SET account_id = "PNI" + WHERE account_id LIKE "PNI:%" + """ + ) + + db.execSQL( + """ + UPDATE signed_prekeys + SET account_id = "PNI" + WHERE account_id LIKE "PNI:%" + """ + ) + + db.execSQL( + """ + UPDATE kyber_prekey + SET account_id = "PNI" + WHERE account_id LIKE "PNI:%" + """ + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java index 2193327e0d..a8a7fc1e41 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/DisplayRecord.java @@ -239,4 +239,12 @@ public boolean isPaymentsRequestToActivate() { public boolean isPaymentsActivated() { return MessageTypes.isPaymentsActivated(type); } + + public boolean isReportedSpam() { + return MessageTypes.isReportedSpam(type); + } + + public boolean isMessageRequestAccepted() { + return MessageTypes.isMessageRequestAccepted(type); + } } 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 05103794cc..bb0fe2d825 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 @@ -25,17 +25,53 @@ import org.signal.storageservice.protos.groups.local.DecryptedRequestingMember; import org.signal.storageservice.protos.groups.local.EnabledState; import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.backup.v2.proto.GenericGroupUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupAdminStatusUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupAnnouncementOnlyChangeUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupAttributesAccessLevelChangeUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupAvatarUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupChangeChatUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupCreationUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupDescriptionUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInvitationAcceptedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInvitationDeclinedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInvitationRevokedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInviteLinkAdminApprovalUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInviteLinkDisabledUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInviteLinkEnabledUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupInviteLinkResetUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupJoinRequestApprovalUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupJoinRequestCanceledUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupJoinRequestUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupMemberAddedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupMemberJoinedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupMemberLeftUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupMemberRemovedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupMembershipAccessLevelChangeUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupNameUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupUnknownInviteeUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupV2AccessLevel; +import org.thoughtcrime.securesms.backup.v2.proto.GroupV2MigrationDroppedMembersUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupV2MigrationInvitedMembersUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupV2MigrationSelfInvitedUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.GroupV2MigrationUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.SelfInvitedOtherUserToGroupUpdate; +import org.thoughtcrime.securesms.backup.v2.proto.SelfInvitedToGroupUpdate; +import org.thoughtcrime.securesms.database.model.databaseprotos.GV2UpdateDescription; import org.thoughtcrime.securesms.groups.GV2AccessLevelUtil; +import org.thoughtcrime.securesms.groups.GroupMigrationMembershipChange; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.ExpirationUtil; import org.thoughtcrime.securesms.util.SpanUtil; +import org.thoughtcrime.securesms.util.Util; import org.whispersystems.signalservice.api.groupsv2.DecryptedGroupUtil; import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId.ACI; import org.whispersystems.signalservice.api.push.ServiceIds; import org.whispersystems.signalservice.api.util.UuidUtil; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -104,6 +140,485 @@ UpdateDescription describeNewGroup(@Nullable DecryptedGroup group, @Nullable Dec } } + List describeChanges(@NonNull List groupUpdates) { + List updates = new LinkedList<>(); + for (GroupChangeChatUpdate.Update update : groupUpdates) { + describeUpdate(update, updates); + } + + return updates; + } + + private void describeUpdate(@NonNull GroupChangeChatUpdate.Update update, @NonNull List updates) { + if (update.genericGroupUpdate != null) { + describeGenericGroupUpdate(update.genericGroupUpdate, updates); + } else if (update.groupCreationUpdate != null) { + describeGroupCreationUpdate(update.groupCreationUpdate, updates); + } else if (update.groupNameUpdate != null) { + describeGroupNameUpdate(update.groupNameUpdate, updates); + } else if (update.groupAvatarUpdate != null) { + describeAvatarChange(update.groupAvatarUpdate, updates); + } else if (update.groupDescriptionUpdate != null) { + describeDescriptionChange(update.groupDescriptionUpdate, updates); + } else if (update.groupMembershipAccessLevelChangeUpdate != null) { + describeGroupMembershipAccessLevelChange(update.groupMembershipAccessLevelChangeUpdate, updates); + } else if (update.groupAttributesAccessLevelChangeUpdate != null) { + describeGroupAttributesAccessLevelChange(update.groupAttributesAccessLevelChangeUpdate, updates); + } else if (update.groupAnnouncementOnlyChangeUpdate != null) { + describeGroupAnnouncementOnlyUpdate(update.groupAnnouncementOnlyChangeUpdate, updates); + } else if (update.groupAdminStatusUpdate != null) { + describeAdminStatusChange(update.groupAdminStatusUpdate, updates); + } else if (update.groupMemberLeftUpdate != null) { + describeGroupMemberLeftChange(update.groupMemberLeftUpdate, updates); + } else if (update.groupMemberRemovedUpdate != null) { + describeGroupMemberRemovedChange(update.groupMemberRemovedUpdate, updates); + } else if (update.selfInvitedToGroupUpdate != null) { + describeSelfInvitedToGroupUpdate(update.selfInvitedToGroupUpdate, updates); + } else if (update.selfInvitedOtherUserToGroupUpdate != null) { + describeSelfInvitedOtherUserToGroupUpdate(update.selfInvitedOtherUserToGroupUpdate, updates); + } else if (update.groupUnknownInviteeUpdate != null) { + describeUnknownUsersInvitedUpdate(update.groupUnknownInviteeUpdate, updates); + } else if (update.groupInvitationAcceptedUpdate != null) { + describeGroupInvitationAcceptedUpdate(update.groupInvitationAcceptedUpdate, updates); + } else if (update.groupMemberJoinedUpdate != null) { + describeGroupMemberJoinedUpdate(update.groupMemberJoinedUpdate, updates); + } else if (update.groupMemberAddedUpdate != null) { + describeGroupMemberAddedUpdate(update.groupMemberAddedUpdate, updates); + } else if (update.groupInvitationDeclinedUpdate != null) { + describeGroupInvitationDeclinedUpdate(update.groupInvitationDeclinedUpdate, updates); + } else if (update.groupInvitationRevokedUpdate != null) { + describeGroupInvitationRevokedUpdate(update.groupInvitationRevokedUpdate, updates); + } else if (update.groupJoinRequestUpdate != null) { + describeGroupJoinRequestUpdate(update.groupJoinRequestUpdate, updates); + } else if (update.groupJoinRequestApprovalUpdate != null) { + describeGroupJoinRequestApprovedUpdate(update.groupJoinRequestApprovalUpdate, updates); + } else if (update.groupJoinRequestCanceledUpdate != null) { + describeGroupJoinRequestCanceledUpdate(update.groupJoinRequestCanceledUpdate, updates); + } else if (update.groupInviteLinkResetUpdate != null) { + describeInviteLinkResetUpdate(update.groupInviteLinkResetUpdate, updates); + } else if (update.groupInviteLinkEnabledUpdate != null) { + describeInviteLinkEnabledUpdate(update.groupInviteLinkEnabledUpdate, updates); + } else if (update.groupInviteLinkDisabledUpdate != null) { + describeInviteLinkDisabledUpdate(update.groupInviteLinkDisabledUpdate, updates); + } else if (update.groupInviteLinkAdminApprovalUpdate != null) { + describeGroupInviteLinkAdminApprovalUpdate(update.groupInviteLinkAdminApprovalUpdate, updates); + } else if (update.groupV2MigrationUpdate != null) { + describeGroupV2MigrationUpdate(update.groupV2MigrationUpdate, updates); + } else if (update.groupV2MigrationDroppedMembersUpdate != null) { + describeGroupV2MigrationDroppedMembersUpdate(update.groupV2MigrationDroppedMembersUpdate, updates); + } else if (update.groupV2MigrationInvitedMembersUpdate != null) { + describeGroupV2MigrationInvitedMembersUpdate(update.groupV2MigrationInvitedMembersUpdate, updates); + } else if (update.groupV2MigrationSelfInvitedUpdate != null) { + describeGroupV2MigrationSelfInvitedUpdate(update.groupV2MigrationSelfInvitedUpdate, updates); + } + } + + private void describeGroupV2MigrationSelfInvitedUpdate(@NonNull GroupV2MigrationSelfInvitedUpdate update, @NonNull List updates) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_couldnt_be_added_to_the_new_group_and_have_been_invited_to_join), R.drawable.ic_update_group_add_16)); + } + + private void describeGroupV2MigrationDroppedMembersUpdate(@NonNull GroupV2MigrationDroppedMembersUpdate update, @NonNull List updates) { + updates.add(updateDescription(context.getResources().getQuantityString(R.plurals.MessageRecord_members_couldnt_be_added_to_the_new_group_and_have_been_removed, update.droppedMembersCount, update.droppedMembersCount), R.drawable.ic_update_group_remove_16)); + } + + private void describeGroupV2MigrationInvitedMembersUpdate(@NonNull GroupV2MigrationInvitedMembersUpdate update, @NonNull List updates) { + updates.add(updateDescription(context.getResources().getQuantityString(R.plurals.MessageRecord_members_couldnt_be_added_to_the_new_group_and_have_been_invited, update.invitedMembersCount, update.invitedMembersCount), R.drawable.ic_update_group_remove_16)); + } + + private void describeGroupV2MigrationUpdate(@NonNull GroupV2MigrationUpdate update, @NonNull List updates) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_this_group_was_updated_to_a_new_group), R.drawable.ic_update_group_role_16)); + } + + private void describeGroupInviteLinkAdminApprovalUpdate(@NonNull GroupInviteLinkAdminApprovalUpdate update, @NonNull List updates) { + if (update.updaterAci == null) { + if (update.linkRequiresAdminApproval) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_admin_approval_for_the_group_link_has_been_turned_on), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_admin_approval_for_the_group_link_has_been_turned_off), R.drawable.ic_update_group_role_16)); + } + } else { + if (selfIds.matches(update.updaterAci)) { + if (update.linkRequiresAdminApproval) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_turned_on_admin_approval_for_the_group_link), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_turned_off_admin_approval_for_the_group_link), R.drawable.ic_update_group_role_16)); + } + } else { + if (update.linkRequiresAdminApproval) { + updates.add(updateDescription(R.string.MessageRecord_s_turned_on_admin_approval_for_the_group_link, update.updaterAci, R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_turned_off_admin_approval_for_the_group_link, update.updaterAci, R.drawable.ic_update_group_role_16)); + } + } + } + } + + private void describeInviteLinkDisabledUpdate(@NonNull GroupInviteLinkDisabledUpdate update, @NonNull List updates) { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_link_has_been_turned_off), R.drawable.ic_update_group_role_16)); + } else { + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_turned_off_the_group_link), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_turned_off_the_group_link, update.updaterAci, R.drawable.ic_update_group_role_16)); + } + } + } + + private void describeInviteLinkEnabledUpdate(@NonNull GroupInviteLinkEnabledUpdate update, @NonNull List updates) { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (update.updaterAci == null) { + if (update.linkRequiresAdminApproval) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_link_has_been_turned_on_with_admin_approval_on), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_link_has_been_turned_on_with_admin_approval_off), R.drawable.ic_update_group_role_16)); + } + } else { + if (editorIsYou) { + if (update.linkRequiresAdminApproval) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_turned_on_the_group_link_with_admin_approval_on), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_turned_on_the_group_link_with_admin_approval_off), R.drawable.ic_update_group_role_16)); + } + } else { + if (update.linkRequiresAdminApproval) { + updates.add(updateDescription(R.string.MessageRecord_s_turned_on_the_group_link_with_admin_approval_on, update.updaterAci, R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_turned_on_the_group_link_with_admin_approval_off, update.updaterAci, R.drawable.ic_update_group_role_16)); + } + } + } + } + + private void describeInviteLinkResetUpdate(@NonNull GroupInviteLinkResetUpdate update, @NonNull List updates) { + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_link_has_been_reset), R.drawable.ic_update_group_role_16)); + } else { + if (selfIds.matches(update.updaterAci)) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_reset_the_group_link), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_reset_the_group_link, update.updaterAci, R.drawable.ic_update_group_role_16)); + } + } + } + + private void describeGroupJoinRequestCanceledUpdate(@NonNull GroupJoinRequestCanceledUpdate update, @NonNull List updates) { + boolean requestingMemberIsYou = selfIds.matches(update.requestorAci); + + if (requestingMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_canceled_your_request_to_join_the_group), R.drawable.ic_update_group_decline_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_canceled_their_request_to_join_the_group, update.requestorAci, R.drawable.ic_update_group_decline_16)); + } + } + + private void describeGroupJoinRequestApprovedUpdate(@NonNull GroupJoinRequestApprovalUpdate update, @NonNull List updates) { + boolean requestingMemberIsYou = selfIds.matches(update.requestorAci); + + if (update.wasApproved) { + if (update.updaterAci == null) { + if (requestingMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_your_request_to_join_the_group_has_been_approved), R.drawable.ic_update_group_accept_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_a_request_to_join_the_group_from_s_has_been_approved, update.requestorAci, R.drawable.ic_update_group_accept_16)); + } + } else { + if (requestingMemberIsYou) { + updates.add(updateDescription(R.string.MessageRecord_s_approved_your_request_to_join_the_group, update.updaterAci, R.drawable.ic_update_group_accept_16)); + } else { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (editorIsYou) { + updates.add(updateDescription(R.string.MessageRecord_you_approved_a_request_to_join_the_group_from_s, update.requestorAci, R.drawable.ic_update_group_accept_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_approved_a_request_to_join_the_group_from_s, update.updaterAci, update.requestorAci, R.drawable.ic_update_group_accept_16)); + } + } + } + } else { + if (update.updaterAci == null) { + if (requestingMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_your_request_to_join_the_group_has_been_denied_by_an_admin), R.drawable.ic_update_group_decline_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_a_request_to_join_the_group_from_s_has_been_denied, update.requestorAci, R.drawable.ic_update_group_decline_16)); + } + } else { + if (requestingMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_your_request_to_join_the_group_has_been_denied_by_an_admin), R.drawable.ic_update_group_decline_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_denied_a_request_to_join_the_group_from_s, update.updaterAci, update.requestorAci, R.drawable.ic_update_group_decline_16)); + } + } + } + } + + private void describeGroupJoinRequestUpdate(@NonNull GroupJoinRequestUpdate update, @NonNull List updates) { + if (selfIds.matches(update.requestorAci)) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_sent_a_request_to_join_the_group), R.drawable.ic_update_group_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_requested_to_join_via_the_group_link, update.requestorAci, R.drawable.ic_update_group_16)); + } + } + + private void describeGroupInvitationRevokedUpdate(@NonNull GroupInvitationRevokedUpdate update, @NonNull List updates) { + int revokedMeCount = 0; + for (GroupInvitationRevokedUpdate.Invitee invitee : update.invitees) { + if (selfIds.matches(invitee.inviteeAci) || selfIds.matches(invitee.inviteePni)) { + revokedMeCount++; + } + } + + int notMeInvitees = update.invitees.size() - revokedMeCount; + + if (update.updaterAci == null) { + if (revokedMeCount > 0) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_an_admin_revoked_your_invitation_to_the_group), R.drawable.ic_update_group_decline_16)); + } + if (notMeInvitees > 0) { + updates.add(updateDescription(context.getResources().getQuantityString(R.plurals.MessageRecord_d_invitations_were_revoked, notMeInvitees, notMeInvitees), R.drawable.ic_update_group_decline_16)); + } + } else { + if (revokedMeCount > 0) { + updates.add(updateDescription(R.string.MessageRecord_s_revoked_your_invitation_to_the_group, update.updaterAci, R.drawable.ic_update_group_decline_16)); + } + if (selfIds.matches(update.updaterAci)) { + updates.add(updateDescription(context.getResources().getQuantityString(R.plurals.MessageRecord_you_revoked_invites, notMeInvitees, notMeInvitees), R.drawable.ic_update_group_decline_16)); + } else { + updates.add(updateDescription(R.plurals.MessageRecord_s_revoked_invites, notMeInvitees, update.updaterAci, notMeInvitees, R.drawable.ic_update_group_decline_16)); + } + } + } + + private void describeGroupInvitationDeclinedUpdate(@NonNull GroupInvitationDeclinedUpdate update, @NonNull List updates) { + if (selfIds.matches(update.inviteeAci)) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_declined_the_invitation_to_the_group), R.drawable.ic_update_group_decline_16)); + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_someone_declined_an_invitation_to_the_group), R.drawable.ic_update_group_decline_16)); + } + } + + private void describeGroupMemberAddedUpdate(@NonNull GroupMemberAddedUpdate update, @NonNull List updates) { + boolean newMemberIsYou = selfIds.matches(update.newMemberAci); + + if (update.updaterAci == null) { + if (newMemberIsYou) { + updates.add(0, updateDescription(context.getString(R.string.MessageRecord_you_joined_the_group), R.drawable.ic_update_group_add_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_joined_the_group, update.newMemberAci, R.drawable.ic_update_group_add_16)); + } + } else if (update.hadOpenInvitation) { + if (selfIds.matches(update.updaterAci)) { + updates.add(updateDescription(R.string.MessageRecord_you_added_invited_member_s, update.newMemberAci, R.drawable.ic_update_group_add_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_added_invited_member_s, update.updaterAci, update.newMemberAci, R.drawable.ic_update_group_add_16)); + } + } else { + if (newMemberIsYou) { + updates.add(0, updateDescription(R.string.MessageRecord_s_added_you, update.updaterAci, R.drawable.ic_update_group_add_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_added_s, update.updaterAci, update.newMemberAci, R.drawable.ic_update_group_add_16)); + } + } + } + + private void describeGroupMemberJoinedUpdate(@NonNull GroupMemberJoinedUpdate update, @NonNull List updates) { + boolean newMemberIsYou = selfIds.matches(update.newMemberAci); + + if (newMemberIsYou) { + updates.add(0, updateDescription(context.getString(R.string.MessageRecord_you_joined_the_group), R.drawable.ic_update_group_add_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_joined_the_group, update.newMemberAci, R.drawable.ic_update_group_add_16)); + } + } + + private void describeGroupInvitationAcceptedUpdate(@NonNull GroupInvitationAcceptedUpdate update, @NonNull List updates) { + if (selfIds.matches(update.newMemberAci)) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_accepted_invite), R.drawable.ic_update_group_accept_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_accepted_invite, update.newMemberAci, R.drawable.ic_update_group_accept_16)); + } + } + + private void describeUnknownUsersInvitedUpdate(@NonNull GroupUnknownInviteeUpdate update, @NonNull List updates) { + if (update.inviterAci == null) { + updates.add(updateDescription(context.getResources().getQuantityString(R.plurals.MessageRecord_d_people_were_invited_to_the_group, update.inviteeCount, update.inviteeCount), R.drawable.ic_update_group_add_16)); + } else { + updates.add(updateDescription(R.plurals.MessageRecord_s_invited_members, update.inviteeCount, update.inviterAci, update.inviteeCount, R.drawable.ic_update_group_add_16)); + } + } + private void describeSelfInvitedOtherUserToGroupUpdate(@NonNull SelfInvitedOtherUserToGroupUpdate update, @NonNull List updates) { + updates.add(updateDescription(R.string.MessageRecord_you_invited_s_to_the_group, update.inviteeServiceId, R.drawable.ic_update_group_add_16)); + } + + private void describeSelfInvitedToGroupUpdate(@NonNull SelfInvitedToGroupUpdate update, @NonNull List updates) { + if (update.inviterAci == null) { + updates.add(0, updateDescription(context.getString(R.string.MessageRecord_you_were_invited_to_the_group), R.drawable.ic_update_group_add_16)); + } else { + updates.add(0, updateDescription(R.string.MessageRecord_s_invited_you_to_the_group, update.inviterAci, R.drawable.ic_update_group_add_16)); + } + } + + private void describeGenericGroupUpdate(@NonNull GenericGroupUpdate update, @NonNull List updates) { + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_was_updated), R.drawable.ic_update_group_16)); + } else { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_updated_group), R.drawable.ic_update_group_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_updated_group, update.updaterAci, R.drawable.ic_update_group_16)); + } + } + } + + private void describeGroupCreationUpdate(@NonNull GroupCreationUpdate update, @NonNull List updates) { + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_group_updated), R.drawable.ic_update_group_16)); + } else { + if (selfIds.matches(update.updaterAci)) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_created_the_group), R.drawable.ic_update_group_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_added_you, update.updaterAci, R.drawable.ic_update_group_add_16)); + } + } + } + + private void describeGroupNameUpdate(@NonNull GroupNameUpdate update, @NonNull List updates) { + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_name_has_changed_to_s, StringUtil.isolateBidi(update.newGroupName)), R.drawable.ic_update_group_name_16)); + } else { + String newTitle = StringUtil.isolateBidi(update.newGroupName); + if (selfIds.matches(update.updaterAci)) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_changed_the_group_name_to_s, newTitle), R.drawable.ic_update_group_name_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_changed_the_group_name_to_s, update.updaterAci, newTitle, R.drawable.ic_update_group_name_16)); + } + } + } + + private void describeGroupMembershipAccessLevelChange(@NonNull GroupMembershipAccessLevelChangeUpdate update, @NonNull List updates) { + if (update.accessLevel == GroupV2AccessLevel.UNKNOWN) { + return; + } + String accessLevel = GV2AccessLevelUtil.toString(context, backupGv2AccessLevelToGroups(update.accessLevel)); + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_who_can_edit_group_membership_has_been_changed_to_s, accessLevel), R.drawable.ic_update_group_role_16)); + } else { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_changed_who_can_edit_group_membership_to_s, accessLevel), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_changed_who_can_edit_group_membership_to_s, update.updaterAci, accessLevel, R.drawable.ic_update_group_role_16)); + } + } + } + + private void describeGroupAttributesAccessLevelChange(@NonNull GroupAttributesAccessLevelChangeUpdate update, @NonNull List updates) { + if (update.accessLevel == GroupV2AccessLevel.UNKNOWN) { + return; + } + String accessLevel = GV2AccessLevelUtil.toString(context, backupGv2AccessLevelToGroups(update.accessLevel)); + if (update.updaterAci == null) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_who_can_edit_group_info_has_been_changed_to_s, accessLevel), R.drawable.ic_update_group_role_16)); + } else { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_changed_who_can_edit_group_info_to_s, accessLevel), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_changed_who_can_edit_group_info_to_s, update.updaterAci, accessLevel, R.drawable.ic_update_group_role_16)); + } + } + } + + private void describeGroupAnnouncementOnlyUpdate(@NonNull GroupAnnouncementOnlyChangeUpdate update, @NonNull List updates) { + if (update.updaterAci == null) { + if (update.isAnnouncementOnly) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_allow_only_admins_to_send), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_allow_all_members_to_send), R.drawable.ic_update_group_role_16)); + } + } else { + boolean editorIsYou = selfIds.matches(update.updaterAci); + + if (update.isAnnouncementOnly) { + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_allow_only_admins_to_send), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_allow_only_admins_to_send, update.updaterAci, R.drawable.ic_update_group_role_16)); + } + } else { + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_allow_all_members_to_send), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_allow_all_members_to_send, update.updaterAci, R.drawable.ic_update_group_role_16)); + } + } + } + } + + private void describeGroupMemberLeftChange(@NonNull GroupMemberLeftUpdate update, @NonNull List updates) { + if (update.aci == null) { + return; + } + boolean editorIsYou = selfIds.matches(update.aci); + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_left_the_group), R.drawable.ic_update_group_leave_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_left_the_group, update.aci, R.drawable.ic_update_group_leave_16)); + } + } + + private void describeGroupMemberRemovedChange(@NonNull GroupMemberRemovedUpdate update, @NonNull List updates) { + if (update.removerAci == null) { + boolean removedMemberIsYou = selfIds.matches(update.removedAci); + + if (removedMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_are_no_longer_in_the_group), R.drawable.ic_update_group_leave_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_is_no_longer_in_the_group, update.removedAci, R.drawable.ic_update_group_leave_16)); + } + } else { + boolean editorIsYou = selfIds.matches(update.removerAci); + + boolean removedMemberIsYou = selfIds.matches(update.removedAci); + + if (editorIsYou) { + if (removedMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_left_the_group), R.drawable.ic_update_group_leave_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_you_removed_s, update.removedAci, R.drawable.ic_update_group_remove_16)); + } + } else { + if (removedMemberIsYou) { + updates.add(updateDescription(R.string.MessageRecord_s_removed_you_from_the_group, update.removerAci, R.drawable.ic_update_group_remove_16)); + } else { + if (update.removerAci.equals(update.removedAci)) { + updates.add(updateDescription(R.string.MessageRecord_s_left_the_group, update.removedAci, R.drawable.ic_update_group_leave_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_removed_s, update.removerAci, update.removedAci, R.drawable.ic_update_group_remove_16)); + } + } + } + } + } + + private AccessControl.AccessRequired backupGv2AccessLevelToGroups(@NonNull GroupV2AccessLevel accessLevel) { + switch (accessLevel) { + case ANY: return AccessControl.AccessRequired.ANY; + case MEMBER: return AccessControl.AccessRequired.MEMBER; + case ADMINISTRATOR: return AccessControl.AccessRequired.ADMINISTRATOR; + case UNSATISFIABLE: return AccessControl.AccessRequired.UNSATISFIABLE; + default: + case UNKNOWN: return AccessControl.AccessRequired.UNKNOWN; + } + } + List describeChanges(@Nullable DecryptedGroup previousGroupState, @NonNull DecryptedGroupChange change) { if (new DecryptedGroup().equals(previousGroupState)) { previousGroupState = null; @@ -317,6 +832,51 @@ private void describeUnknownEditorModifyMemberRoles(@NonNull DecryptedGroupChang } } + private void describeAdminStatusChange(@NonNull GroupAdminStatusUpdate groupAdminStatusUpdate, List updates) { + boolean changedMemberIsYou = selfIds.matches(groupAdminStatusUpdate.memberAci); + + if (groupAdminStatusUpdate.updaterAci != null) { + boolean editorIsYou = selfIds.matches(groupAdminStatusUpdate.updaterAci); + + if (groupAdminStatusUpdate.wasAdminStatusGranted) { + if (editorIsYou) { + updates.add(updateDescription(R.string.MessageRecord_you_made_s_an_admin, groupAdminStatusUpdate.memberAci, R.drawable.ic_update_group_role_16)); + } else { + if (changedMemberIsYou) { + updates.add(updateDescription(R.string.MessageRecord_s_made_you_an_admin, groupAdminStatusUpdate.updaterAci, R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_made_s_an_admin, groupAdminStatusUpdate.updaterAci, groupAdminStatusUpdate.memberAci, R.drawable.ic_update_group_role_16)); + + } + } + } else { + if (editorIsYou) { + updates.add(updateDescription(R.string.MessageRecord_you_revoked_admin_privileges_from_s, groupAdminStatusUpdate.memberAci, R.drawable.ic_update_group_role_16)); + } else { + if (changedMemberIsYou) { + updates.add(updateDescription(R.string.MessageRecord_s_revoked_your_admin_privileges, groupAdminStatusUpdate.updaterAci, R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_revoked_admin_privileges_from_s, groupAdminStatusUpdate.updaterAci, groupAdminStatusUpdate.memberAci, R.drawable.ic_update_group_role_16)); + } + } + } + } else { + if (groupAdminStatusUpdate.wasAdminStatusGranted) { + if (changedMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_are_now_an_admin), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_is_now_an_admin, groupAdminStatusUpdate.memberAci, R.drawable.ic_update_group_role_16)); + } + } else { + if (changedMemberIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_are_no_longer_an_admin), R.drawable.ic_update_group_role_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_is_no_longer_an_admin, groupAdminStatusUpdate.memberAci, R.drawable.ic_update_group_role_16)); + } + } + } + } + private void describeInvitations(@NonNull DecryptedGroupChange change, @NonNull List updates) { boolean editorIsYou = selfIds.matches(change.editorServiceIdBytes); int notYouInviteCount = 0; @@ -481,6 +1041,20 @@ private void describeUnknownEditorNewTitle(@NonNull DecryptedGroupChange change, } } + private void describeDescriptionChange(@NonNull GroupDescriptionUpdate groupDescriptionUpdate, @NonNull List updates) { + if (groupDescriptionUpdate.updaterAci != null) { + boolean editorIsYou = selfIds.matches(groupDescriptionUpdate.updaterAci); + + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_changed_the_group_description), R.drawable.ic_update_group_name_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_changed_the_group_description, groupDescriptionUpdate.updaterAci, R.drawable.ic_update_group_name_16)); + } + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_name_has_changed_to_s, StringUtil.isolateBidi(groupDescriptionUpdate.newDescription)), R.drawable.ic_update_group_name_16)); + } + } + private void describeUnknownEditorNewDescription(@NonNull DecryptedGroupChange change, @NonNull List updates) { if (change.newDescription != null) { updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_description_has_changed), R.drawable.ic_update_group_name_16)); @@ -499,6 +1073,20 @@ private void describeNewAvatar(@NonNull DecryptedGroupChange change, @NonNull Li } } + private void describeAvatarChange(@NonNull GroupAvatarUpdate groupAvatarUpdate, @NonNull List updates) { + if (groupAvatarUpdate.updaterAci != null) { + boolean editorIsYou = selfIds.matches(groupAvatarUpdate.updaterAci); + + if (editorIsYou) { + updates.add(updateDescription(context.getString(R.string.MessageRecord_you_changed_the_group_avatar), R.drawable.ic_update_group_avatar_16)); + } else { + updates.add(updateDescription(R.string.MessageRecord_s_changed_the_group_avatar, groupAvatarUpdate.updaterAci, R.drawable.ic_update_group_avatar_16)); + } + } else { + updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_group_avatar_has_been_changed), R.drawable.ic_update_group_avatar_16)); + } + } + private void describeUnknownEditorNewAvatar(@NonNull DecryptedGroupChange change, @NonNull List updates) { if (change.newAvatar != null) { updates.add(updateDescription(context.getString(R.string.MessageRecord_the_group_group_avatar_has_been_changed), R.drawable.ic_update_group_avatar_16)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java index 2613298c2c..3f332eb576 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/InMemoryMessageRecord.java @@ -56,7 +56,8 @@ private InMemoryMessageRecord(long id, false, -1, null, - 0); + 0, + null); } @Override @@ -82,45 +83,6 @@ public boolean showActionButton() { return 0; } - /** - * Warning message to show during message request state if you do not have groups in common - * with an individual or do not know anyone in the group. - */ - public static final class NoGroupsInCommon extends InMemoryMessageRecord { - private final boolean isGroup; - - public NoGroupsInCommon(long threadId, boolean isGroup) { - super(NO_GROUPS_IN_COMMON_ID, "", Recipient.UNKNOWN, threadId, 0); - this.isGroup = isGroup; - } - - @Override - public @Nullable UpdateDescription getUpdateDisplayBody(@NonNull Context context, @Nullable Consumer recipientClickHandler) { - return UpdateDescription.staticDescription(context.getString(isGroup ? R.string.ConversationUpdateItem_no_contacts_in_this_group_review_requests_carefully - : R.string.ConversationUpdateItem_no_groups_in_common_review_requests_carefully), - R.drawable.symbol_info_compact_16); - } - - @Override - public boolean isUpdate() { - return true; - } - - @Override - public boolean showActionButton() { - return true; - } - - public boolean isGroup() { - return isGroup; - } - - @Override - public @StringRes int getActionButtonText() { - return R.string.ConversationUpdateItem_learn_more; - } - } - public static final class RemovedContactHidden extends InMemoryMessageRecord { public RemovedContactHidden(long threadId) { 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 7cff1e5719..f2db0edff9 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 @@ -45,6 +45,7 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.database.model.databaseprotos.DecryptedGroupV2Context; import org.thoughtcrime.securesms.database.model.databaseprotos.GroupCallUpdateDetails; +import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras; import org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails; import org.thoughtcrime.securesms.database.model.databaseprotos.SessionSwitchoverEvent; import org.thoughtcrime.securesms.database.model.databaseprotos.ThreadMergeEvent; @@ -104,6 +105,7 @@ public abstract class MessageRecord extends DisplayRecord { private final long receiptTimestamp; private final MessageId originalMessageId; private final int revisionNumber; + private final MessageExtras messageExtras; protected Boolean isJumboji = null; @@ -123,7 +125,8 @@ public abstract class MessageRecord extends DisplayRecord { boolean viewed, long receiptTimestamp, @Nullable MessageId originalMessageId, - int revisionNumber) + int revisionNumber, + @Nullable MessageExtras messageExtras) { super(body, fromRecipient, toRecipient, dateSent, dateReceived, threadId, deliveryStatus, hasDeliveryReceipt, type, @@ -143,6 +146,7 @@ public abstract class MessageRecord extends DisplayRecord { this.receiptTimestamp = receiptTimestamp; this.originalMessageId = originalMessageId; this.revisionNumber = revisionNumber; + this.messageExtras = messageExtras; } public abstract boolean isMms(); @@ -252,7 +256,7 @@ public SpannableString getDisplayBody(@NonNull Context context, @Nullable Consum if (event.e164.isEmpty()) { return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_your_safety_number_with_s_has_changed, r.getDisplayName(context)), R.drawable.ic_update_safety_number_16); } else { - return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_s_belongs_to_s, PhoneNumberFormatter.prettyPrint(r.requireE164()), r.getDisplayName(context)), R.drawable.ic_update_info_16); + return fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_s_belongs_to_s, PhoneNumberFormatter.prettyPrint(event.e164), r.getDisplayName(context)), R.drawable.ic_update_info_16); } } catch (IOException e) { throw new AssertionError(e); @@ -266,6 +270,10 @@ public SpannableString getDisplayBody(@NonNull Context context, @Nullable Consum } else if (isPaymentsActivated()) { return isOutgoing() ? staticUpdateDescription(context.getString(R.string.MessageRecord_you_activated_payments), R.drawable.ic_card_activate_payments) : fromRecipient(getFromRecipient(), r -> context.getString(R.string.MessageRecord_can_accept_payments, r.getShortDisplayName(context)), R.drawable.ic_card_activate_payments); + } else if (isReportedSpam()) { + return staticUpdateDescription(context.getString(R.string.MessageRecord_reported_as_spam), R.drawable.symbol_spam_16); + } else if (isMessageRequestAccepted()) { + return staticUpdateDescription(context.getString(R.string.MessageRecord_you_accepted_the_message_request), R.drawable.symbol_thread_16); } return null; @@ -286,6 +294,10 @@ public boolean isSelfCreatedGroup() { return selfCreatedGroup(change); } + @Nullable public MessageExtras getMessageExtras() { + return messageExtras; + } + @VisibleForTesting @Nullable DecryptedGroupV2Context getDecryptedGroupV2Context() { if (!isGroupUpdate() || !isGroupV2()) { @@ -314,6 +326,30 @@ private static boolean selfCreatedGroup(@Nullable DecryptedGroupChange change) { try { byte[] decoded = Base64.decode(body); DecryptedGroupV2Context decryptedGroupV2Context = DecryptedGroupV2Context.ADAPTER.decode(decoded); + return getGv2ChangeDescription(context, decryptedGroupV2Context, recipientClickHandler); + } catch (IOException | IllegalArgumentException | IllegalStateException e) { + Log.w(TAG, "GV2 Message update detail could not be read", e); + return staticUpdateDescription(context.getString(R.string.MessageRecord_group_updated), R.drawable.ic_update_group_16); + } + } + + public static @NonNull UpdateDescription getGv2ChangeDescription(@NonNull Context context, @NonNull MessageExtras messageExtras, @Nullable Consumer recipientClickHandler) { + if (messageExtras.gv2UpdateDescription != null) { + if (messageExtras.gv2UpdateDescription.groupChangeUpdate != null) { + GroupsV2UpdateMessageProducer updateMessageProducer = new GroupsV2UpdateMessageProducer(context, SignalStore.account().getServiceIds(), recipientClickHandler); + + return UpdateDescription.concatWithNewLines(updateMessageProducer.describeChanges(messageExtras.gv2UpdateDescription.groupChangeUpdate.updates)); + } else if (messageExtras.gv2UpdateDescription.gv2ChangeDescription != null) { + return getGv2ChangeDescription(context, messageExtras.gv2UpdateDescription.gv2ChangeDescription, recipientClickHandler); + } else { + Log.w(TAG, "GV2 Update Description missing group change update!"); + } + } + return staticUpdateDescription(context.getString(R.string.MessageRecord_group_updated), R.drawable.ic_update_group_16); + } + + public static @NonNull UpdateDescription getGv2ChangeDescription(@NonNull Context context, @NonNull DecryptedGroupV2Context decryptedGroupV2Context, @Nullable Consumer recipientClickHandler) { + try { GroupsV2UpdateMessageProducer updateMessageProducer = new GroupsV2UpdateMessageProducer(context, SignalStore.account().getServiceIds(), recipientClickHandler); if (decryptedGroupV2Context.change != null && ((decryptedGroupV2Context.groupState != null && decryptedGroupV2Context.groupState.revision != 0) || decryptedGroupV2Context.previousGroupState != null)) { @@ -331,7 +367,7 @@ private static boolean selfCreatedGroup(@Nullable DecryptedGroupChange change) { } return UpdateDescription.concatWithNewLines(newGroupDescriptions); } - } catch (IOException | IllegalArgumentException | IllegalStateException e) { + } catch (IllegalArgumentException | IllegalStateException e) { Log.w(TAG, "GV2 Message update detail could not be read", e); return staticUpdateDescription(context.getString(R.string.MessageRecord_group_updated), R.drawable.ic_update_group_16); } @@ -599,7 +635,7 @@ public boolean isUpdate() { isEndSession() || isIdentityUpdate() || isIdentityVerified() || isIdentityDefault() || isProfileChange() || isGroupV1MigrationEvent() || isChatSessionRefresh() || isBadDecryptType() || isChangeNumber() || isBoostRequest() || isThreadMergeEventType() || isSmsExportType() || isSessionSwitchoverEventType() || - isPaymentsRequestToActivate() || isPaymentsActivated(); + isPaymentsRequestToActivate() || isPaymentsActivated() || isReportedSpam() || isMessageRequestAccepted(); } public boolean isMediaPending() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java index 4d044a5da9..febd0af229 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MmsMessageRecord.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.database.documents.NetworkFailure; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; import org.thoughtcrime.securesms.database.model.databaseprotos.GiftBadge; +import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras; import org.thoughtcrime.securesms.linkpreview.LinkPreview; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.mms.SlideDeck; @@ -111,12 +112,13 @@ public MmsMessageRecord(long id, @Nullable MessageId latestRevisionId, @Nullable MessageId originalMessageId, int revisionNumber, - boolean isRead) + boolean isRead, + @Nullable MessageExtras messageExtras) { super(id, body, fromRecipient, fromDeviceId, toRecipient, dateSent, dateReceived, dateServer, threadId, Status.STATUS_NONE, hasDeliveryReceipt, mailbox, mismatches, failures, subscriptionId, expiresIn, expireStarted, hasReadReceipt, - unidentified, reactions, remoteDelete, notifiedTimestamp, viewed, receiptTimestamp, originalMessageId, revisionNumber); + unidentified, reactions, remoteDelete, notifiedTimestamp, viewed, receiptTimestamp, originalMessageId, revisionNumber, messageExtras); this.slideDeck = slideDeck; this.quote = quote; @@ -299,7 +301,7 @@ public long getScheduledDate() { getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), hasReadReceipt(), getQuote(), getSharedContacts(), getLinkPreviews(), isUnidentified(), reactions, isRemoteDelete(), mentionsSelf, getNotifiedTimestamp(), isViewed(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge(), getPayment(), getCall(), getScheduledDate(), getLatestRevisionId(), - getOriginalMessageId(), getRevisionNumber(), isRead()); + getOriginalMessageId(), getRevisionNumber(), isRead(), getMessageExtras()); } public @NonNull MmsMessageRecord withoutQuote() { @@ -307,7 +309,7 @@ public long getScheduledDate() { getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), hasReadReceipt(), null, getSharedContacts(), getLinkPreviews(), isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, getNotifiedTimestamp(), isViewed(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge(), getPayment(), getCall(), getScheduledDate(), getLatestRevisionId(), - getOriginalMessageId(), getRevisionNumber(), isRead()); + getOriginalMessageId(), getRevisionNumber(), isRead(), getMessageExtras()); } public @NonNull MmsMessageRecord withAttachments(@NonNull List attachments) { @@ -329,7 +331,7 @@ public long getScheduledDate() { getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), hasReadReceipt(), quote, contacts, linkPreviews, isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, getNotifiedTimestamp(), isViewed(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge(), getPayment(), getCall(), getScheduledDate(), getLatestRevisionId(), - getOriginalMessageId(), getRevisionNumber(), isRead()); + getOriginalMessageId(), getRevisionNumber(), isRead(), getMessageExtras()); } public @NonNull MmsMessageRecord withPayment(@NonNull Payment payment) { @@ -337,7 +339,7 @@ public long getScheduledDate() { getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), hasReadReceipt(), getQuote(), getSharedContacts(), getLinkPreviews(), isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, getNotifiedTimestamp(), isViewed(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge(), payment, getCall(), getScheduledDate(), getLatestRevisionId(), - getOriginalMessageId(), getRevisionNumber(), isRead()); + getOriginalMessageId(), getRevisionNumber(), isRead(), getMessageExtras()); } @@ -346,7 +348,7 @@ public long getScheduledDate() { getType(), getIdentityKeyMismatches(), getNetworkFailures(), getSubscriptionId(), getExpiresIn(), getExpireStarted(), isViewOnce(), hasReadReceipt(), getQuote(), getSharedContacts(), getLinkPreviews(), isUnidentified(), getReactions(), isRemoteDelete(), mentionsSelf, getNotifiedTimestamp(), isViewed(), getReceiptTimestamp(), getMessageRanges(), getStoryType(), getParentStoryId(), getGiftBadge(), getPayment(), call, getScheduledDate(), getLatestRevisionId(), - getOriginalMessageId(), getRevisionNumber(), isRead()); + getOriginalMessageId(), getRevisionNumber(), isRead(), getMessageExtras()); } private static @NonNull List updateContacts(@NonNull List contacts, @NonNull Map attachmentIdMap) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt index 7b4cae3c91..d1e427a4a1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/RecipientRecord.kt @@ -111,7 +111,8 @@ data class RecipientRecord( val isArchived: Boolean, val isForcedUnread: Boolean, val unregisteredTimestamp: Long, - val systemNickname: String? + val systemNickname: String?, + val pniSignatureVerified: Boolean ) data class Capabilities( diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java index abc1d4709d..fcbc5ba24e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/ThreadRecord.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.database.ThreadTable; import org.thoughtcrime.securesms.database.ThreadTable.Extra; import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList; +import org.thoughtcrime.securesms.database.model.databaseprotos.MessageExtras; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.whispersystems.signalservice.api.util.Preconditions; @@ -37,26 +38,27 @@ */ public final class ThreadRecord { - private final long threadId; - private final String body; - private final Recipient recipient; - private final long type; - private final long date; - private final long deliveryStatus; - private final boolean hasDeliveryReceipt; - private final boolean hasReadReceipt; - private final Uri snippetUri; - private final String contentType; - private final Extra extra; - private final boolean meaningfulMessages; - private final int unreadCount; - private final boolean forcedUnread; - private final int distributionType; - private final boolean archived; - private final long expiresIn; - private final long lastSeen; - private final boolean isPinned; - private final int unreadSelfMentionsCount; + private final long threadId; + private final String body; + private final Recipient recipient; + private final long type; + private final long date; + private final long deliveryStatus; + private final boolean hasDeliveryReceipt; + private final boolean hasReadReceipt; + private final Uri snippetUri; + private final String contentType; + private final Extra extra; + private final boolean meaningfulMessages; + private final int unreadCount; + private final boolean forcedUnread; + private final int distributionType; + private final boolean archived; + private final long expiresIn; + private final long lastSeen; + private final boolean isPinned; + private final int unreadSelfMentionsCount; + private final MessageExtras messageExtras; private ThreadRecord(@NonNull Builder builder) { this.threadId = builder.threadId; @@ -79,6 +81,7 @@ private ThreadRecord(@NonNull Builder builder) { this.lastSeen = builder.lastSeen; this.isPinned = builder.isPinned; this.unreadSelfMentionsCount = builder.unreadSelfMentionsCount; + this.messageExtras = builder.messageExtras; } public long getThreadId() { @@ -189,6 +192,10 @@ public boolean isScheduledMessage() { return extra != null && extra.isScheduled(); } + public @Nullable MessageExtras getMessageExtras() { + return messageExtras; + } + public @Nullable RecipientId getGroupAddedBy() { if (extra != null && extra.getGroupAddedBy() != null) return RecipientId.from(extra.getGroupAddedBy()); else return null; @@ -287,26 +294,27 @@ public int hashCode() { } public static class Builder { - private long threadId; - private String body; - private Recipient recipient = Recipient.UNKNOWN; - private long type; - private long date; - private long deliveryStatus; - private boolean hasDeliveryReceipt; - private boolean hasReadReceipt; - private Uri snippetUri; - private String contentType; - private Extra extra; - private boolean meaningfulMessages; - private int unreadCount; - private boolean forcedUnread; - private int distributionType; - private boolean archived; - private long expiresIn; - private long lastSeen; - private boolean isPinned; - private int unreadSelfMentionsCount; + private long threadId; + private String body; + private Recipient recipient = Recipient.UNKNOWN; + private long type; + private long date; + private long deliveryStatus; + private boolean hasDeliveryReceipt; + private boolean hasReadReceipt; + private Uri snippetUri; + private String contentType; + private Extra extra; + private boolean meaningfulMessages; + private int unreadCount; + private boolean forcedUnread; + private int distributionType; + private boolean archived; + private long expiresIn; + private long lastSeen; + private boolean isPinned; + private int unreadSelfMentionsCount; + private MessageExtras messageExtras; public Builder(long threadId) { this.threadId = threadId; @@ -407,6 +415,11 @@ public Builder setPinned(boolean isPinned) { return this; } + public Builder setSnippetMessageExtras(@Nullable MessageExtras messageExtras) { + this.messageExtras = messageExtras; + return this; + } + public Builder setUnreadSelfMentionsCount(int unreadSelfMentionsCount) { this.unreadSelfMentionsCount = unreadSelfMentionsCount; return this; diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java index f06b90c382..c0fd7e8fdb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java @@ -605,6 +605,12 @@ public static TypingStatusSender getTypingStatusSender() { return protocolStore; } + public static void resetProtocolStores() { + synchronized (LOCK) { + protocolStore = null; + } + } + public static @NonNull GiphyMp4Cache getGiphyMp4Cache() { if (giphyMp4Cache == null) { synchronized (LOCK) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java index 2a7ec0b2de..99c83754cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/devicetransfer/DeviceTransferSetupFragment.java @@ -282,7 +282,7 @@ private void requestRequiredPermission() { Permissions.with(this) .request(WifiDirect.requiredPermission()) .ifNecessary() - .withRationaleDialog(getString(getErrorTextForStep(SetupStep.PERMISSIONS_DENIED)), false, R.drawable.ic_location_on_white_24dp) + .withRationaleDialog(getString(getErrorTextForStep(SetupStep.PERMISSIONS_DENIED)), false, R.drawable.symbol_location_white_24) .withPermanentDenialDialog(getString(getErrorTextForStep(SetupStep.PERMISSIONS_DENIED))) .onAllGranted(() -> viewModel.onPermissionsGranted()) .onAnyDenied(() -> viewModel.onLocationPermissionDenied()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ViewHolder.java index ae471b62fb..129df89848 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ViewHolder.java @@ -10,6 +10,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; @@ -22,7 +23,6 @@ import org.thoughtcrime.securesms.conversation.colors.ChatColorsPalette; import org.thoughtcrime.securesms.giph.model.ChunkedImageUrl; import org.thoughtcrime.securesms.giph.model.GiphyImage; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.util.Projection; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; @@ -99,7 +99,7 @@ public boolean shouldProjectContent() { } private void loadPlaceholderImage(@NonNull GiphyImage giphyImage) { - GlideApp.with(itemView) + Glide.with(itemView) .load(new ChunkedImageUrl(giphyImage.getStillUrl())) .placeholder(placeholder) .diskCacheStrategy(DiskCacheStrategy.ALL) diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java index c082cebf4b..15afefc9bc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/ui/GiphyActivity.java @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; @@ -59,6 +60,9 @@ public void onPreCreate() { @SuppressLint("MissingInflatedId") @Override public void onCreate(Bundle bundle, boolean ready) { + if (!FeatureFlags.gifSearchAvailable()) { + finish(); + } setContentView(R.layout.giphy_activity); final boolean forMms = getIntent().getBooleanExtra(EXTRA_IS_MMS, false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java index 57a96232fc..09de6bca61 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManager.java @@ -200,11 +200,12 @@ public static GroupsV2StateProcessor.GroupUpdateResult updateGroupFromServer(@No @Nullable GroupSecretParams groupSecretParams, int revision, long timestamp, - @Nullable byte[] signedGroupChange) + @Nullable byte[] signedGroupChange, + @Nullable String serverGuid) throws GroupChangeBusyException, IOException, GroupNotAMemberException { try (GroupManagerV2.GroupUpdater updater = new GroupManagerV2(context).updater(groupMasterKey)) { - return updater.updateLocalToServerRevision(revision, timestamp, groupRecord, groupSecretParams, signedGroupChange); + return updater.updateLocalToServerRevision(revision, timestamp, groupRecord, groupSecretParams, signedGroupChange, serverGuid); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java index 2da1d90b40..98a9922478 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/GroupManagerV2.java @@ -805,11 +805,16 @@ GroupsV2StateProcessor.GroupUpdateResult updateLocalToServerRevision(int revisio } @WorkerThread - GroupsV2StateProcessor.GroupUpdateResult updateLocalToServerRevision(int revision, long timestamp, @NonNull Optional localRecord, @Nullable GroupSecretParams groupSecretParams, @Nullable byte[] signedGroupChange) + GroupsV2StateProcessor.GroupUpdateResult updateLocalToServerRevision(int revision, + long timestamp, + @NonNull Optional localRecord, + @Nullable GroupSecretParams groupSecretParams, + @Nullable byte[] signedGroupChange, + @Nullable String serverGuid) throws IOException, GroupNotAMemberException { return new GroupsV2StateProcessor(context).forGroup(serviceIds, groupMasterKey, groupSecretParams) - .updateLocalGroupToRevision(revision, timestamp, localRecord, getDecryptedGroupChange(signedGroupChange)); + .updateLocalGroupToRevision(revision, timestamp, localRecord, getDecryptedGroupChange(signedGroupChange), serverGuid); } @WorkerThread diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java index 652e894bf2..4e639613ed 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/addmembers/AddMembersActivity.java @@ -6,6 +6,7 @@ import android.view.View; import android.widget.Toast; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.lifecycle.ViewModelProvider; @@ -20,20 +21,24 @@ import org.thoughtcrime.securesms.groups.SelectionLimits; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.recipients.ui.findby.FindByActivity; +import org.thoughtcrime.securesms.recipients.ui.findby.FindByMode; import org.thoughtcrime.securesms.util.Util; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Consumer; -public class AddMembersActivity extends PushContactSelectionActivity { +public class AddMembersActivity extends PushContactSelectionActivity implements ContactSelectionListFragment.FindByCallback { public static final String GROUP_ID = "group_id"; public static final String ANNOUNCEMENT_GROUP = "announcement_group"; - private View done; - private AddMembersViewModel viewModel; + private View done; + private AddMembersViewModel viewModel; + private ActivityResultLauncher findByActivityLauncher; public static @NonNull Intent createIntent(@NonNull Context context, @NonNull GroupId groupId, @@ -70,6 +75,12 @@ protected void onCreate(Bundle icicle, boolean ready) { ); disableDone(); + + findByActivityLauncher = registerForActivityResult(new FindByActivity.Contract(), result -> { + if (result != null) { + contactsFragment.addRecipientToSelectionIfAble(result); + } + }); } @Override @@ -119,6 +130,16 @@ public void onSelectionChanged() { } } + @Override + public void onFindByPhoneNumber() { + findByActivityLauncher.launch(FindByMode.PHONE_NUMBER); + } + + @Override + public void onFindByUsername() { + findByActivityLauncher.launch(FindByMode.USERNAME); + } + private void enableDone() { done.setEnabled(true); done.animate().alpha(1f); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index 811c11ca17..663547cbfc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -6,6 +6,7 @@ import android.view.MenuItem; import android.view.View; +import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -26,11 +27,14 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.recipients.ui.findby.FindByActivity; +import org.thoughtcrime.securesms.recipients.ui.findby.FindByMode; import org.thoughtcrime.securesms.util.FeatureFlags; import org.signal.core.util.Stopwatch; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; @@ -38,14 +42,16 @@ import java.util.function.Consumer; import java.util.stream.Collectors; -public class CreateGroupActivity extends ContactSelectionActivity { +public class CreateGroupActivity extends ContactSelectionActivity implements ContactSelectionListFragment.FindByCallback { private static final String TAG = Log.tag(CreateGroupActivity.class); private static final short REQUEST_CODE_ADD_DETAILS = 17275; - private MaterialButton skip; - private FloatingActionButton next; + private MaterialButton skip; + private FloatingActionButton next; + private ActivityResultLauncher findByActivityLauncher; + public static Intent newIntent(@NonNull Context context) { Intent intent = new Intent(context, CreateGroupActivity.class); @@ -75,6 +81,12 @@ public void onCreate(Bundle bundle, boolean ready) { skip.setOnClickListener(v -> handleNextPressed()); next.setOnClickListener(v -> handleNextPressed()); + + findByActivityLauncher = registerForActivityResult(new FindByActivity.Contract(), result -> { + if (result != null) { + contactsFragment.addRecipientToSelectionIfAble(result); + } + }); } @Override @@ -129,6 +141,16 @@ public void onSelectionChanged() { } } + @Override + public void onFindByPhoneNumber() { + findByActivityLauncher.launch(FindByMode.PHONE_NUMBER); + } + + @Override + public void onFindByUsername() { + findByActivityLauncher.launch(FindByMode.USERNAME); + } + private void extendSkip() { skip.setVisibility(View.VISIBLE); next.setVisibility(View.GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java index 4a82bfcd8e..39b06acb7f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/details/AddGroupDetailsFragment.java @@ -25,6 +25,7 @@ import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat; import com.airbnb.lottie.SimpleColorFilter; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; @@ -39,7 +40,6 @@ import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.profiles.AvatarHelper; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -136,7 +136,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat if (avatarBytes == null) { avatar.setImageDrawable(new InsetDrawable(avatarPlaceholder, ViewUtil.dpToPx(AVATAR_PLACEHOLDER_INSET_DP))); } else { - GlideApp.with(this) + Glide.with(this) .load(avatarBytes) .circleCrop() .skipMemoryCache(true) @@ -178,7 +178,7 @@ private void handleMediaResult(Bundle data) { viewModel.setAvatarMedia(result); - GlideApp.with(this) + Glide.with(this) .asBitmap() .load(decryptableUri) .skipMemoryCache(true) diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index 748e42a420..d4178b86a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -238,10 +238,10 @@ public GroupUpdateResult forceSanityUpdateFromServer(long timestamp) updateLocalDatabaseGroupState(inputGroupState, newLocalState); if (localState.revision == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION) { info("Inserting single update message for restore placeholder"); - profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(newLocalState, null))); + profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(newLocalState, null)), null); } else { info("Inserting force update messages"); - profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries()); + profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries(), null); } profileAndMessageHelper.persistLearnedProfileKeys(inputGroupState); @@ -259,7 +259,7 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, @Nullable DecryptedGroupChange signedGroupChange) throws IOException, GroupNotAMemberException { - return updateLocalGroupToRevision(revision, timestamp, groupDatabase.getGroup(groupId), signedGroupChange); + return updateLocalGroupToRevision(revision, timestamp, groupDatabase.getGroup(groupId), signedGroupChange, null); } /** @@ -271,7 +271,8 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, public GroupUpdateResult updateLocalGroupToRevision(final int revision, final long timestamp, @NonNull Optional localRecord, - @Nullable DecryptedGroupChange signedGroupChange) + @Nullable DecryptedGroupChange signedGroupChange, + @Nullable String serverGuid) throws IOException, GroupNotAMemberException { if (localIsAtLeast(localRecord, revision)) { @@ -287,7 +288,6 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, localState.revision + 1 == signedGroupChange.revision && revision == signedGroupChange.revision) { - if (notInGroupAndNotBeingAdded(localRecord, signedGroupChange) && notHavingInviteRevoked(signedGroupChange)) { warn("Ignoring P2P group change because we're not currently in the group and this change doesn't add us in. Falling back to a server fetch."); } else if (SignalStore.internalValues().gv2IgnoreP2PChanges()) { @@ -306,7 +306,7 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, if (inputGroupState == null) { try { - return updateLocalGroupFromServerPaged(revision, localState, timestamp, false); + return updateLocalGroupFromServerPaged(revision, localState, timestamp, false, serverGuid); } catch (GroupNotAMemberException e) { if (localState != null && signedGroupChange != null) { try { @@ -346,9 +346,9 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, updateLocalDatabaseGroupState(inputGroupState, newLocalState); if (localState != null && localState.revision == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION) { info("Inserting single update message for restore placeholder"); - profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(newLocalState, null))); + profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(newLocalState, null)), null); } else { - profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries()); + profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries(), serverGuid); } profileAndMessageHelper.persistLearnedProfileKeys(inputGroupState); @@ -398,7 +398,7 @@ private boolean notHavingInviteRevoked(@NonNull DecryptedGroupChange signedGroup /** * Using network, attempt to bring the local copy of the group up to the revision specified via paging. */ - private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, DecryptedGroup localState, long timestamp, boolean forceIncludeFirst) throws IOException, GroupNotAMemberException { + private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, DecryptedGroup localState, long timestamp, boolean forceIncludeFirst, @Nullable String serverGuid) throws IOException, GroupNotAMemberException { boolean latestRevisionOnly = revision == LATEST && (localState == null || localState.revision == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION); info("Paging from server revision: " + (revision == LATEST ? "latest" : revision) + ", latestOnly: " + latestRevisionOnly); @@ -456,7 +456,7 @@ private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, Decrypte int requestRevision = (revision == LATEST) ? latestServerGroup.getRevision() : revision; if (newLocalRevision < requestRevision) { warn( "Paging again with force first snapshot enabled due to error processing changes. New local revision [" + newLocalRevision + "] hasn't reached our desired level [" + requestRevision + "]"); - return updateLocalGroupFromServerPaged(revision, localState, timestamp, true); + return updateLocalGroupFromServerPaged(revision, localState, timestamp, true, serverGuid); } } @@ -467,7 +467,7 @@ private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, Decrypte updateLocalDatabaseGroupState(inputGroupState, newLocalState); if (localState == null || localState.revision != GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION) { - timestamp = profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries()); + timestamp = profileAndMessageHelper.insertUpdateMessages(timestamp, localState, advanceGroupStateResult.getProcessedLogEntries(), serverGuid); } for (ServerGroupLogEntry entry : inputGroupState.getServerHistory()) { @@ -491,7 +491,7 @@ private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, Decrypte if (localState != null && localState.revision == GroupsV2StateProcessor.RESTORE_PLACEHOLDER_REVISION) { info("Inserting single update message for restore placeholder"); - profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(finalState, null))); + profileAndMessageHelper.insertUpdateMessages(timestamp, null, Collections.singleton(new LocalGroupLogEntry(finalState, null)), serverGuid); } profileAndMessageHelper.persistLearnedProfileKeys(profileKeys); @@ -735,7 +735,8 @@ void determineProfileSharing(@NonNull GlobalGroupState inputGroupState, @NonNull long insertUpdateMessages(long timestamp, @Nullable DecryptedGroup previousGroupState, - Collection processedLogEntries) + Collection processedLogEntries, + @Nullable String serverGuid) { for (LocalGroupLogEntry entry : processedLogEntries) { if (entry.getChange() != null && DecryptedGroupUtil.changeIsEmptyExceptForProfileKeyChanges(entry.getChange()) && !DecryptedGroupUtil.changeIsEmpty(entry.getChange())) { @@ -746,7 +747,7 @@ long insertUpdateMessages(long timestamp, if (entry.getChange() != null && DecryptedGroupUtil.changeIsEmpty(entry.getChange()) && previousGroupState != null) { Log.w(TAG, "Empty group update message seen. Not inserting."); } else { - storeMessage(GroupProtoUtil.createDecryptedGroupV2Context(masterKey, new GroupMutation(previousGroupState, entry.getChange(), entry.getGroup()), null), timestamp); + storeMessage(GroupProtoUtil.createDecryptedGroupV2Context(masterKey, new GroupMutation(previousGroupState, entry.getChange(), entry.getGroup()), null), timestamp, serverGuid); timestamp++; } } @@ -782,7 +783,7 @@ void persistLearnedProfileKeys(@NonNull ProfileKeySet profileKeys) { } } - void storeMessage(@NonNull DecryptedGroupV2Context decryptedGroupV2Context, long timestamp) { + void storeMessage(@NonNull DecryptedGroupV2Context decryptedGroupV2Context, long timestamp, @Nullable String serverGuid) { Optional editor = getEditor(decryptedGroupV2Context); boolean outgoing = !editor.isPresent() || aci.equals(editor.get()); @@ -806,7 +807,7 @@ void storeMessage(@NonNull DecryptedGroupV2Context decryptedGroupV2Context, long try { MessageTable smsDatabase = SignalDatabase.messages(); RecipientId sender = RecipientId.from(editor.get()); - IncomingMessage groupMessage = IncomingMessage.groupUpdate(sender, timestamp, groupId, decryptedGroupV2Context); + IncomingMessage groupMessage = IncomingMessage.groupUpdate(sender, timestamp, groupId, decryptedGroupV2Context, serverGuid); Optional insertResult = smsDatabase.insertMessageInbox(groupMessage); if (insertResult.isPresent()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java index 843c4c1d6c..5bc9c6f3c0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AttachmentCompressionJob.java @@ -258,7 +258,7 @@ private void compress(@NonNull AttachmentTable attachmentDatabase, } if (FeatureFlags.useStreamingVideoMuxer()) { - StreamingTranscoder transcoder = new StreamingTranscoder(dataSource, options, constraints.getCompressedVideoMaxSize(context)); + StreamingTranscoder transcoder = new StreamingTranscoder(dataSource, options, constraints.getCompressedVideoMaxSize(context), FeatureFlags.allowAudioRemuxing()); if (transcoder.isTranscodeRequired()) { Log.i(TAG, "Compressing with streaming muxer"); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java index 42ab61358f..6eb15f6804 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/FcmRefreshJob.java @@ -126,7 +126,7 @@ private void notifyFcmFailure() { builder.setSmallIcon(R.drawable.ic_notification); builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), - R.drawable.ic_action_warning_red)); + R.drawable.symbol_error_triangle_fill_32)); builder.setContentTitle(context.getString(R.string.GcmRefreshJob_Permanent_Signal_communication_failure)); builder.setContentText(context.getString(R.string.GcmRefreshJob_Signal_was_unable_to_register_with_Google_Play_Services)); builder.setTicker(context.getString(R.string.GcmRefreshJob_Permanent_Signal_communication_failure)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactSyncJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactSyncJob.kt index eae7ff23bd..59fbd5c3dd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactSyncJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactSyncJob.kt @@ -76,7 +76,11 @@ class MultiDeviceContactSyncJob(parameters: Parameters, private val attachmentPo var contact: DeviceContact? = deviceContacts.read() while (contact != null) { - val recipient = Recipient.externalPush(SignalServiceAddress(contact.address.serviceId, contact.address.number.orElse(null))) + val recipient = if (contact.aci.isPresent) { + Recipient.externalPush(SignalServiceAddress(contact.aci.get(), contact.e164.orElse(null))) + } else { + Recipient.external(context, contact.e164.get()) + } if (recipient.isSelf) { contact = deviceContacts.read() diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java index 90ada93c0c..721c06a87a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceContactUpdateJob.java @@ -151,12 +151,18 @@ private void generateSingleContactUpdate(@NonNull RecipientId recipientId) return; } + if (!recipient.hasE164() && !recipient.hasAci()) { + Log.w(TAG, recipientId + " has no valid identifier!"); + return; + } + Optional identityRecord = ApplicationDependencies.getProtocolStore().aci().identities().getIdentityRecord(recipient.getId()); Optional verifiedMessage = getVerifiedMessage(recipient, identityRecord); Map inboxPositions = SignalDatabase.threads().getInboxPositions(); Set archived = SignalDatabase.threads().getArchivedRecipients(); - out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, recipient), + out.write(new DeviceContact(recipient.getAci(), + recipient.getE164(), Optional.ofNullable(recipient.isGroup() || recipient.isSystemContact() ? recipient.getDisplayName(context) : null), getSystemAvatar(recipient.getContactUri()), Optional.of(ChatColorsMapper.getMaterialColor(recipient.getChatColors()).serialize()), @@ -222,7 +228,8 @@ private void generateFullContactUpdate() Optional expireTimer = recipient.getExpiresInSeconds() > 0 ? Optional.of(recipient.getExpiresInSeconds()) : Optional.empty(); Optional inboxPosition = Optional.ofNullable(inboxPositions.get(recipient.getId())); - out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, recipient), + out.write(new DeviceContact(recipient.getAci(), + recipient.getE164(), name, getSystemAvatar(recipient.getContactUri()), Optional.of(ChatColorsMapper.getMaterialColor(recipient.getChatColors()).serialize()), @@ -239,7 +246,8 @@ private void generateFullContactUpdate() byte[] profileKey = self.getProfileKey(); if (profileKey != null) { - out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, self), + out.write(new DeviceContact(Optional.of(SignalStore.account().getAci()), + Optional.of(SignalStore.account().getE164()), Optional.empty(), Optional.empty(), Optional.of(ChatColorsMapper.getMaterialColor(self.getChatColors()).serialize()), diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceMessageRequestResponseJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceMessageRequestResponseJob.java index f2fcd40b4f..eb6a1dd5c1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceMessageRequestResponseJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceMessageRequestResponseJob.java @@ -54,7 +54,11 @@ public class MultiDeviceMessageRequestResponseJob extends BaseJob { } public static @NonNull MultiDeviceMessageRequestResponseJob forBlockAndReportSpam(@NonNull RecipientId threadRecipient) { - return new MultiDeviceMessageRequestResponseJob(threadRecipient, Type.BLOCK); + return new MultiDeviceMessageRequestResponseJob(threadRecipient, Type.BLOCK_AND_SPAM); + } + + public static @NonNull MultiDeviceMessageRequestResponseJob forReportSpam(@NonNull RecipientId threadRecipient) { + return new MultiDeviceMessageRequestResponseJob(threadRecipient, Type.SPAM); } private MultiDeviceMessageRequestResponseJob(@NonNull RecipientId threadRecipient, @NonNull Type type) { @@ -135,6 +139,10 @@ private static MessageRequestResponseMessage.Type localToRemoteType(@NonNull Typ return MessageRequestResponseMessage.Type.BLOCK; case BLOCK_AND_DELETE: return MessageRequestResponseMessage.Type.BLOCK_AND_DELETE; + case SPAM: + return MessageRequestResponseMessage.Type.SPAM; + case BLOCK_AND_SPAM: + return MessageRequestResponseMessage.Type.BLOCK_AND_SPAM; default: return MessageRequestResponseMessage.Type.UNKNOWN; } @@ -151,7 +159,7 @@ public void onFailure() { } private enum Type { - UNKNOWN(0), ACCEPT(1), DELETE(2), BLOCK(3), BLOCK_AND_DELETE(4); + UNKNOWN(0), ACCEPT(1), DELETE(2), BLOCK(3), BLOCK_AND_DELETE(4), SPAM(5), BLOCK_AND_SPAM(6); private final int value; diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java index 20fee51b76..5b3082b05a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/MultiDeviceProfileKeyUpdateJob.java @@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.net.NotPushRegisteredException; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientUtil; @@ -76,7 +77,8 @@ public void onRun() throws IOException, UntrustedIdentityException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DeviceContactsOutputStream out = new DeviceContactsOutputStream(baos); - out.write(new DeviceContact(RecipientUtil.toSignalServiceAddress(context, Recipient.self()), + out.write(new DeviceContact(Optional.ofNullable(SignalStore.account().getAci()), + Optional.ofNullable(SignalStore.account().getE164()), Optional.empty(), Optional.empty(), Optional.empty(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReportSpamJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReportSpamJob.java index 0c6b059507..53069b4f9b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/ReportSpamJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/ReportSpamJob.java @@ -20,6 +20,7 @@ import org.whispersystems.signalservice.api.push.exceptions.ServerRejectedException; import java.io.IOException; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.concurrent.TimeUnit; @@ -72,9 +73,28 @@ public void onRun() throws IOException { return; } - int count = 0; - List reportSpamData = SignalDatabase.messages().getReportSpamMessageServerData(threadId, timestamp, MAX_MESSAGE_COUNT); - SignalServiceAccountManager signalServiceAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); + Recipient threadRecipient = SignalDatabase.threads().getRecipientForThreadId(threadId); + if (threadRecipient == null) { + Log.w(TAG, "No recipient for thread"); + return; + } + + List reportSpamData; + + if (threadRecipient.isGroup()) { + Recipient inviter = SignalDatabase.groups().getGroupInviter(threadRecipient.requireGroupId()); + if (inviter == null) { + Log.w(TAG, "Unable to determine inviter to report"); + return; + } + + reportSpamData = SignalDatabase.messages().getGroupReportSpamMessageServerData(threadId, inviter.getId(), timestamp, MAX_MESSAGE_COUNT); + } else { + reportSpamData = SignalDatabase.messages().getReportSpamMessageServerData(threadId, timestamp, MAX_MESSAGE_COUNT); + } + + int count = 0; + SignalServiceAccountManager signalServiceAccountManager = ApplicationDependencies.getSignalServiceAccountManager(); for (ReportSpamData data : reportSpamData) { RecipientId recipientId = data.getRecipientId(); @@ -88,7 +108,7 @@ public void onRun() throws IOException { if (reportingTokenBytes != null) { reportingTokenEncoded = Base64.encodeWithPadding(reportingTokenBytes); } - + signalServiceAccountManager.reportSpam(serviceId.get(), data.getServerGuid(), reportingTokenEncoded); count++; } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.kt index 698b3039aa..3d4b83d68d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RetrieveProfileJob.kt @@ -159,9 +159,15 @@ class RetrieveProfileJob private constructor(parameters: Parameters, private val SignalDatabase.recipients.markProfilesFetched(successIds, System.currentTimeMillis()) stopwatch.split("mark-fetched") - if (operationState.unregistered.isNotEmpty() || newlyRegisteredIds.isNotEmpty()) { - Log.i(TAG, "Marking " + newlyRegisteredIds.size + " users as registered and " + operationState.unregistered.size + " users as unregistered.") - SignalDatabase.recipients.bulkUpdatedRegisteredStatus(newlyRegisteredIds, operationState.unregistered) + if (newlyRegisteredIds.isNotEmpty()) { + Log.i(TAG, "Marking " + newlyRegisteredIds.size + " users as registered.") + SignalDatabase.recipients.bulkUpdatedRegisteredStatus(newlyRegisteredIds, emptySet()) + } + if (operationState.unregistered.isNotEmpty()) { + Log.i(TAG, "Marking " + operationState.unregistered.size + " users as unregistered.") + for (recipientId in operationState.unregistered) { + SignalDatabase.recipients.markUnregistered(recipientId) + } } stopwatch.split("registered-update") diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt index 711d008efe..6acba01de6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardPagerViewModel.kt @@ -7,6 +7,7 @@ import org.signal.core.util.ThreadUtil import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.stickers.StickerSearchRepository import org.thoughtcrime.securesms.util.DefaultValueLiveData +import org.thoughtcrime.securesms.util.FeatureFlags class KeyboardPagerViewModel : ViewModel() { @@ -18,6 +19,11 @@ class KeyboardPagerViewModel : ViewModel() { if (SignalStore.settings().isPreferSystemEmoji) { startingPages.remove(KeyboardPage.EMOJI) } + + if (!FeatureFlags.gifSearchAvailable()) { + startingPages.remove(KeyboardPage.GIF) + } + pages = DefaultValueLiveData(startingPages) page = DefaultValueLiveData(startingPages.first()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardUtil.kt index 97eb0db718..4f2d03e3e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/KeyboardUtil.kt @@ -9,9 +9,9 @@ import android.graphics.Bitmap import android.graphics.Color import android.net.Uri import androidx.annotation.WorkerThread +import com.bumptech.glide.RequestManager import com.bumptech.glide.load.engine.DiskCacheStrategy import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideRequests import java.util.concurrent.ExecutionException import java.util.concurrent.TimeUnit import java.util.concurrent.TimeoutException @@ -19,9 +19,9 @@ import java.util.concurrent.TimeoutException object KeyboardUtil { @WorkerThread - fun getImageDetails(glideRequests: GlideRequests, uri: Uri): ImageDetails? { + fun getImageDetails(requestManager: RequestManager, uri: Uri): ImageDetails? { return try { - val bitmap: Bitmap = glideRequests.asBitmap() + val bitmap: Bitmap = requestManager.asBitmap() .load(DecryptableStreamUriLoader.DecryptableUri(uri)) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) 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 364a359833..40f96a61f9 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 @@ -4,19 +4,19 @@ import android.content.Context import android.view.View import android.widget.ImageView import android.widget.TextView +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.thoughtcrime.securesms.glide.cache.ApngOptions import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder class KeyboardStickerListAdapter( - private val glideRequests: GlideRequests, + private val requestManager: RequestManager, private val eventListener: EventListener?, private val allowApngAnimation: Boolean ) : MappingAdapter() { @@ -44,7 +44,7 @@ class KeyboardStickerListAdapter( private val image: ImageView = findViewById(R.id.sticker_keyboard_page_image) override fun bind(model: Sticker) { - glideRequests.load(model.uri) + requestManager.load(model.uri) .set(ApngOptions.ANIMATE, allowApngAnimation) .transition(DrawableTransitionOptions.withCrossFade()) .into(image) diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerPackListAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerPackListAdapter.kt index 301f0a81dc..043943f941 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerPackListAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/KeyboardStickerPackListAdapter.kt @@ -4,16 +4,16 @@ import android.content.res.ColorStateList import android.view.View import android.widget.ImageView import androidx.core.widget.ImageViewCompat +import com.bumptech.glide.RequestManager import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.glide.cache.ApngOptions import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder -class KeyboardStickerPackListAdapter(private val glideRequests: GlideRequests, private val allowApngAnimation: Boolean, private val onTabSelected: (StickerPack) -> Unit) : MappingAdapter() { +class KeyboardStickerPackListAdapter(private val requestManager: RequestManager, private val allowApngAnimation: Boolean, private val onTabSelected: (StickerPack) -> Unit) : MappingAdapter() { init { registerFactory(StickerPack::class.java, LayoutFactory(::StickerPackViewHolder, R.layout.keyboard_pager_category_icon)) @@ -47,7 +47,7 @@ class KeyboardStickerPackListAdapter(private val glideRequests: GlideRequests, p if (model.loadImage) { ImageViewCompat.setImageTintList(icon, null) icon.alpha = if (model.selected) 1f else 0.5f - glideRequests.load(model.uri) + requestManager.load(model.uri) .set(ApngOptions.ANIMATE, allowApngAnimation) .into(icon) } else { diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardPageFragment.kt index a4223803f8..bb39c6655a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerKeyboardPageFragment.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearSmoothScroller import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.SmoothScroller +import com.bumptech.glide.Glide import com.google.android.material.appbar.AppBarLayout import org.signal.libsignal.protocol.util.Pair import org.thoughtcrime.securesms.LoggingFragment @@ -16,7 +17,6 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.database.DatabaseObserver import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.stickers.StickerEventListener import org.thoughtcrime.securesms.stickers.StickerRolloverTouchListener import org.thoughtcrime.securesms.stickers.StickerRolloverTouchListener.RolloverStickerRetriever @@ -57,8 +57,8 @@ open class StickerKeyboardPageFragment : override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - val glideRequests = GlideApp.with(this) - stickerListAdapter = KeyboardStickerListAdapter(glideRequests, this, DeviceProperties.shouldAllowApngStickerAnimation(requireContext())) + val requestManager = Glide.with(this) + stickerListAdapter = KeyboardStickerListAdapter(requestManager, this, DeviceProperties.shouldAllowApngStickerAnimation(requireContext())) layoutManager = GridLayoutManager(requireContext(), 2).apply { spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { override fun getSpanSize(position: Int): Int { @@ -70,7 +70,7 @@ open class StickerKeyboardPageFragment : } } } - listTouchListener = StickerRolloverTouchListener(requireContext(), glideRequests, this, this) + listTouchListener = StickerRolloverTouchListener(requireContext(), requestManager, this, this) stickerList = view.findViewById(R.id.sticker_keyboard_list) stickerList.layoutManager = layoutManager @@ -81,7 +81,7 @@ open class StickerKeyboardPageFragment : stickerPacksRecycler = view.findViewById(R.id.sticker_packs_recycler) - stickerPacksAdapter = KeyboardStickerPackListAdapter(glideRequests, DeviceProperties.shouldAllowApngStickerAnimation(requireContext()), this::onTabSelected) + stickerPacksAdapter = KeyboardStickerPackListAdapter(requestManager, DeviceProperties.shouldAllowApngStickerAnimation(requireContext()), this::onTabSelected) stickerPacksRecycler.adapter = stickerPacksAdapter appBarLayout = view.findViewById(R.id.sticker_keyboard_search_appbar) diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchDialogFragment.kt index d58e600f72..1707108423 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/keyboard/sticker/StickerSearchDialogFragment.kt @@ -10,9 +10,9 @@ import androidx.fragment.app.FragmentManager import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.keyboard.emoji.KeyboardPageSearchView -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.stickers.StickerEventListener import org.thoughtcrime.securesms.util.DeviceProperties import org.thoughtcrime.securesms.util.InsetItemDecoration @@ -47,7 +47,7 @@ class StickerSearchDialogFragment : DialogFragment(), KeyboardStickerListAdapter list = view.findViewById(R.id.sticker_search_list) noResults = view.findViewById(R.id.sticker_search_no_results) - adapter = KeyboardStickerListAdapter(GlideApp.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(requireContext())) + adapter = KeyboardStickerListAdapter(Glide.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(requireContext())) layoutManager = GridLayoutManager(requireContext(), 2) list.layoutManager = layoutManager diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java index 080fa1cdee..e5f7c607ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PinValues.java @@ -98,7 +98,19 @@ public boolean arePinRemindersEnabled() { } public @NonNull PinKeyboardType getKeyboardType() { - return PinKeyboardType.fromCode(getStore().getString(KEYBOARD_TYPE, null)); + String pin = SignalStore.svr().getPin(); + + if (pin == null) { + return PinKeyboardType.fromCode(getStore().getString(KEYBOARD_TYPE, null)); + } + + for (char c : pin.toCharArray()) { + if (!Character.isDigit(c)) { + return PinKeyboardType.ALPHA_NUMERIC; + } + } + + return PinKeyboardType.NUMERIC; } public void setNextReminderIntervalToAtMost(long maxInterval) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java index cfb9028c44..2453ee32b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/linkpreview/LinkPreviewRepository.java @@ -9,6 +9,7 @@ import androidx.annotation.Nullable; import androidx.core.util.Consumer; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.signal.core.util.Hex; @@ -35,7 +36,6 @@ import org.thoughtcrime.securesms.jobs.AvatarGroupsV2DownloadJob; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil.OpenGraph; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.PushMediaConstraints; import org.thoughtcrime.securesms.net.CallRequestController; import org.thoughtcrime.securesms.net.CompositeRequestController; @@ -283,7 +283,7 @@ private static RequestController fetchStickerPackLinkPreview(@NonNull Context co Optional cover = OptionalUtil.or(manifest.getCover(), firstSticker); if (cover.isPresent()) { - Bitmap bitmap = GlideApp.with(context).asBitmap() + Bitmap bitmap = Glide.with(context).asBitmap() .load(new StickerRemoteUri(packIdString, packKeyString, cover.get().getId())) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/maps/PlacePickerActivity.java b/app/src/main/java/org/thoughtcrime/securesms/maps/PlacePickerActivity.java index 7c9b169892..8546e6316c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/maps/PlacePickerActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/maps/PlacePickerActivity.java @@ -12,6 +12,7 @@ import android.location.Geocoder; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.view.View; import android.view.animation.OvershootInterpolator; @@ -31,6 +32,7 @@ import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MapStyleOptions; +import org.signal.core.util.concurrent.ListenableFuture; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.BuildConfig; import org.thoughtcrime.securesms.R; @@ -41,7 +43,6 @@ import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.MediaUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.io.IOException; @@ -244,7 +245,8 @@ public void onFailure(ExecutionException e) { } private void enableMyLocationButtonIfHaveThePermission(GoogleMap googleMap) { - if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || + checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { googleMap.setMyLocationEnabled(true); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java index d3bb27fde0..49f65da805 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java @@ -32,6 +32,7 @@ import com.annimon.stream.Collectors; import com.annimon.stream.Stream; +import com.bumptech.glide.RequestManager; import com.codewaves.stickyheadergrid.StickyHeaderGridAdapter; import org.signal.libsignal.protocol.util.Pair; @@ -45,7 +46,6 @@ import org.thoughtcrime.securesms.database.loaders.GroupedThreadMediaLoader.GroupedThreadMedia; import org.thoughtcrime.securesms.mediapreview.MediaPreviewCache; import org.thoughtcrime.securesms.mms.AudioSlide; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.Slide; import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; @@ -70,7 +70,7 @@ final class MediaGalleryAllAdapter extends StickyHeaderGridAdapter { private final Context context; private final boolean showThread; - private final GlideRequests glideRequests; + private final RequestManager requestManager; private final ItemClickListener itemClickListener; private final Map selected = new HashMap<>(); private final AudioItemListener audioItemListener; @@ -102,7 +102,7 @@ private static class HeaderHolder extends HeaderViewHolder { } MediaGalleryAllAdapter(@NonNull Context context, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, GroupedThreadMedia media, ItemClickListener clickListener, @NonNull AudioItemListener audioItemListener, @@ -110,7 +110,7 @@ private static class HeaderHolder extends HeaderViewHolder { boolean showThread) { this.context = context; - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.media = media; this.itemClickListener = clickListener; this.audioItemListener = audioItemListener; @@ -345,7 +345,7 @@ public void bind(@NonNull Context context, @NonNull MediaTable.MediaRecord media imageFileSize.setVisibility(View.GONE); } - thumbnailView.setImageResource(glideRequests, slide, false, false); + thumbnailView.setImageResource(requestManager, slide, false, false); thumbnailView.setOnClickListener(view -> { MediaPreviewCache.INSTANCE.setDrawable(thumbnailView.getImageDrawable()); itemClickListener.onMediaClicked(thumbnailView, mediaRecord); @@ -366,13 +366,13 @@ protected void updateSelectedView() { @Override void rebind() { - thumbnailView.setImageResource(glideRequests, slide, false, false); + thumbnailView.setImageResource(requestManager, slide, false, false); super.rebind(); } @Override void unbind() { - thumbnailView.clear(glideRequests); + thumbnailView.clear(requestManager); super.unbind(); } @@ -591,7 +591,7 @@ private class GalleryDetailViewHolder extends DetailViewHolder { public void bind(@NonNull Context context, @NonNull MediaTable.MediaRecord mediaRecord, @NonNull Slide slide) { super.bind(context, mediaRecord, slide); this.slide = slide; - thumbnailView.setImageResource(glideRequests, slide, false, false); + thumbnailView.setImageResource(requestManager, slide, false, false); thumbnailView.setOnClickListener(view -> itemClickListener.onMediaClicked(thumbnailView, mediaRecord)); thumbnailView.setOnLongClickListener(view -> onLongClick()); } @@ -611,13 +611,13 @@ protected String getFileTypeDescription(@NonNull Context context, @NonNull Slide @Override void rebind() { - thumbnailView.setImageResource(glideRequests, slide, false, false); + thumbnailView.setImageResource(requestManager, slide, false, false); super.rebind(); } @Override void unbind() { - thumbnailView.clear(glideRequests); + thumbnailView.clear(requestManager); super.unbind(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java index 9ef52f7d5b..1dec181fba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java @@ -26,6 +26,7 @@ import androidx.loader.content.Loader; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager; import org.signal.core.util.DimensionUnit; @@ -41,7 +42,6 @@ import org.thoughtcrime.securesms.database.loaders.MediaLoader; import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory; import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Activity; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.util.BottomOffsetDecoration; import org.thoughtcrime.securesms.util.MediaUtil; @@ -125,7 +125,7 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, this.gridManager = new StickyHeaderGridLayoutManager(spans); this.adapter = new MediaGalleryAllAdapter(context, - GlideApp.with(this), + Glide.with(this), new GroupedThreadMediaLoader.EmptyGroupedThreadMedia(), this, this, diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/ImageMediaPreviewFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/ImageMediaPreviewFragment.java index 5a5c1087c6..04d7e94398 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/ImageMediaPreviewFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/ImageMediaPreviewFragment.java @@ -9,10 +9,11 @@ import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.ZoomingImageView; -import org.thoughtcrime.securesms.mms.GlideApp; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.signal.core.util.concurrent.LifecycleDisposable; import org.thoughtcrime.securesms.util.MediaUtil; @@ -33,7 +34,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.media_preview_image_fragment, container, false); - GlideRequests glideRequests = GlideApp.with(requireActivity()); + RequestManager requestManager = Glide.with(requireActivity()); Bundle arguments = requireArguments(); Uri uri = arguments.getParcelable(DATA_URI); String contentType = arguments.getString(DATA_CONTENT_TYPE); @@ -49,7 +50,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, } //noinspection ConstantConditions - zoomingImageView.setImageUri(glideRequests, uri, contentType, () -> events.onMediaReady()); + zoomingImageView.setImageUri(requestManager, uri, contentType, () -> events.onMediaReady()); zoomingImageView.setOnClickListener(v -> events.singleTapOnMedia()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt index 80130dda44..7399c9d8b2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/MediaPreviewV2Fragment.kt @@ -32,6 +32,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.MarginPageTransformer import androidx.viewpager2.widget.ViewPager2.OFFSCREEN_PAGE_LIMIT_DEFAULT import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback +import com.bumptech.glide.Glide import com.google.android.material.appbar.MaterialToolbar import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar @@ -58,7 +59,6 @@ import org.thoughtcrime.securesms.mediapreview.mediarail.MediaRailAdapter import org.thoughtcrime.securesms.mediapreview.mediarail.MediaRailAdapter.ImageLoadingListener import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.v2.MediaSelectionActivity -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.PartAuthority import org.thoughtcrime.securesms.permissions.Permissions import org.thoughtcrime.securesms.recipients.Recipient @@ -187,7 +187,7 @@ class MediaPreviewV2Fragment : LoggingFragment(R.layout.fragment_media_preview_v layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) addItemDecoration(CenterDecoration(0)) albumRailAdapter = MediaRailAdapter( - GlideApp.with(this@MediaPreviewV2Fragment), + Glide.with(this@MediaPreviewV2Fragment), { media -> jumpViewPagerToMedia(media) }, object : ImageLoadingListener() { override fun onAllRequestsFinished() { @@ -586,7 +586,7 @@ class MediaPreviewV2Fragment : LoggingFragment(R.layout.fragment_media_preview_v val attachment: DatabaseAttachment = mediaItem.attachment ?: return MaterialAlertDialogBuilder(requireContext()).apply { - setIcon(R.drawable.ic_warning) + setIcon(R.drawable.symbol_error_triangle_fill_24) setTitle(R.string.MediaPreviewActivity_media_delete_confirmation_title) setMessage(R.string.MediaPreviewActivity_media_delete_confirmation_message) setCancelable(true) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt index 62647b9d49..15da7d448d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/mediarail/MediaRailAdapter.kt @@ -4,13 +4,13 @@ import android.graphics.drawable.Drawable import android.view.View import android.widget.ImageView import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.RequestManager import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.target.Target import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ThumbnailView import org.thoughtcrime.securesms.mediasend.Media -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel import org.thoughtcrime.securesms.util.adapter.mapping.MappingViewHolder @@ -21,7 +21,7 @@ import java.util.concurrent.atomic.AtomicInteger * This is the RecyclerView.Adapter for the row of thumbnails present in the media viewer screen. */ class MediaRailAdapter( - private val glideRequests: GlideRequests, + private val requestManager: RequestManager, private val onRailItemSelected: (Media) -> Unit, private val imageLoadingListener: ImageLoadingListener ) : MappingAdapter() { @@ -77,7 +77,7 @@ class MediaRailAdapter( } override fun bind(model: MediaRailItem) { - image.setImageResource(glideRequests, model.media.uri, 0, 0, false, imageLoadingListener) + image.setImageResource(requestManager, model.media.uri, 0, 0, false, imageLoadingListener) image.setOnClickListener { onRailItemSelected(model.media) } captionIndicator.visibility = if (model.media.caption.isPresent) View.VISIBLE else View.GONE diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java index b368a24739..cc00792374 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/Camera1Fragment.java @@ -49,7 +49,6 @@ import org.thoughtcrime.securesms.mediasend.v2.MediaAnimations; import org.thoughtcrime.securesms.mediasend.v2.MediaCountIndicatorButton; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.thoughtcrime.securesms.util.ViewUtil; @@ -396,7 +395,7 @@ private void onCaptureClicked() { Transformation transformation = frontFacing ? new MultiTransformation<>(new CenterCrop(), new FlipTransformation()) : new CenterCrop(); - GlideApp.with(this) + Glide.with(this) .asBitmap() .load(jpegData) .transform(transformation) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactAdapter.java index 7f78f0dfd3..0c58f76a2f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactAdapter.java @@ -11,10 +11,11 @@ import androidx.annotation.StringRes; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.AvatarImageView; import org.thoughtcrime.securesms.components.FromTextView; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.adapter.SectionedRecyclerViewAdapter; import org.thoughtcrime.securesms.util.adapter.StableIdGenerator; @@ -35,7 +36,7 @@ class CameraContactAdapter extends SectionedRecyclerViewAdapter selected; private final CameraContactListener cameraContactListener; @@ -50,8 +51,8 @@ class CameraContactAdapter extends SectionedRecyclerViewAdapter(); this.cameraContactListener = listener; } @@ -114,7 +115,7 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int global @Override protected void bindViewHolder(@NonNull RecyclerView.ViewHolder holder, @NonNull ContactSection section, int localPosition) { - section.bind(holder, localPosition, selected, glideRequests, cameraContactListener); + section.bind(holder, localPosition, selected, requestManager, cameraContactListener); } @Override @@ -179,14 +180,14 @@ public long getItemId(@NonNull StableIdGenerator idGenerator, int global void bind(@NonNull RecyclerView.ViewHolder viewHolder, int localPosition, @NonNull Set selected, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull CameraContactListener cameraContactListener) { if (localPosition == 0) { ((HeaderViewHolder) viewHolder).bind(titleResId); } else { Recipient recipient = recipients.get(localPosition - 1); - ((ContactViewHolder) viewHolder).bind(recipient, selected.contains(recipient), glideRequests, cameraContactListener); + ((ContactViewHolder) viewHolder).bind(recipient, selected.contains(recipient), requestManager, cameraContactListener); } } } @@ -221,10 +222,10 @@ private static class ContactViewHolder extends RecyclerView.ViewHolder { void bind(@NonNull Recipient recipient, boolean selected, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull CameraContactListener listener) { - avatar.setAvatar(glideRequests, recipient, false); + avatar.setAvatar(requestManager, recipient, false); name.setText(recipient); itemView.setOnClickListener(v -> listener.onContactClicked(recipient)); checkbox.setChecked(selected); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactSelectionFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactSelectionFragment.java index dc9d8d6ffb..9db87d8860 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactSelectionFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraContactSelectionFragment.java @@ -22,10 +22,11 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.InviteActivity; import org.thoughtcrime.securesms.LoggingFragment; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.util.DynamicTheme; import org.thoughtcrime.securesms.util.ThemeUtil; @@ -90,7 +91,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat this.selectionFooterGroup = view.findViewById(R.id.camera_contacts_footer_group); this.cameraContactsEmpty = view.findViewById(R.id.camera_contacts_empty); this.inviteButton = view.findViewById(R.id.camera_contacts_invite_button); - this.contactAdapter = new CameraContactAdapter(GlideApp.with(this), this); + this.contactAdapter = new CameraContactAdapter(Glide.with(this), this); this.selectionAdapter = new CameraContactSelectionAdapter(); contactList.setLayoutManager(new LinearLayoutManager(requireContext())); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java index 9f6663b97c..77d50bbd1c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/CameraXVideoCaptureHelper.java @@ -31,6 +31,7 @@ import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.util.ContextUtil; import org.thoughtcrime.securesms.util.Debouncer; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.MemoryFileDescriptor; import org.thoughtcrime.securesms.video.VideoUtil; @@ -42,7 +43,7 @@ @RequiresApi(26) class CameraXVideoCaptureHelper implements CameraButtonView.VideoCaptureListener { - private static final String TAG = CameraXVideoCaptureHelper.class.getName(); + private static final String TAG = Log.tag(CameraXVideoCaptureHelper.class); private static final String VIDEO_DEBUG_LABEL = "video-capture"; private static final long VIDEO_SIZE = 10 * 1024 * 1024; @@ -74,7 +75,7 @@ public void accept(VideoRecordEvent videoRecordEvent) { } else { try { debouncer.clear(); - cameraController.setZoomRatio(Objects.requireNonNull(cameraController.getZoomState().getValue()).getMinZoomRatio()); + cameraController.setZoomRatio(getDefaultVideoZoomRatio()); memoryFileDescriptor.seek(0); callback.onVideoSaved(memoryFileDescriptor.getFileDescriptor()); } catch (IOException e) { @@ -142,7 +143,7 @@ private void displayAudioRecordingPermissionsDialog() { @SuppressLint("RestrictedApi") private void beginCameraRecording() { cameraXModePolicy.setToVideo(cameraController); - this.cameraController.setZoomRatio(Objects.requireNonNull(this.cameraController.getZoomState().getValue()).getMinZoomRatio()); + this.cameraController.setZoomRatio(getDefaultVideoZoomRatio()); callback.onVideoRecordStarted(); shrinkCaptureArea(); @@ -232,8 +233,8 @@ public void onVideoCaptureComplete() { @Override public void onZoomIncremented(float increment) { ZoomState zoomState = Objects.requireNonNull(cameraController.getZoomState().getValue()); - float range = zoomState.getMaxZoomRatio() - zoomState.getMinZoomRatio(); - cameraController.setZoomRatio((range * increment) + zoomState.getMinZoomRatio()); + float range = zoomState.getMaxZoomRatio() - getDefaultVideoZoomRatio(); + cameraController.setZoomRatio((range * increment) + getDefaultVideoZoomRatio()); } @Override @@ -254,6 +255,14 @@ static MemoryFileDescriptor createFileDescriptor(@NonNull Context context) throw ); } + public float getDefaultVideoZoomRatio() { + if (FeatureFlags.startVideoRecordAt1x()) { + return 1f; + } else { + return Objects.requireNonNull(cameraController.getZoomState().getValue()).getMinZoomRatio(); + } + } + interface Callback { void onVideoRecordStarted(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java index ccfe025c9e..4addaba88b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/MediaSendGifFragment.java @@ -11,9 +11,10 @@ import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideApp; public class MediaSendGifFragment extends Fragment implements MediaSendPageFragment { @@ -41,7 +42,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat super.onViewCreated(view, savedInstanceState); uri = getArguments().getParcelable(KEY_URI); - GlideApp.with(this).load(new DecryptableStreamUriLoader.DecryptableUri(uri)).fitCenter().into((ImageView) view); + Glide.with(this).load(new DecryptableStreamUriLoader.DecryptableUri(uri)).fitCenter().into((ImageView) view); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.java index 9b9aed207d..045f1ecc73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/VideoEditorFragment.java @@ -127,7 +127,7 @@ public void onError() { player.clip(data.startTimeUs, data.endTimeUs, autoplay); } try { - hud.setVideoSource(slide, new VideoBitRateCalculator(maxOutput), maxSend); + hud.setVideoSource(slide, new VideoBitRateCalculator(maxOutput), maxOutput); hud.setVisibility(View.VISIBLE); startPositionUpdates(); } catch (IOException e) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt index ccf2d576ef..849fdd11d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaGallerySelectableItem.kt @@ -6,6 +6,7 @@ import android.view.View import android.widget.ImageView import android.widget.TextView import androidx.core.view.setPadding +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener @@ -17,7 +18,6 @@ import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.mediasend.Media import org.thoughtcrime.securesms.mediasend.MediaFolder import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.MediaUtil import org.thoughtcrime.securesms.util.adapter.mapping.LayoutFactory import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -65,7 +65,7 @@ object MediaGallerySelectableItem { class FolderViewHolder(itemView: View, private val onMediaFolderClicked: OnMediaFolderClicked) : BaseViewHolder(itemView) { override fun bind(model: FolderModel) { - GlideApp.with(imageView) + Glide.with(imageView) .load(DecryptableStreamUriLoader.DecryptableUri(model.mediaFolder.thumbnailUri)) .into(imageView) @@ -120,7 +120,7 @@ object MediaGallerySelectableItem { updateImageView(if (model.isSelected) 1f else 0f) } - GlideApp.with(imageView) + Glide.with(imageView) .load(DecryptableStreamUriLoader.DecryptableUri(model.media.uri)) .addListener(ErrorLoggingRequestListener(FILE_VIEW_HOLDER_TAG)) .into(imageView) diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java index 1baa1be3ac..8f4ba89e79 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/BasicMegaphoneView.java @@ -60,9 +60,9 @@ public void present(@NonNull Megaphone megaphone, @NonNull MegaphoneActionContro if (megaphone.getImageRes() != 0) { image.setVisibility(VISIBLE); image.setImageResource(megaphone.getImageRes()); - } else if (megaphone.getImageRequest() != null) { + } else if (megaphone.getImageRequestBuilder() != null) { image.setVisibility(VISIBLE); - megaphone.getImageRequest().into(image); + megaphone.getImageRequestBuilder().into(image); } else if (megaphone.getLottieRes() != 0) { image.setVisibility(VISIBLE); image.setAnimation(megaphone.getLottieRes()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java index f4f36bd404..ee221798e8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/ClientDeprecatedActivity.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.megaphone; +import android.annotation.SuppressLint; import android.os.Bundle; import com.google.android.material.dialog.MaterialAlertDialogBuilder; @@ -38,6 +39,7 @@ protected void onResume() { theme.onResume(this); } + @SuppressLint("MissingSuperCall") @Override public void onBackPressed() { // Disabled diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java index 5ba3913005..ca50b7b097 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphone.java @@ -9,8 +9,9 @@ import androidx.annotation.RawRes; import androidx.annotation.StringRes; +import com.bumptech.glide.RequestBuilder; + import org.thoughtcrime.securesms.megaphone.Megaphones.Event; -import org.thoughtcrime.securesms.mms.GlideRequest; /** * For guidance on creating megaphones, see {@link Megaphones}. @@ -27,7 +28,7 @@ public class Megaphone { private final MegaphoneText bodyText; private final int imageRes; private final int lottieRes; - private final GlideRequest imageRequest; + private final RequestBuilder requestBuilder; private final MegaphoneText buttonText; private final EventListener buttonListener; private final EventListener snoozeListener; @@ -43,7 +44,7 @@ private Megaphone(@NonNull Builder builder) { this.bodyText = builder.bodyText; this.imageRes = builder.imageRes; this.lottieRes = builder.lottieRes; - this.imageRequest = builder.imageRequest; + this.requestBuilder = builder.requestBuilder; this.buttonText = builder.buttonText; this.buttonListener = builder.buttonListener; this.snoozeListener = builder.snoozeListener; @@ -80,8 +81,8 @@ public boolean canSnooze() { return imageRes; } - public @Nullable GlideRequest getImageRequest() { - return imageRequest; + public @Nullable RequestBuilder getImageRequestBuilder() { + return requestBuilder; } public @Nullable MegaphoneText getButtonText() { @@ -126,7 +127,7 @@ public static class Builder { private MegaphoneText bodyText; private int imageRes; private int lottieRes; - private GlideRequest imageRequest; + private RequestBuilder requestBuilder; private MegaphoneText buttonText; private EventListener buttonListener; private EventListener snoozeListener; @@ -181,8 +182,8 @@ public Builder(@NonNull Event event, @NonNull Style style) { return this; } - public @NonNull Builder setImageRequest(@Nullable GlideRequest imageRequest) { - this.imageRequest = imageRequest; + public @NonNull Builder setImageRequestBuilder(@Nullable RequestBuilder requestBuilder) { + this.requestBuilder = requestBuilder; return this; } 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 fa960ba3c5..5545c997bb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -11,6 +11,7 @@ import androidx.core.app.NotificationManagerCompat; import com.annimon.stream.Stream; +import com.bumptech.glide.Glide; import org.signal.core.util.MapUtil; import org.signal.core.util.SetUtil; @@ -29,7 +30,6 @@ import org.thoughtcrime.securesms.lock.SignalPinReminders; import org.thoughtcrime.securesms.lock.v2.CreateSvrPinActivity; import org.thoughtcrime.securesms.lock.v2.SvrMigrationActivity; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.notifications.NotificationChannels; import org.thoughtcrime.securesms.notifications.TurnOnNotificationsBottomSheet; import org.thoughtcrime.securesms.profiles.AvatarHelper; @@ -313,7 +313,7 @@ public void onReminderCompleted(@NonNull String pin, boolean includedFailure) { .setBody(record.getBody()); if (record.getImageUri() != null) { - builder.setImageRequest(GlideApp.with(context).asDrawable().load(record.getImageUri())); + builder.setImageRequestBuilder(Glide.with(context).asDrawable().load(record.getImageUri())); } if (record.hasPrimaryAction()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/PopupMegaphoneView.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/PopupMegaphoneView.java index cbcba6bb84..2dcb11dd61 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/PopupMegaphoneView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/PopupMegaphoneView.java @@ -55,9 +55,9 @@ public void present(@NonNull Megaphone megaphone, @NonNull MegaphoneActionContro this.megaphone = megaphone; this.megaphoneListener = megaphoneListener; - if (megaphone.getImageRequest() != null) { + if (megaphone.getImageRequestBuilder() != null) { image.setVisibility(VISIBLE); - megaphone.getImageRequest().into(image); + megaphone.getImageRequestBuilder().into(image); } else if (megaphone.getLottieRes() != 0) { image.setVisibility(VISIBLE); image.setAnimation(megaphone.getLottieRes()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsAdapter.java index 074eaf898d..4f9c781f45 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsAdapter.java @@ -10,24 +10,25 @@ import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.conversation.ConversationMessage; import org.thoughtcrime.securesms.conversation.colors.Colorizer; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.databinding.MessageDetailsViewEditHistoryBinding; -import org.thoughtcrime.securesms.mms.GlideRequests; final class MessageDetailsAdapter extends ListAdapter, RecyclerView.ViewHolder> { private final LifecycleOwner lifecycleOwner; - private final GlideRequests glideRequests; + private final RequestManager requestManager; private final Colorizer colorizer; private final Callbacks callbacks; - MessageDetailsAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull GlideRequests glideRequests, @NonNull Colorizer colorizer, @NonNull Callbacks callbacks) { + MessageDetailsAdapter(@NonNull LifecycleOwner lifecycleOwner, @NonNull RequestManager requestManager, @NonNull Colorizer colorizer, @NonNull Callbacks callbacks) { super(new MessageDetailsDiffer()); this.lifecycleOwner = lifecycleOwner; - this.glideRequests = glideRequests; + this.requestManager = requestManager; this.colorizer = colorizer; this.callbacks = callbacks; } @@ -36,7 +37,7 @@ final class MessageDetailsAdapter extends ListAdapter(), conversationMessage.getMessageRecord().getToRecipient(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java index a45ef67ebb..926a474dc9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/CalleeMustAcceptMessageRequestActivity.java @@ -14,12 +14,13 @@ import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.BaseActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.AvatarImageView; import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -70,7 +71,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { viewModel.getRecipient().observe(this, recipient -> { description.setText(getString(R.string.CalleeMustAcceptMessageRequestDialogFragment__s_will_get_a_message_request_from_you, recipient.getDisplayName(this))); - avatar.setAvatar(GlideApp.with(this), recipient, false); + avatar.setAvatar(Glide.with(this), recipient, false); }); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/GroupInfo.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/GroupInfo.java deleted file mode 100644 index 8e41dd5e61..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/GroupInfo.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.thoughtcrime.securesms.messagerequests; - -import androidx.annotation.NonNull; - -public final class GroupInfo { - public static final GroupInfo ZERO = new GroupInfo(0, 0, ""); - - private final int fullMemberCount; - private final int pendingMemberCount; - private final String description; - - public GroupInfo(int fullMemberCount, int pendingMemberCount, @NonNull String description) { - this.fullMemberCount = fullMemberCount; - this.pendingMemberCount = pendingMemberCount; - this.description = description; - } - - public int getFullMemberCount() { - return fullMemberCount; - } - - public int getPendingMemberCount() { - return pendingMemberCount; - } - - public @NonNull String getDescription() { - return description; - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/GroupInfo.kt b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/GroupInfo.kt new file mode 100644 index 0000000000..4f3d1c30d5 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/GroupInfo.kt @@ -0,0 +1,16 @@ +package org.thoughtcrime.securesms.messagerequests + +/** + * Group info needed to show message request state UX. + */ +class GroupInfo( + val fullMemberCount: Int = 0, + val pendingMemberCount: Int = 0, + val description: String = "", + val hasExistingContacts: Boolean = false +) { + companion object { + @JvmField + val ZERO = GroupInfo() + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java index ad7a91c6ef..55c1b6d82d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestRepository.java @@ -4,7 +4,6 @@ import androidx.annotation.NonNull; import androidx.annotation.WorkerThread; -import androidx.core.util.Consumer; import org.signal.core.util.Result; import org.signal.core.util.concurrent.SignalExecutors; @@ -24,12 +23,13 @@ import org.thoughtcrime.securesms.jobs.MultiDeviceMessageRequestResponseJob; import org.thoughtcrime.securesms.jobs.ReportSpamJob; import org.thoughtcrime.securesms.jobs.SendViewedReceiptJob; +import org.thoughtcrime.securesms.mms.MmsException; +import org.thoughtcrime.securesms.mms.OutgoingMessage; import org.thoughtcrime.securesms.notifications.MarkReadReceiver; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.sms.MessageSender; -import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.TextSecurePreferences; import org.whispersystems.signalservice.internal.push.exceptions.GroupPatchNotAcceptedException; @@ -37,7 +37,9 @@ import java.util.List; import java.util.Optional; import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import io.reactivex.rxjava3.core.Completable; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.schedulers.Schedulers; import kotlin.Unit; @@ -54,28 +56,6 @@ public MessageRequestRepository(@NonNull Context context) { this.executor = SignalExecutors.BOUNDED; } - public void getGroups(@NonNull RecipientId recipientId, @NonNull Consumer> onGroupsLoaded) { - executor.execute(() -> { - GroupTable groupDatabase = SignalDatabase.groups(); - onGroupsLoaded.accept(groupDatabase.getPushGroupNamesContainingMember(recipientId)); - }); - } - - public void getGroupInfo(@NonNull RecipientId recipientId, @NonNull Consumer onGroupInfoLoaded) { - executor.execute(() -> { - GroupTable groupDatabase = SignalDatabase.groups(); - Optional groupRecord = groupDatabase.getGroup(recipientId); - onGroupInfoLoaded.accept(groupRecord.map(record -> { - if (record.isV2Group()) { - DecryptedGroup decryptedGroup = record.requireV2GroupProperties().getDecryptedGroup(); - return new GroupInfo(decryptedGroup.members.size(), decryptedGroup.pendingMembers.size(), decryptedGroup.description); - } else { - return new GroupInfo(record.getMembers().size(), 0, ""); - } - }).orElse(GroupInfo.ZERO)); - }); - } - @WorkerThread public @NonNull MessageRequestRecipientInfo getRecipientInfo(@NonNull RecipientId recipientId, long threadId) { List sharedGroups = SignalDatabase.groups().getPushGroupNamesContainingMember(recipientId); @@ -83,11 +63,20 @@ public void getGroupInfo(@NonNull RecipientId recipientId, @NonNull Consumer recipients = Recipient.resolvedList(groupRecord.get().getMembers()); + for (Recipient recipient : recipients) { + if ((recipient.isProfileSharing() || recipient.hasGroupsInCommon()) && !recipient.isSelf()) { + groupHasExistingContacts = true; + break; + } + } + DecryptedGroup decryptedGroup = groupRecord.get().requireV2GroupProperties().getDecryptedGroup(); - groupInfo = new GroupInfo(decryptedGroup.members.size(), decryptedGroup.pendingMembers.size(), decryptedGroup.description); + groupInfo = new GroupInfo(decryptedGroup.members.size(), decryptedGroup.pendingMembers.size(), decryptedGroup.description, groupHasExistingContacts); } else { - groupInfo = new GroupInfo(groupRecord.get().getMembers().size(), 0, ""); + groupInfo = new GroupInfo(groupRecord.get().getMembers().size(), 0, "", false); } } @@ -104,10 +93,11 @@ public void getGroupInfo(@NonNull RecipientId recipientId, @NonNull Consumer 0; + } + @SuppressWarnings("unchecked") public @NonNull Single> acceptMessageRequest(@NonNull RecipientId recipientId, long threadId) { //noinspection CodeBlock2Expr @@ -172,7 +173,7 @@ public void acceptMessageRequest(@NonNull RecipientId recipientId, @NonNull Runnable onMessageRequestAccepted, @NonNull GroupChangeErrorCallback error) { - executor.execute(()-> { + executor.execute(() -> { Recipient recipient = Recipient.resolved(recipientId); if (recipient.isPushV2Group()) { try { @@ -182,6 +183,7 @@ public void acceptMessageRequest(@NonNull RecipientId recipientId, RecipientTable recipientTable = SignalDatabase.recipients(); recipientTable.setProfileSharing(recipientId, true); + insertMessageRequestAccept(recipient, threadId); onMessageRequestAccepted.run(); } catch (GroupChangeException | IOException e) { Log.w(TAG, e); @@ -205,11 +207,25 @@ public void acceptMessageRequest(@NonNull RecipientId recipientId, ApplicationDependencies.getJobManager().add(MultiDeviceMessageRequestResponseJob.forAccept(recipientId)); } + insertMessageRequestAccept(recipient, threadId); onMessageRequestAccepted.run(); } }); } + private void insertMessageRequestAccept(Recipient recipient, long threadId) { + try { + SignalDatabase.messages().insertMessageOutbox( + OutgoingMessage.messageRequestAcceptMessage(recipient, System.currentTimeMillis(), TimeUnit.SECONDS.toMillis(recipient.getExpiresInSeconds())), + threadId, + false, + null + ); + } catch (MmsException e) { + Log.w(TAG, "Unable to insert message request accept message", e); + } + } + @SuppressWarnings("unchecked") public @NonNull Single> deleteMessageRequest(@NonNull RecipientId recipientId, long threadId) { //noinspection CodeBlock2Expr @@ -295,6 +311,18 @@ public void blockMessageRequest(@NonNull RecipientId recipientId, }); } + @SuppressWarnings("unchecked") + public @NonNull Completable reportSpamMessageRequest(@NonNull RecipientId recipientId, long threadId) { + //noinspection CodeBlock2Expr + return Completable.create(emitter -> { + reportSpamMessageRequest( + recipientId, + threadId, + emitter::onComplete + ); + }).subscribeOn(Schedulers.io()); + } + @SuppressWarnings("unchecked") public @NonNull Single> blockAndReportSpamMessageRequest(@NonNull RecipientId recipientId, long threadId) { //noinspection CodeBlock2Expr @@ -315,13 +343,22 @@ public void blockAndReportSpamMessageRequest(@NonNull RecipientId recipientId, { executor.execute(() -> { Recipient recipient = Recipient.resolved(recipientId); - try{ + try { RecipientUtil.block(context, recipient); + SignalDatabase.messages().insertMessageOutbox( + OutgoingMessage.reportSpamMessage(recipient, System.currentTimeMillis(), TimeUnit.SECONDS.toMillis(recipient.getExpiresInSeconds())), + threadId, + false, + null + ); } catch (GroupChangeException | IOException e) { Log.w(TAG, e); error.onError(GroupChangeFailureReason.fromException(e)); return; + } catch (MmsException e) { + Log.w(TAG, "Unable to insert report spam message", e); } + Recipient.live(recipientId).refresh(); ApplicationDependencies.getJobManager().add(new ReportSpamJob(threadId, System.currentTimeMillis())); @@ -334,6 +371,33 @@ public void blockAndReportSpamMessageRequest(@NonNull RecipientId recipientId, }); } + private void reportSpamMessageRequest(@NonNull RecipientId recipientId, + long threadId, + @NonNull Runnable onReported) + { + executor.execute(() -> { + try { + Recipient recipient = Recipient.resolved(recipientId); + SignalDatabase.messages().insertMessageOutbox( + OutgoingMessage.reportSpamMessage(recipient, System.currentTimeMillis(), TimeUnit.SECONDS.toMillis(recipient.getExpiresInSeconds())), + threadId, + false, + null + ); + } catch (MmsException e) { + Log.w(TAG, "Unable to insert report spam message", e); + } + + ApplicationDependencies.getJobManager().add(new ReportSpamJob(threadId, System.currentTimeMillis())); + + if (TextSecurePreferences.isMultiDevice(context)) { + ApplicationDependencies.getJobManager().add(MultiDeviceMessageRequestResponseJob.forReportSpam(recipientId)); + } + + onReported.run(); + }); + } + @SuppressWarnings("unchecked") public @NonNull Single> unblockAndAccept(@NonNull RecipientId recipientId) { //noinspection CodeBlock2Expr @@ -361,9 +425,9 @@ public void unblockAndAccept(@NonNull RecipientId recipientId, @NonNull Runnable private GroupTable.MemberLevel getGroupMemberLevel(@NonNull RecipientId recipientId) { return SignalDatabase.groups() - .getGroup(recipientId) - .map(g -> g.memberLevel(Recipient.self())) - .orElse(GroupTable.MemberLevel.NOT_A_MEMBER); + .getGroup(recipientId) + .map(g -> g.memberLevel(Recipient.self())) + .orElse(GroupTable.MemberLevel.NOT_A_MEMBER); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestState.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestState.java deleted file mode 100644 index 72de0689ec..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestState.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.thoughtcrime.securesms.messagerequests; - -/** - * An enum representing the possible message request states a user can be in. - */ -public enum MessageRequestState { - /** No message request necessary */ - NONE, - - /** No message request necessary as the user was hidden after accepting*/ - NONE_HIDDEN, - - /** A user is blocked */ - BLOCKED_INDIVIDUAL, - - /** A group is blocked */ - BLOCKED_GROUP, - - /** An individual conversation that existed pre-message-requests but doesn't have profile sharing enabled */ - LEGACY_INDIVIDUAL, - - /** A V1 group conversation that is no longer allowed, because we've forced GV2 on. */ - DEPRECATED_GROUP_V1, - - /** An invite response is needed for a V2 group */ - GROUP_V2_INVITE, - - /** A message request is needed for a V2 group */ - GROUP_V2_ADD, - - /** A message request is needed for an individual */ - INDIVIDUAL, - - /** A message request is needed for an individual since they have been hidden */ - INDIVIDUAL_HIDDEN -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestState.kt b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestState.kt new file mode 100644 index 0000000000..ce620d5865 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestState.kt @@ -0,0 +1,56 @@ +package org.thoughtcrime.securesms.messagerequests + +/** + * Data necessary to render message request view. + */ +data class MessageRequestState @JvmOverloads constructor(val state: State = State.NONE, val reportedAsSpam: Boolean = false) { + + companion object { + @JvmField + val NONE = MessageRequestState() + + @JvmField + val DEPRECATED_V1 = MessageRequestState() + } + + val isAccepted: Boolean + get() = state == State.NONE || state == State.NONE_HIDDEN + + val isBlocked: Boolean + get() = state == State.INDIVIDUAL_BLOCKED || state == State.BLOCKED_GROUP + + /** + * An enum representing the possible message request states a user can be in. + */ + enum class State { + /** No message request necessary */ + NONE, + + /** No message request necessary as the user was hidden after accepting */ + NONE_HIDDEN, + + /** A group is blocked */ + BLOCKED_GROUP, + + /** An individual conversation that existed pre-message-requests but doesn't have profile sharing enabled */ + LEGACY_INDIVIDUAL, + + /** A V1 group conversation that is no longer allowed, because we've forced GV2 on. */ + DEPRECATED_GROUP_V1, + + /** An invite response is needed for a V2 group */ + GROUP_V2_INVITE, + + /** A message request is needed for a V2 group */ + GROUP_V2_ADD, + + /** A message request is needed for an individual */ + INDIVIDUAL, + + /** A user is blocked */ + INDIVIDUAL_BLOCKED, + + /** A message request is needed for an individual since they have been hidden */ + INDIVIDUAL_HIDDEN + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java deleted file mode 100644 index 8ca4a6b2cf..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestViewModel.java +++ /dev/null @@ -1,275 +0,0 @@ -package org.thoughtcrime.securesms.messagerequests; - -import android.content.Context; - -import androidx.annotation.MainThread; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.annotation.WorkerThread; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import androidx.lifecycle.ViewModel; -import androidx.lifecycle.ViewModelProvider; - -import org.signal.core.util.concurrent.SignalExecutors; -import org.thoughtcrime.securesms.groups.ui.GroupChangeFailureReason; -import org.thoughtcrime.securesms.profiles.spoofing.ReviewUtil; -import org.thoughtcrime.securesms.recipients.LiveRecipient; -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.recipients.RecipientForeverObserver; -import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.SingleLiveEvent; -import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; -import org.thoughtcrime.securesms.util.livedata.Store; - -import java.util.Collections; -import java.util.List; - -public class MessageRequestViewModel extends ViewModel { - - private final SingleLiveEvent status = new SingleLiveEvent<>(); - private final SingleLiveEvent failures = new SingleLiveEvent<>(); - private final MutableLiveData recipient = new MutableLiveData<>(); - private final MutableLiveData> groups = new MutableLiveData<>(Collections.emptyList()); - private final MutableLiveData groupInfo = new MutableLiveData<>(GroupInfo.ZERO); - private final Store recipientInfoStore = new Store<>(new RecipientInfo(null, null, null, null)); - - private final LiveData messageData; - private final LiveData requestReviewDisplayState; - private final MessageRequestRepository repository; - - private LiveRecipient liveRecipient; - private long threadId; - - private final RecipientForeverObserver recipientObserver = recipient -> { - loadGroupInfo(); - this.recipient.setValue(recipient); - }; - - private MessageRequestViewModel(MessageRequestRepository repository) { - this.repository = repository; - this.messageData = LiveDataUtil.mapAsync(recipient, this::createMessageDataForRecipient); - this.requestReviewDisplayState = LiveDataUtil.mapAsync(messageData, MessageRequestViewModel::transformHolderToReviewDisplayState); - - recipientInfoStore.update(this.recipient, (recipient, state) -> new RecipientInfo(recipient, state.groupInfo, state.sharedGroups, state.messageRequestState)); - recipientInfoStore.update(this.groupInfo, (groupInfo, state) -> new RecipientInfo(state.recipient, groupInfo, state.sharedGroups, state.messageRequestState)); - recipientInfoStore.update(this.groups, (sharedGroups, state) -> new RecipientInfo(state.recipient, state.groupInfo, sharedGroups, state.messageRequestState)); - recipientInfoStore.update(this.messageData, (messageData, state) -> new RecipientInfo(state.recipient, state.groupInfo, state.sharedGroups, messageData.messageState)); - } - - public void setConversationInfo(@NonNull RecipientId recipientId, long threadId) { - if (liveRecipient != null) { - liveRecipient.removeForeverObserver(recipientObserver); - } - - liveRecipient = Recipient.live(recipientId); - this.threadId = threadId; - - loadRecipient(); - loadGroups(); - loadGroupInfo(); - } - - @Override - protected void onCleared() { - if (liveRecipient != null) { - liveRecipient.removeForeverObserver(recipientObserver); - } - } - - public LiveData getRequestReviewDisplayState() { - return requestReviewDisplayState; - } - - public LiveData getRecipient() { - return recipient; - } - - public LiveData getMessageData() { - return messageData; - } - - public LiveData getRecipientInfo() { - return recipientInfoStore.getStateLiveData(); - } - - public LiveData getMessageRequestStatus() { - return status; - } - - public LiveData getFailures() { - return failures; - } - - public boolean shouldShowMessageRequest() { - MessageData data = messageData.getValue(); - return data != null && data.getMessageState() != MessageRequestState.NONE; - } - - @MainThread - public void onAccept() { - status.setValue(Status.ACCEPTING); - repository.acceptMessageRequest(liveRecipient.getId(), - threadId, - () -> status.postValue(Status.ACCEPTED), - this::onGroupChangeError); - } - - @MainThread - public void onDelete() { - status.setValue(Status.DELETING); - repository.deleteMessageRequest(liveRecipient.getId(), - threadId, - () -> status.postValue(Status.DELETED), - this::onGroupChangeError); - } - - @MainThread - public void onBlock() { - status.setValue(Status.BLOCKING); - repository.blockMessageRequest(liveRecipient.getId(), - () -> status.postValue(Status.BLOCKED), - this::onGroupChangeError); - } - - @MainThread - public void onUnblock() { - repository.unblockAndAccept(liveRecipient.getId(), - () -> status.postValue(Status.ACCEPTED)); - } - - @MainThread - public void onBlockAndReportSpam() { - repository.blockAndReportSpamMessageRequest(liveRecipient.getId(), - threadId, - () -> status.postValue(Status.BLOCKED_AND_REPORTED), - this::onGroupChangeError); - } - - private void onGroupChangeError(@NonNull GroupChangeFailureReason error) { - status.postValue(Status.IDLE); - failures.postValue(error); - } - - private void loadRecipient() { - liveRecipient.observeForever(recipientObserver); - SignalExecutors.BOUNDED.execute(() -> { - recipient.postValue(liveRecipient.get()); - }); - } - - private void loadGroups() { - repository.getGroups(liveRecipient.getId(), this.groups::postValue); - } - - private void loadGroupInfo() { - repository.getGroupInfo(liveRecipient.getId(), groupInfo::postValue); - } - - private static RequestReviewDisplayState transformHolderToReviewDisplayState(@NonNull MessageData holder) { - if (holder.getMessageState() == MessageRequestState.INDIVIDUAL) { - return ReviewUtil.isRecipientReviewSuggested(holder.getRecipient().getId()) ? RequestReviewDisplayState.SHOWN - : RequestReviewDisplayState.HIDDEN; - } else { - return RequestReviewDisplayState.NONE; - } - } - - @WorkerThread - private @NonNull MessageData createMessageDataForRecipient(@NonNull Recipient recipient) { - MessageRequestState state = repository.getMessageRequestState(recipient, threadId); - return new MessageData(recipient, state); - } - - public static class RecipientInfo { - @Nullable private final Recipient recipient; - @NonNull private final GroupInfo groupInfo; - @NonNull private final List sharedGroups; - @Nullable private final MessageRequestState messageRequestState; - - public RecipientInfo(@Nullable Recipient recipient, @Nullable GroupInfo groupInfo, @Nullable List sharedGroups, @Nullable MessageRequestState messageRequestState) { - this.recipient = recipient; - this.groupInfo = groupInfo == null ? GroupInfo.ZERO : groupInfo; - this.sharedGroups = sharedGroups == null ? Collections.emptyList() : sharedGroups; - this.messageRequestState = messageRequestState; - } - - @Nullable - public Recipient getRecipient() { - return recipient; - } - - public int getGroupMemberCount() { - return groupInfo.getFullMemberCount(); - } - - public int getGroupPendingMemberCount() { - return groupInfo.getPendingMemberCount(); - } - - public @NonNull String getGroupDescription() { - return groupInfo.getDescription(); - } - - @NonNull - public List getSharedGroups() { - return sharedGroups; - } - - @Nullable - public MessageRequestState getMessageRequestState() { - return messageRequestState; - } - } - - public enum Status { - IDLE, - BLOCKING, - BLOCKED, - BLOCKED_AND_REPORTED, - DELETING, - DELETED, - ACCEPTING, - ACCEPTED - } - - public enum RequestReviewDisplayState { - HIDDEN, - SHOWN, - NONE - } - - public static final class MessageData { - private final Recipient recipient; - private final MessageRequestState messageState; - - public MessageData(@NonNull Recipient recipient, @NonNull MessageRequestState messageState) { - this.recipient = recipient; - this.messageState = messageState; - } - - public @NonNull Recipient getRecipient() { - return recipient; - } - - public @NonNull MessageRequestState getMessageState() { - return messageState; - } - } - - public static class Factory implements ViewModelProvider.Factory { - - private final Context context; - - public Factory(Context context) { - this.context = context; - } - - @Override - public @NonNull T create(@NonNull Class modelClass) { - //noinspection unchecked - return (T) new MessageRequestViewModel(new MessageRequestRepository(context.getApplicationContext())); - } - } - -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java deleted file mode 100644 index d21b3075ea..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.java +++ /dev/null @@ -1,192 +0,0 @@ -package org.thoughtcrime.securesms.messagerequests; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.util.AttributeSet; -import android.view.View; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.constraintlayout.widget.Group; -import androidx.core.text.HtmlCompat; - -import com.google.android.material.button.MaterialButton; - -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.recipients.Recipient; -import org.thoughtcrime.securesms.util.CommunicationActions; -import org.thoughtcrime.securesms.util.Debouncer; -import org.thoughtcrime.securesms.util.HtmlUtil; -import org.thoughtcrime.securesms.util.views.LearnMoreTextView; - -import java.util.stream.Stream; - -public class MessageRequestsBottomView extends ConstraintLayout { - - private final Debouncer showProgressDebouncer = new Debouncer(250); - - private LearnMoreTextView question; - private MaterialButton accept; - private MaterialButton block; - private MaterialButton delete; - private MaterialButton bigDelete; - private MaterialButton bigUnblock; - private View busyIndicator; - - private Group normalButtons; - private Group blockedButtons; - private @Nullable Group activeGroup; - - public MessageRequestsBottomView(Context context) { - super(context); - onFinishInflate(); - } - - public MessageRequestsBottomView(Context context, AttributeSet attrs) { - super(context, attrs); - } - - public MessageRequestsBottomView(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - - inflate(getContext(), R.layout.message_request_bottom_bar, this); - - question = findViewById(R.id.message_request_question); - accept = findViewById(R.id.message_request_accept); - block = findViewById(R.id.message_request_block); - delete = findViewById(R.id.message_request_delete); - bigDelete = findViewById(R.id.message_request_big_delete); - bigUnblock = findViewById(R.id.message_request_big_unblock); - normalButtons = findViewById(R.id.message_request_normal_buttons); - blockedButtons = findViewById(R.id.message_request_blocked_buttons); - busyIndicator = findViewById(R.id.message_request_busy_indicator); - - setWallpaperEnabled(false); - } - - public void setMessageData(@NonNull MessageRequestViewModel.MessageData messageData) { - Recipient recipient = messageData.getRecipient(); - - question.setLearnMoreVisible(false); - question.setOnLinkClickListener(null); - - switch (messageData.getMessageState()) { - case BLOCKED_INDIVIDUAL: - int message = recipient.isReleaseNotes() ? R.string.MessageRequestBottomView_get_updates_and_news_from_s_you_wont_receive_any_updates_until_you_unblock_them - : recipient.isRegistered() ? R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them - : R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them_SMS; - - question.setText(HtmlCompat.fromHtml(getContext().getString(message, - HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); - setActiveInactiveGroups(blockedButtons, normalButtons); - break; - case BLOCKED_GROUP: - question.setText(R.string.MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members); - setActiveInactiveGroups(blockedButtons, normalButtons); - break; - case LEGACY_INDIVIDUAL: - question.setText(getContext().getString(R.string.MessageRequestBottomView_continue_your_conversation_with_s_and_share_your_name_and_photo, recipient.getShortDisplayName(getContext()))); - question.setLearnMoreVisible(true); - question.setOnLinkClickListener(v -> CommunicationActions.openBrowserLink(getContext(), getContext().getString(R.string.MessageRequestBottomView_legacy_learn_more_url))); - setActiveInactiveGroups(normalButtons, blockedButtons); - accept.setText(R.string.MessageRequestBottomView_continue); - break; - case DEPRECATED_GROUP_V1: - question.setText(R.string.MessageRequestBottomView_upgrade_this_group_to_activate_new_features); - setActiveInactiveGroups(null, normalButtons, blockedButtons); - break; - case GROUP_V2_INVITE: - question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_you_wont_see_their_messages); - setActiveInactiveGroups(normalButtons, blockedButtons); - accept.setText(R.string.MessageRequestBottomView_accept); - break; - case GROUP_V2_ADD: - question.setText(R.string.MessageRequestBottomView_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept); - setActiveInactiveGroups(normalButtons, blockedButtons); - accept.setText(R.string.MessageRequestBottomView_accept); - break; - case INDIVIDUAL: - question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, - HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); - setActiveInactiveGroups(normalButtons, blockedButtons); - accept.setText(R.string.MessageRequestBottomView_accept); - break; - case INDIVIDUAL_HIDDEN: - question.setText(HtmlCompat.fromHtml(getContext().getString(R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_you_removed_them_before, - HtmlUtil.bold(recipient.getShortDisplayName(getContext()))), 0)); - setActiveInactiveGroups(normalButtons, blockedButtons); - accept.setText(R.string.MessageRequestBottomView_accept); - break; - } - } - - private void setActiveInactiveGroups(@Nullable Group activeGroup, @NonNull Group... inActiveGroups) { - int initialVisibility = this.activeGroup != null ? this.activeGroup.getVisibility() : VISIBLE; - - this.activeGroup = activeGroup; - - for (Group inactive : inActiveGroups) { - inactive.setVisibility(GONE); - } - - if (activeGroup != null) { - activeGroup.setVisibility(initialVisibility); - } - } - - public void showBusy() { - showProgressDebouncer.publish(() -> busyIndicator.setVisibility(VISIBLE)); - if (activeGroup != null) { - activeGroup.setVisibility(INVISIBLE); - } - } - - public void hideBusy() { - showProgressDebouncer.clear(); - busyIndicator.setVisibility(GONE); - if (activeGroup != null) { - activeGroup.setVisibility(VISIBLE); - } - } - - public void setWallpaperEnabled(boolean isEnabled) { - MessageRequestBarColorTheme theme = MessageRequestBarColorTheme.resolveTheme(isEnabled); - - Stream.of(delete, bigDelete, block, bigUnblock, accept).forEach(button -> { - button.setBackgroundTintList(ColorStateList.valueOf(theme.getButtonBackgroundColor(getContext()))); - }); - - Stream.of(delete, bigDelete, block).forEach(button -> { - button.setTextColor(theme.getButtonForegroundDenyColor(getContext())); - }); - - Stream.of(accept, bigUnblock).forEach(button -> { - button.setTextColor(theme.getButtonForegroundAcceptColor(getContext())); - }); - - setBackgroundColor(theme.getContainerButtonBackgroundColor(getContext())); - } - - public void setAcceptOnClickListener(OnClickListener acceptOnClickListener) { - accept.setOnClickListener(acceptOnClickListener); - } - - public void setDeleteOnClickListener(OnClickListener deleteOnClickListener) { - delete.setOnClickListener(deleteOnClickListener); - bigDelete.setOnClickListener(deleteOnClickListener); - } - - public void setBlockOnClickListener(OnClickListener blockOnClickListener) { - block.setOnClickListener(blockOnClickListener); - } - - public void setUnblockOnClickListener(OnClickListener unblockOnClickListener) { - bigUnblock.setOnClickListener(unblockOnClickListener); - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.kt b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.kt new file mode 100644 index 0000000000..0dd3d06c25 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/messagerequests/MessageRequestsBottomView.kt @@ -0,0 +1,161 @@ +package org.thoughtcrime.securesms.messagerequests + +import android.content.Context +import android.content.res.ColorStateList +import android.util.AttributeSet +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.text.HtmlCompat +import com.google.android.material.button.MaterialButton +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.messagerequests.MessageRequestBarColorTheme.Companion.resolveTheme +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.util.CommunicationActions +import org.thoughtcrime.securesms.util.Debouncer +import org.thoughtcrime.securesms.util.HtmlUtil +import org.thoughtcrime.securesms.util.views.LearnMoreTextView +import org.thoughtcrime.securesms.util.visible + +/** + * View shown in a conversation during a message request state or related state (e.g., blocked). + */ +class MessageRequestsBottomView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : ConstraintLayout(context, attrs, defStyleAttr) { + private val showProgressDebouncer = Debouncer(250) + + private val question: LearnMoreTextView + private val accept: MaterialButton + private val block: MaterialButton + private val unblock: MaterialButton + private val delete: MaterialButton + private val report: MaterialButton + private val busyIndicator: View + private val buttonBar: View + + init { + inflate(context, R.layout.message_request_bottom_bar, this) + + question = findViewById(R.id.message_request_question) + accept = findViewById(R.id.message_request_accept) + block = findViewById(R.id.message_request_block) + unblock = findViewById(R.id.message_request_unblock) + delete = findViewById(R.id.message_request_delete) + report = findViewById(R.id.message_request_report) + busyIndicator = findViewById(R.id.message_request_busy_indicator) + buttonBar = findViewById(R.id.message_request_button_layout) + + setWallpaperEnabled(false) + } + + fun setMessageRequestData(recipient: Recipient, messageRequestState: MessageRequestState) { + question.setLearnMoreVisible(false) + question.setOnLinkClickListener(null) + + updateButtonVisibility(messageRequestState) + + when (messageRequestState.state) { + MessageRequestState.State.INDIVIDUAL_BLOCKED -> { + val message = if (recipient.isReleaseNotes) R.string.MessageRequestBottomView_get_updates_and_news_from_s_you_wont_receive_any_updates_until_you_unblock_them else if (recipient.isRegistered) R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them else R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_wont_receive_any_messages_until_you_unblock_them_SMS + question.text = HtmlCompat.fromHtml( + context.getString( + message, + HtmlUtil.bold(recipient.getShortDisplayName(context)) + ), + 0 + ) + } + + MessageRequestState.State.BLOCKED_GROUP -> question.setText(R.string.MessageRequestBottomView_unblock_this_group_and_share_your_name_and_photo_with_its_members) + + MessageRequestState.State.LEGACY_INDIVIDUAL -> { + question.text = context.getString(R.string.MessageRequestBottomView_continue_your_conversation_with_s_and_share_your_name_and_photo, recipient.getShortDisplayName(context)) + question.setLearnMoreVisible(true) + question.setOnLinkClickListener { CommunicationActions.openBrowserLink(context, context.getString(R.string.MessageRequestBottomView_legacy_learn_more_url)) } + accept.setText(R.string.MessageRequestBottomView_continue) + } + + MessageRequestState.State.DEPRECATED_GROUP_V1 -> question.setText(R.string.MessageRequestBottomView_upgrade_this_group_to_activate_new_features) + MessageRequestState.State.GROUP_V2_INVITE -> { + question.setText(R.string.MessageRequestBottomView_do_you_want_to_join_this_group_you_wont_see_their_messages) + accept.setText(R.string.MessageRequestBottomView_accept) + } + + MessageRequestState.State.GROUP_V2_ADD -> { + question.setText(R.string.MessageRequestBottomView_join_this_group_they_wont_know_youve_seen_their_messages_until_you_accept) + accept.setText(R.string.MessageRequestBottomView_accept) + } + + MessageRequestState.State.INDIVIDUAL -> { + question.text = HtmlCompat.fromHtml( + context.getString( + R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_they_wont_know_youve_seen_their_messages_until_you_accept, + HtmlUtil.bold(recipient.getShortDisplayName(context)) + ), + 0 + ) + accept.setText(R.string.MessageRequestBottomView_accept) + } + + MessageRequestState.State.INDIVIDUAL_HIDDEN -> { + question.text = HtmlCompat.fromHtml( + context.getString( + R.string.MessageRequestBottomView_do_you_want_to_let_s_message_you_you_removed_them_before, + HtmlUtil.bold(recipient.getShortDisplayName(context)) + ), + 0 + ) + accept.setText(R.string.MessageRequestBottomView_accept) + } + + MessageRequestState.State.NONE -> Unit + MessageRequestState.State.NONE_HIDDEN -> Unit + } + } + + private fun updateButtonVisibility(messageState: MessageRequestState) { + accept.visible = !messageState.isBlocked + block.visible = !messageState.isBlocked + unblock.visible = messageState.isBlocked + delete.visible = messageState.reportedAsSpam || messageState.isBlocked + report.visible = !messageState.reportedAsSpam + } + + fun showBusy() { + showProgressDebouncer.publish { busyIndicator.visibility = VISIBLE } + buttonBar.visibility = INVISIBLE + } + + fun hideBusy() { + showProgressDebouncer.clear() + busyIndicator.visibility = GONE + buttonBar.visibility = VISIBLE + } + + fun setWallpaperEnabled(isEnabled: Boolean) { + val theme = resolveTheme(isEnabled) + listOf(delete, block, accept, unblock, report).forEach { it.backgroundTintList = ColorStateList.valueOf(theme.getButtonBackgroundColor(context)) } + listOf(delete, block, report).forEach { it.setTextColor(theme.getButtonForegroundDenyColor(context)) } + listOf(accept, unblock).forEach { it.setTextColor(theme.getButtonForegroundAcceptColor(context)) } + + setBackgroundColor(theme.getContainerButtonBackgroundColor(context)) + } + + fun setAcceptOnClickListener(acceptOnClickListener: OnClickListener?) { + accept.setOnClickListener(acceptOnClickListener) + } + + fun setDeleteOnClickListener(deleteOnClickListener: OnClickListener?) { + delete.setOnClickListener(deleteOnClickListener) + } + + fun setBlockOnClickListener(blockOnClickListener: OnClickListener?) { + block.setOnClickListener(blockOnClickListener) + } + + fun setUnblockOnClickListener(unblockOnClickListener: OnClickListener?) { + unblock.setOnClickListener(unblockOnClickListener) + } + + fun setReportOnClickListener(reportOnClickListener: OnClickListener?) { + report.setOnClickListener(reportOnClickListener) + } +} 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 78b08d657b..4a9af42bc8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/DataMessageProcessor.kt @@ -127,7 +127,18 @@ object DataMessageProcessor { var groupProcessResult: MessageContentProcessor.Gv2PreProcessResult? = null if (groupId != null) { - groupProcessResult = MessageContentProcessor.handleGv2PreProcessing(context, envelope.timestamp!!, content, metadata, groupId, message.groupV2!!, senderRecipient, groupSecretParams) + groupProcessResult = MessageContentProcessor.handleGv2PreProcessing( + context = context, + timestamp = envelope.timestamp!!, + content = content, + metadata = metadata, + groupId = groupId, + groupV2 = message.groupV2!!, + senderRecipient = senderRecipient, + groupSecretParams = groupSecretParams, + serverGuid = envelope.serverGuid + ) + if (groupProcessResult == MessageContentProcessor.Gv2PreProcessResult.IGNORE) { return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt index 11c3efc260..e47bef1a3f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageContentProcessor.kt @@ -239,10 +239,11 @@ open class MessageContentProcessor(private val context: Context) { groupId: GroupId.V2, groupV2: GroupContextV2, senderRecipient: Recipient, - groupSecretParams: GroupSecretParams? = null + groupSecretParams: GroupSecretParams? = null, + serverGuid: String? = null ): Gv2PreProcessResult { val preUpdateGroupRecord = SignalDatabase.groups.getGroup(groupId) - val groupUpdateResult = updateGv2GroupFromServerOrP2PChange(context, timestamp, groupV2, preUpdateGroupRecord, groupSecretParams) + val groupUpdateResult = updateGv2GroupFromServerOrP2PChange(context, timestamp, groupV2, preUpdateGroupRecord, groupSecretParams, serverGuid) if (groupUpdateResult == null) { log(timestamp, "Ignoring GV2 message for group we are not currently in $groupId") return Gv2PreProcessResult.IGNORE @@ -283,13 +284,14 @@ open class MessageContentProcessor(private val context: Context) { timestamp: Long, groupV2: GroupContextV2, localRecord: Optional, - groupSecretParams: GroupSecretParams? = null + groupSecretParams: GroupSecretParams? = null, + serverGuid: String? = null ): GroupsV2StateProcessor.GroupUpdateResult? { return try { val signedGroupChange: ByteArray? = if (groupV2.hasSignedGroupChange) groupV2.signedGroupChange else null val updatedTimestamp = if (signedGroupChange != null) timestamp else timestamp - 1 if (groupV2.revision != null) { - GroupManager.updateGroupFromServer(context, groupV2.groupMasterKey, localRecord, groupSecretParams, groupV2.revision!!, updatedTimestamp, signedGroupChange) + GroupManager.updateGroupFromServer(context, groupV2.groupMasterKey, localRecord, groupSecretParams, groupV2.revision!!, updatedTimestamp, signedGroupChange, serverGuid) } else { warn(timestamp, "Ignore group update message without a revision") null @@ -362,15 +364,21 @@ open class MessageContentProcessor(private val context: Context) { warn(timestamp, "Handling encryption error.") val threadRecipient = if (exceptionMetadata.groupId != null) Recipient.externalPossiblyMigratedGroup(exceptionMetadata.groupId) else sender - SignalDatabase - .messages - .insertBadDecryptMessage( - recipientId = sender.id, - senderDevice = exceptionMetadata.senderDevice, - sentTimestamp = timestamp, - receivedTimestamp = System.currentTimeMillis(), - threadId = SignalDatabase.threads.getOrCreateThreadIdFor(threadRecipient) - ) + val threadId: Long? = SignalDatabase.threads.getThreadIdFor(threadRecipient.id) + + if (threadId != null) { + SignalDatabase + .messages + .insertBadDecryptMessage( + recipientId = sender.id, + senderDevice = exceptionMetadata.senderDevice, + sentTimestamp = timestamp, + receivedTimestamp = System.currentTimeMillis(), + threadId = threadId + ) + } else { + warn(timestamp, "Could not find a thread for the target recipient. Skipping.") + } } MessageState.INVALID_VERSION -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt index baed1183f9..fe0ca69e20 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt @@ -8,6 +8,7 @@ import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat import com.squareup.wire.internal.toUnmodifiableList import org.signal.core.util.PendingIntentFlags +import org.signal.core.util.isAbsent import org.signal.core.util.logging.Log import org.signal.core.util.roundedString import org.signal.libsignal.metadata.InvalidMetadataMessageException @@ -302,11 +303,22 @@ object MessageDecryptor { followUpOperations += FollowUpOperation { val groupId: GroupId? = protocolException.parseGroupId(envelope) - val threadId: Long = if (groupId != null) { + + val threadId: Long? = if (groupId != null) { + if (SignalDatabase.groups.getGroup(groupId).isAbsent()) { + Log.w(TAG, "${logPrefix(envelope)} No group found for $groupId! Not inserting a retry receipt.") + return@FollowUpOperation null + } + val groupRecipient: Recipient = Recipient.externalPossiblyMigratedGroup(groupId) - SignalDatabase.threads.getOrCreateThreadIdFor(groupRecipient) + SignalDatabase.threads.getThreadIdFor(groupRecipient.id) } else { - SignalDatabase.threads.getOrCreateThreadIdFor(sender) + SignalDatabase.threads.getThreadIdFor(sender.id) + } + + if (threadId == null) { + Log.w(TAG, "${logPrefix(envelope)} Thread does not already exist for sender ${sender.id}! We will not create one just to show a retry receipt.") + return@FollowUpOperation null } ApplicationDependencies.getPendingRetryReceiptCache().insert(sender.id, senderDevice, envelope.timestamp!!, receivedTimestamp, threadId) diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt index 5e1d9c73a2..d3dd5b7c5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/SyncMessageProcessor.kt @@ -80,9 +80,6 @@ import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.toSignalServic import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.type import org.thoughtcrime.securesms.mms.MmsException import org.thoughtcrime.securesms.mms.OutgoingMessage -import org.thoughtcrime.securesms.mms.OutgoingMessage.Companion.endSessionMessage -import org.thoughtcrime.securesms.mms.OutgoingMessage.Companion.expirationUpdateMessage -import org.thoughtcrime.securesms.mms.OutgoingMessage.Companion.text import org.thoughtcrime.securesms.mms.QuoteModel import org.thoughtcrime.securesms.notifications.MarkReadReceiver import org.thoughtcrime.securesms.payments.MobileCoinPublicAddress @@ -133,6 +130,7 @@ import org.whispersystems.signalservice.internal.push.Verified import java.io.IOException import java.util.Optional import java.util.UUID +import java.util.concurrent.TimeUnit import kotlin.time.Duration object SyncMessageProcessor { @@ -348,7 +346,7 @@ object SyncMessageProcessor { messageId = SignalDatabase.messages.insertMessageOutbox(outgoingTextMessage, threadId, false, null) SignalDatabase.messages.markUnidentified(messageId, sent.isUnidentified(toRecipient.serviceId.orNull())) } - SignalDatabase.threads.update(threadId, true) + SignalDatabase.messages.markAsSent(messageId, true) if (targetMessage.expireStarted > 0) { SignalDatabase.messages.markExpireStarted(messageId, targetMessage.expireStarted) @@ -588,7 +586,7 @@ object SyncMessageProcessor { log(envelopeTimestamp, "Synchronize end session message.") val recipient: Recipient = getSyncMessageDestination(sent) - val outgoingEndSessionMessage: OutgoingMessage = endSessionMessage(recipient, sent.timestamp!!) + val outgoingEndSessionMessage: OutgoingMessage = OutgoingMessage.endSessionMessage(recipient, sent.timestamp!!) val threadId: Long = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) if (!recipient.isGroup) { @@ -602,7 +600,6 @@ object SyncMessageProcessor { ) SignalDatabase.messages.markAsSent(messageId, true) - SignalDatabase.threads.update(threadId, true) } return threadId @@ -637,7 +634,7 @@ object SyncMessageProcessor { } val recipient: Recipient = getSyncMessageDestination(sent) - val expirationUpdateMessage: OutgoingMessage = expirationUpdateMessage(recipient, if (sideEffect) sent.timestamp!! - 1 else sent.timestamp!!, sent.message!!.expireTimerDuration.inWholeMilliseconds) + val expirationUpdateMessage: OutgoingMessage = OutgoingMessage.expirationUpdateMessage(recipient, if (sideEffect) sent.timestamp!! - 1 else sent.timestamp!!, sent.message!!.expireTimerDuration.inWholeMilliseconds) val threadId: Long = SignalDatabase.threads.getOrCreateThreadIdFor(recipient) val messageId: Long = SignalDatabase.messages.insertMessageOutbox(expirationUpdateMessage, threadId, false, null) @@ -843,11 +840,10 @@ object SyncMessageProcessor { messageId = SignalDatabase.messages.insertMessageOutbox(outgoingMessage, threadId, false, GroupReceiptTable.STATUS_UNKNOWN, null) updateGroupReceiptStatus(sent, messageId, recipient.requireGroupId()) } else { - val outgoingTextMessage = text(threadRecipient = recipient, body = body, expiresIn = expiresInMillis, sentTimeMillis = sent.timestamp!!, bodyRanges = bodyRanges) + val outgoingTextMessage = OutgoingMessage.text(threadRecipient = recipient, body = body, expiresIn = expiresInMillis, sentTimeMillis = sent.timestamp!!, bodyRanges = bodyRanges) messageId = SignalDatabase.messages.insertMessageOutbox(outgoingTextMessage, threadId, false, null) SignalDatabase.messages.markUnidentified(messageId, sent.isUnidentified(recipient.serviceId.orNull())) } - SignalDatabase.threads.update(threadId, true) SignalDatabase.messages.markAsSent(messageId, true) if (expiresInMillis > 0) { SignalDatabase.messages.markExpireStarted(messageId, sent.expirationStartTimestamp ?: 0) @@ -1072,6 +1068,12 @@ object SyncMessageProcessor { MessageRequestResponse.Type.ACCEPT -> { SignalDatabase.recipients.setProfileSharing(recipient.id, true) SignalDatabase.recipients.setBlocked(recipient.id, false) + SignalDatabase.messages.insertMessageOutbox( + OutgoingMessage.messageRequestAcceptMessage(recipient, System.currentTimeMillis(), TimeUnit.SECONDS.toMillis(recipient.expiresInSeconds.toLong())), + threadId, + false, + null + ) } MessageRequestResponse.Type.DELETE -> { SignalDatabase.recipients.setProfileSharing(recipient.id, false) @@ -1090,6 +1092,24 @@ object SyncMessageProcessor { SignalDatabase.threads.deleteConversation(threadId) } } + MessageRequestResponse.Type.SPAM -> { + SignalDatabase.messages.insertMessageOutbox( + OutgoingMessage.reportSpamMessage(recipient, System.currentTimeMillis(), TimeUnit.SECONDS.toMillis(recipient.expiresInSeconds.toLong())), + threadId, + false, + null + ) + } + MessageRequestResponse.Type.BLOCK_AND_SPAM -> { + SignalDatabase.recipients.setBlocked(recipient.id, true) + SignalDatabase.recipients.setProfileSharing(recipient.id, false) + SignalDatabase.messages.insertMessageOutbox( + OutgoingMessage.reportSpamMessage(recipient, System.currentTimeMillis(), TimeUnit.SECONDS.toMillis(recipient.expiresInSeconds.toLong())), + threadId, + false, + null + ) + } else -> warn("Got an unknown response type! Skipping") } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedKyberPreKeyStore.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedKyberPreKeyStore.kt index ea6617cd68..ba9c6ee146 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedKyberPreKeyStore.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedKyberPreKeyStore.kt @@ -25,7 +25,7 @@ class BufferedKyberPreKeyStore(private val selfServiceId: ServiceId) : SignalSer private var hasLoadedAll: Boolean = false /** The kyber prekeys that have been marked as removed (if they're not last resort). */ - private val removedIfNotLastResort: MutableList = mutableListOf() + private val removedIfNotLastResort: MutableSet = mutableSetOf() @kotlin.jvm.Throws(InvalidKeyIdException::class) override fun loadKyberPreKey(kyberPreKeyId: Int): KyberPreKeyRecord { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignalServiceAccountDataStore.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignalServiceAccountDataStore.kt index 5da7f56e9a..3f1846fd5d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignalServiceAccountDataStore.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignalServiceAccountDataStore.kt @@ -200,6 +200,7 @@ class BufferedSignalServiceAccountDataStore(selfServiceId: ServiceId) : SignalSe fun flushToDisk(persistentStore: SignalServiceAccountDataStore) { identityStore.flushToDisk(persistentStore) oneTimePreKeyStore.flushToDisk(persistentStore) + kyberPreKeyStore.flushToDisk(persistentStore) signedPreKeyStore.flushToDisk(persistentStore) sessionStore.flushToDisk(persistentStore) senderKeyStore.flushToDisk(persistentStore) diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignedPreKeyStore.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignedPreKeyStore.kt index b42a52075e..11ef5ce026 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignedPreKeyStore.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/protocol/BufferedSignedPreKeyStore.kt @@ -24,7 +24,7 @@ class BufferedSignedPreKeyStore(private val selfServiceId: ServiceId) : SignedPr @kotlin.jvm.Throws(InvalidKeyIdException::class) override fun loadSignedPreKey(id: Int): SignedPreKeyRecord { return store.computeIfAbsent(id) { - SignalDatabase.signedPreKeys.get(selfServiceId, id) ?: throw InvalidKeyIdException("Missing one-time prekey with ID: $id") + SignalDatabase.signedPreKeys.get(selfServiceId, id) ?: throw InvalidKeyIdException("Missing signed prekey with ID: $id") } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java index e7727f719c..b61809d34c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/AttachmentManager.java @@ -39,9 +39,14 @@ import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestManager; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.signal.core.util.ThreadUtil; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.ListenableFuture.Listener; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; @@ -81,9 +86,6 @@ import org.thoughtcrime.securesms.util.ProfileUtil; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.concurrent.AssertedSuccessListener; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.views.Stub; import org.whispersystems.signalservice.api.util.ExpiringProfileCredentialUtil; @@ -137,14 +139,14 @@ private void inflateStub() { } - public void clear(@NonNull GlideRequests glideRequests, boolean animate) { + public void clear(@NonNull RequestManager requestManager, boolean animate) { if (attachmentViewStub.resolved()) { if (animate) { ViewUtil.fadeOut(attachmentViewStub.get(), 200).addListener(new Listener() { @Override public void onSuccess(Boolean result) { - thumbnail.clear(glideRequests); + thumbnail.clear(requestManager); attachmentViewStub.get().setVisibility(View.GONE); attachmentListener.onAttachmentChanged(); } @@ -154,7 +156,7 @@ public void onFailure(ExecutionException e) { } }); } else { - thumbnail.clear(glideRequests); + thumbnail.clear(requestManager); attachmentViewStub.get().setVisibility(View.GONE); attachmentListener.onAttachmentChanged(); } @@ -255,7 +257,7 @@ public void setLocation(@NonNull final SignalPlace place, } @SuppressLint("StaticFieldLeak") - public ListenableFuture setMedia(@NonNull final GlideRequests glideRequests, + public ListenableFuture setMedia(@NonNull final RequestManager requestManager, @NonNull final Uri uri, @NonNull final SlideFactory.MediaType mediaType, @NonNull final MediaConstraints constraints, @@ -271,7 +273,7 @@ public ListenableFuture setMedia(@NonNull final GlideRequests glideRequ @Override protected void onPreExecute() { - thumbnail.clear(glideRequests); + thumbnail.clear(requestManager); thumbnail.showProgressSpinner(); attachmentViewStub.get().setVisibility(View.VISIBLE); } @@ -323,7 +325,7 @@ protected void onPostExecute(@Nullable final Slide slide) { result.set(true); } else { Attachment attachment = slide.asAttachment(); - result.deferTo(thumbnail.setImageResource(glideRequests, slide, false, true, attachment.width, attachment.height)); + result.deferTo(thumbnail.setImageResource(requestManager, slide, false, true, attachment.width, attachment.height)); removableMediaView.display(thumbnail, mediaType == SlideFactory.MediaType.IMAGE); } @@ -580,7 +582,7 @@ public void onClick(View v) { }); cleanup(); - clear(GlideApp.with(context.getApplicationContext()), true); + clear(Glide.with(context.getApplicationContext()), true); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java b/app/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java index b3b26a5e9a..7261aea644 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/AudioSlide.java @@ -91,6 +91,6 @@ public String getContentDescription(Context context) { @Override public @DrawableRes int getPlaceholderRes(Theme theme) { - return R.drawable.ic_audio; + return R.drawable.symbol_speaker_fill_24; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt index 234ff38a4c..19b7b8a38c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/IncomingMessage.kt @@ -94,7 +94,7 @@ class IncomingMessage( } @JvmStatic - fun groupUpdate(from: RecipientId, timestamp: Long, groupId: GroupId, groupContext: DecryptedGroupV2Context): IncomingMessage { + fun groupUpdate(from: RecipientId, timestamp: Long, groupId: GroupId, groupContext: DecryptedGroupV2Context, serverGuid: String?): IncomingMessage { val messageGroupContext = MessageGroupContext(groupContext) return IncomingMessage( @@ -104,6 +104,7 @@ class IncomingMessage( serverTimeMillis = timestamp, groupId = groupId, groupContext = messageGroupContext, + serverGuid = serverGuid, body = messageGroupContext.encodedGroupContext, type = MessageType.GROUP_UPDATE ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMessage.kt b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMessage.kt index dcce6f0f83..79a7e159a8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMessage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/OutgoingMessage.kt @@ -50,7 +50,9 @@ data class OutgoingMessage( val isIdentityVerified: Boolean = false, val isIdentityDefault: Boolean = false, val scheduledDate: Long = -1, - val messageToEdit: Long = 0 + val messageToEdit: Long = 0, + val isReportSpam: Boolean = false, + val isMessageRequestAccept: Boolean = false ) { val isV2Group: Boolean = messageGroupContext != null && GroupV2UpdateMessageUtil.isGroupV2(messageGroupContext) @@ -401,6 +403,30 @@ data class OutgoingMessage( ) } + @JvmStatic + fun reportSpamMessage(threadRecipient: Recipient, sentTimeMillis: Long, expiresIn: Long): OutgoingMessage { + return OutgoingMessage( + threadRecipient = threadRecipient, + sentTimeMillis = sentTimeMillis, + expiresIn = expiresIn, + isReportSpam = true, + isUrgent = false, + isSecure = true + ) + } + + @JvmStatic + fun messageRequestAcceptMessage(threadRecipient: Recipient, sentTimeMillis: Long, expiresIn: Long): OutgoingMessage { + return OutgoingMessage( + threadRecipient = threadRecipient, + sentTimeMillis = sentTimeMillis, + expiresIn = expiresIn, + isMessageRequestAccept = true, + isUrgent = false, + isSecure = true + ) + } + @JvmStatic fun buildMessage(slideDeck: SlideDeck, message: String): String { return if (message.isNotEmpty() && slideDeck.body.isNotEmpty()) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java index b7ba51ed73..f5d00d8793 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mms/PushMediaConstraints.java @@ -7,6 +7,7 @@ import androidx.annotation.Nullable; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.LocaleFeatureFlags; import org.thoughtcrime.securesms.util.Util; @@ -66,8 +67,12 @@ public long getUncompressedVideoMaxSize(Context context) { @Override public long getCompressedVideoMaxSize(Context context) { - return Util.isLowMemory(context) ? 30 * MB - : 50 * MB; + if (FeatureFlags.useStreamingVideoMuxer()) { + return getMaxAttachmentSize(); + } else { + return Util.isLowMemory(context) ? 30 * MB + : 50 * MB; + } } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt index 6199956f95..f3ee2cecff 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationBuilder.kt @@ -194,7 +194,7 @@ sealed class NotificationBuilder(protected val context: Context) { val markAsRead: PendingIntent? = conversation.getMarkAsReadIntent(context) if (markAsRead != null) { val markAsReadAction: NotificationCompat.Action = - NotificationCompat.Action.Builder(R.drawable.check, context.getString(R.string.MessageNotifier_mark_read), markAsRead) + NotificationCompat.Action.Builder(R.drawable.symbol_check_24, context.getString(R.string.MessageNotifier_mark_read), markAsRead) .setSemanticAction(NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ) .setShowsUserInterface(false) .build() @@ -239,7 +239,7 @@ sealed class NotificationBuilder(protected val context: Context) { val markAsRead: PendingIntent? = state.getMarkAsReadIntent(context) if (markAsRead != null) { - val markAllAsReadAction = NotificationCompat.Action(R.drawable.check, context.getString(R.string.MessageNotifier_mark_all_as_read), markAsRead) + val markAllAsReadAction = NotificationCompat.Action(R.drawable.symbol_check_24, context.getString(R.string.MessageNotifier_mark_all_as_read), markAsRead) builder.addAction(markAllAsReadAction) builder.extend(NotificationCompat.WearableExtender().addAction(markAllAsReadAction)) } @@ -248,7 +248,7 @@ sealed class NotificationBuilder(protected val context: Context) { override fun addTurnOffJoinedNotificationsAction(pendingIntent: PendingIntent?) { if (pendingIntent != null) { val turnOffTheseNotifications = NotificationCompat.Action( - R.drawable.check, + R.drawable.symbol_check_24, context.getString(R.string.MessageNotifier_turn_off_these_notifications), pendingIntent ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationExtensions.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationExtensions.kt index 8be02eb4e3..554ea7460d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationExtensions.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationExtensions.kt @@ -7,6 +7,7 @@ import android.graphics.Bitmap import android.graphics.drawable.Drawable import android.net.Uri import android.os.Build +import com.bumptech.glide.Glide import com.bumptech.glide.load.MultiTransformation import com.bumptech.glide.load.Transformation import com.bumptech.glide.load.engine.DiskCacheStrategy @@ -18,7 +19,6 @@ import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.notifications.NotificationIds import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.BitmapUtil @@ -46,7 +46,7 @@ fun Recipient.getContactDrawable(context: Context): Drawable? { } transforms += CircleCrop() - GlideApp.with(context.applicationContext) + Glide.with(context.applicationContext) .load(contactPhoto) .diskCacheStrategy(DiskCacheStrategy.ALL) .transform(MultiTransformation(transforms)) @@ -67,7 +67,7 @@ fun Recipient.getContactDrawable(context: Context): Drawable? { fun Uri.toBitmap(context: Context, dimension: Int): Bitmap { return try { - GlideApp.with(context.applicationContext) + Glide.with(context.applicationContext) .asBitmap() .load(DecryptableUri(this)) .diskCacheStrategy(DiskCacheStrategy.NONE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt index 6c5354dc6b..30523116ec 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationFactory.kt @@ -357,7 +357,7 @@ object NotificationFactory { builder.apply { setSmallIcon(R.drawable.ic_notification) - setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.ic_action_warning_red)) + setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.symbol_error_triangle_fill_32)) setContentTitle(context.getString(R.string.MessageNotifier_message_delivery_failed)) setContentText(context.getString(R.string.MessageNotifier_failed_to_deliver_message)) setTicker(context.getString(R.string.MessageNotifier_error_delivering_message)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItem.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItem.kt index 14576c1ddc..47ed4f0ff1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/v2/NotificationItem.kt @@ -226,15 +226,15 @@ class MessageNotification(threadRecipient: Recipient, record: MessageRecord) : N } else if (record.isRemoteDelete) { SpanUtil.italic(context.getString(R.string.MessageNotifier_this_message_was_deleted)) } else if (record.isMms && !record.isMmsNotification && (record as MmsMessageRecord).slideDeck.slides.isNotEmpty()) { - ThreadBodyUtil.getFormattedBodyFor(context, record).body + ThreadBodyUtil.getFormattedBodyForNotification(context, record, getBodyWithMentionsAndStyles(context, record)) } else if (record.isGroupCall) { MessageRecord.getGroupCallUpdateDescription(context, record.body, false).spannable } else if (record.hasGiftBadge()) { - ThreadBodyUtil.getFormattedBodyFor(context, record).body + ThreadBodyUtil.getFormattedBodyForNotification(context, record, null) } else if (record.isStoryReaction()) { - ThreadBodyUtil.getFormattedBodyFor(context, record).body + ThreadBodyUtil.getFormattedBodyForNotification(context, record, null) } else if (record.isPaymentNotification) { - ThreadBodyUtil.getFormattedBodyFor(context, record).body + ThreadBodyUtil.getFormattedBodyForNotification(context, record, null) } else { getBodyWithMentionsAndStyles(context, record) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberVisualTransformation.kt b/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberVisualTransformation.kt new file mode 100644 index 0000000000..67ecb59dbb --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/phonenumbers/PhoneNumberVisualTransformation.kt @@ -0,0 +1,58 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.phonenumbers + +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.input.OffsetMapping +import androidx.compose.ui.text.input.TransformedText +import androidx.compose.ui.text.input.VisualTransformation +import com.google.i18n.phonenumbers.AsYouTypeFormatter +import com.google.i18n.phonenumbers.PhoneNumberUtil + +/** + * Formats the input number according to the regionCode. Assumes the input is all digits. + */ +class PhoneNumberVisualTransformation( + regionCode: String +) : VisualTransformation { + + private val asYouTypeFormatter: AsYouTypeFormatter = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(regionCode) + + override fun filter(text: AnnotatedString): TransformedText { + asYouTypeFormatter.clear() + val output = text.map { asYouTypeFormatter.inputDigit(it) }.lastOrNull() ?: text.text + + return TransformedText( + AnnotatedString(output), + PhoneNumberOffsetMapping(output) + ) + } + + /** + * Each character in our phone number is either a digit or a transformed offset. + */ + private class PhoneNumberOffsetMapping( + private val transformed: String + ) : OffsetMapping { + override fun originalToTransformed(offset: Int): Int { + // We need a different algorithm here. We need to take UNTIL we've hit offset digits, and then return the resulting length. + var remaining = (offset + 1) + return transformed.takeWhile { + if (it.isDigit()) { + remaining-- + } + + remaining != 0 + }.length + } + + override fun transformedToOriginal(offset: Int): Int { + val substring = transformed.substring(0, offset) + val characterCount = substring.count { !it.isDigit() } + return offset - characterCount + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java b/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java index c20f4b24e5..20b8b21028 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/preferences/NetworkPreferenceFragment.java @@ -18,6 +18,8 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; @@ -26,8 +28,6 @@ import org.thoughtcrime.securesms.net.SocksProxy; import org.thoughtcrime.securesms.util.SignalProxyUtil; import org.thoughtcrime.securesms.util.TextSecurePreferences; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java index 946e2934e8..0b03302e23 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/SystemProfileUtil.java @@ -14,12 +14,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.mms.MediaConstraints; import org.thoughtcrime.securesms.util.BitmapDecodingException; import org.thoughtcrime.securesms.util.BitmapUtil; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; public class SystemProfileUtil { diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java index fddf6c0cb8..9020887e9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java @@ -20,6 +20,7 @@ import androidx.navigation.Navigation; import com.airbnb.lottie.SimpleColorFilter; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.signal.core.util.EditTextUtil; @@ -36,7 +37,6 @@ import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.mediasend.Media; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.profiles.edit.pnp.WhoCanFindMeByPhoneNumberFragment; import org.thoughtcrime.securesms.profiles.manage.EditProfileNameFragment; import org.thoughtcrime.securesms.providers.BlobProvider; @@ -130,7 +130,7 @@ private void handleMediaFromResult(@NonNull Media media) { if (avatarBytes != null) { viewModel.setAvatarMedia(media); viewModel.setAvatar(avatarBytes); - GlideApp.with(CreateProfileFragment.this) + Glide.with(CreateProfileFragment.this) .load(avatarBytes) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) @@ -252,11 +252,11 @@ private void initializeProfileName() { private void initializeProfileAvatar() { viewModel.avatar().observe(getViewLifecycleOwner(), bytes -> { if (bytes == null) { - GlideApp.with(this).clear(binding.avatar); + Glide.with(this).clear(binding.avatar); return; } - GlideApp.with(this) + Glide.with(this) .load(bytes) .circleCrop() .into(binding.avatar); @@ -288,9 +288,11 @@ private static void updateFieldIfNeeded(@NonNull EditText field, @NonNull String private void presentWhoCanFindMeDescription(PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode phoneNumberListingMode) { switch (phoneNumberListingMode) { case DISCOVERABLE: + binding.whoCanFindMeIcon.setImageResource(R.drawable.symbol_group_24); binding.whoCanFindMeDescription.setText(R.string.PhoneNumberPrivacy_everyone); break; case NOT_DISCOVERABLE: + binding.whoCanFindMeIcon.setImageResource(R.drawable.symbol_lock_24); binding.whoCanFindMeDescription.setText(R.string.PhoneNumberPrivacy_nobody); break; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java index b76341a361..6a135fa45b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java @@ -8,6 +8,8 @@ import androidx.core.util.Consumer; import org.signal.core.util.StreamUtil; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.conversation.colors.AvatarColor; import org.thoughtcrime.securesms.database.SignalDatabase; @@ -23,8 +25,6 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.registration.RegistrationUtil; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.signal.core.util.concurrent.SimpleTask; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt index fd1ec71992..222c681f74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt @@ -70,8 +70,8 @@ class WhoCanFindMeByPhoneNumberFragment : DSLSettingsFragment( textPref( title = DSLSettingsText.from( when (state) { - WhoCanFindMeByPhoneNumberState.EVERYONE -> R.string.WhoCanSeeMyPhoneNumberFragment__anyone_who_has - WhoCanFindMeByPhoneNumberState.NOBODY -> R.string.WhoCanSeeMyPhoneNumberFragment__nobody_on_signal + WhoCanFindMeByPhoneNumberState.EVERYONE -> R.string.WhoCanSeeMyPhoneNumberFragment__anyone_who_has_your + WhoCanFindMeByPhoneNumberState.NOBODY -> R.string.WhoCanSeeMyPhoneNumberFragment__nobody_will_be_able }, DSLSettingsText.TextAppearanceModifier(R.style.Signal_Text_BodyMedium), DSLSettingsText.ColorModifier(ContextCompat.getColor(requireContext(), R.color.signal_colorOnSurfaceVariant)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileActivity.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileActivity.java index 9eb3ef2bd4..59a3da55b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileActivity.java @@ -13,7 +13,6 @@ import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.reactions.any.ReactWithAnyEmojiBottomSheetDialogFragment; import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -64,13 +63,8 @@ public void onCreate(Bundle bundle, boolean ready) { navController.setGraph(graph, extras != null ? extras : new Bundle()); if (extras != null && extras.getBoolean(START_AT_USERNAME, false)) { - if (SignalStore.uiHints().hasSeenUsernameEducation()) { - NavDirections action = EditProfileFragmentDirections.actionManageUsername(); - SafeNavigation.safeNavigate(navController, action); - } else { - NavDirections action = EditProfileFragmentDirections.actionManageProfileFragmentToUsernameEducationFragment(); - SafeNavigation.safeNavigate(navController, action); - } + NavDirections action = EditProfileFragmentDirections.actionManageUsername(); + SafeNavigation.safeNavigate(navController, action); } if (extras != null && extras.getBoolean(START_AT_AVATAR, false)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt index ef32deca91..d4721bfb7a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt @@ -41,7 +41,6 @@ import org.thoughtcrime.securesms.util.NameUtil.getAbbreviation import org.thoughtcrime.securesms.util.livedata.LiveDataUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate import org.thoughtcrime.securesms.util.views.SimpleProgressDialog -import org.thoughtcrime.securesms.util.visible import java.util.Arrays import java.util.Optional @@ -80,22 +79,18 @@ class EditProfileFragment : LoggingFragment() { binding.manageProfileNameContainer.setOnClickListener { v: View -> findNavController(v).safeNavigate(EditProfileFragmentDirections.actionManageProfileName()) } binding.manageProfileUsernameContainer.setOnClickListener { v: View -> - if (SignalStore.uiHints().hasSeenUsernameEducation() || SignalStore.account().username != null) { - if (SignalStore.account().username != null) { - MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Signal_MaterialAlertDialog_List) - .setItems(R.array.username_edit_entries) { _: DialogInterface?, w: Int -> - when (w) { - 0 -> findNavController(v).safeNavigate(EditProfileFragmentDirections.actionManageUsername()) - 1 -> displayConfirmUsernameDeletionDialog() - else -> throw IllegalStateException() - } + if (SignalStore.account().username != null) { + MaterialAlertDialogBuilder(requireContext(), R.style.ThemeOverlay_Signal_MaterialAlertDialog_List) + .setItems(R.array.username_edit_entries) { _: DialogInterface?, w: Int -> + when (w) { + 0 -> findNavController(v).safeNavigate(EditProfileFragmentDirections.actionManageUsername()) + 1 -> displayConfirmUsernameDeletionDialog() + else -> throw IllegalStateException() } - .show() - } else { - findNavController(v).safeNavigate(EditProfileFragmentDirections.actionManageUsername()) - } + } + .show() } else { - findNavController(v).safeNavigate(EditProfileFragmentDirections.actionManageProfileFragmentToUsernameEducationFragment()) + findNavController(v).safeNavigate(EditProfileFragmentDirections.actionManageUsername()) } } @@ -315,6 +310,7 @@ class EditProfileFragment : LoggingFragment() { Snackbar.make(requireView(), R.string.ManageProfileFragment__username_deleted, Snackbar.LENGTH_SHORT).show() binding.usernameLinkContainer.visibility = View.GONE } + UsernameDeleteResult.NETWORK_ERROR -> Snackbar.make(requireView(), R.string.ManageProfileFragment__couldnt_delete_username, Snackbar.LENGTH_SHORT).show() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java index 8e6e8b0654..0fab2e03b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java @@ -194,6 +194,8 @@ private void onUiStateChanged(@NonNull UsernameEditViewModel.State state) { case DISCRIMINATOR_HAS_INVALID_CHARACTERS, DISCRIMINATOR_NOT_AVAILABLE -> getString(R.string.UsernameEditFragment__this_username_is_not_available_try_another_number); case DISCRIMINATOR_TOO_LONG -> getString(R.string.UsernameEditFragment__invalid_username_enter_a_maximum_of_d_digits, UsernameUtil.MAX_DISCRIMINATOR_LENGTH); case DISCRIMINATOR_TOO_SHORT -> getString(R.string.UsernameEditFragment__invalid_username_enter_a_minimum_of_d_digits, UsernameUtil.MIN_DISCRIMINATOR_LENGTH); + case DISCRIMINATOR_CANNOT_BE_00 -> getString(R.string.UsernameEditFragment__this_number_cant_be_00); + case DISCRIMINATOR_CANNOT_START_WITH_00 -> getString(R.string.UsernameEditFragment__this_number_cant_start_with_00); }; int colorRes = error != null ? R.color.signal_colorError : R.color.signal_colorPrimary; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt index 88b0cabc2a..7af746d415 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt @@ -355,7 +355,9 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern DISCRIMINATOR_NOT_AVAILABLE, DISCRIMINATOR_TOO_SHORT, DISCRIMINATOR_TOO_LONG, - DISCRIMINATOR_HAS_INVALID_CHARACTERS + DISCRIMINATOR_HAS_INVALID_CHARACTERS, + DISCRIMINATOR_CANNOT_BE_00, + DISCRIMINATOR_CANNOT_START_WITH_00 } enum class ButtonState { @@ -383,6 +385,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern InvalidReason.TOO_LONG -> UsernameStatus.TOO_LONG InvalidReason.STARTS_WITH_NUMBER -> UsernameStatus.CANNOT_START_WITH_NUMBER InvalidReason.INVALID_CHARACTERS -> UsernameStatus.INVALID_CHARACTERS + InvalidReason.INVALID_NUMBER, InvalidReason.INVALID_NUMBER_PREFIX -> error("Unexpected reason $invalidReason") } } @@ -391,6 +394,8 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern InvalidReason.TOO_SHORT -> UsernameStatus.DISCRIMINATOR_TOO_SHORT InvalidReason.TOO_LONG -> UsernameStatus.DISCRIMINATOR_TOO_LONG InvalidReason.INVALID_CHARACTERS -> UsernameStatus.DISCRIMINATOR_HAS_INVALID_CHARACTERS + InvalidReason.INVALID_NUMBER -> UsernameStatus.DISCRIMINATOR_CANNOT_BE_00 + InvalidReason.INVALID_NUMBER_PREFIX -> UsernameStatus.DISCRIMINATOR_CANNOT_START_WITH_00 else -> UsernameStatus.INVALID_GENERIC } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEducationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEducationFragment.kt deleted file mode 100644 index 8b784f91ea..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEducationFragment.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.thoughtcrime.securesms.profiles.manage - -import android.os.Bundle -import android.view.View -import androidx.fragment.app.Fragment -import androidx.navigation.fragment.findNavController -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.components.ViewBinderDelegate -import org.thoughtcrime.securesms.databinding.UsernameEducationFragmentBinding -import org.thoughtcrime.securesms.dependencies.ApplicationDependencies -import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.megaphone.Megaphones -import org.thoughtcrime.securesms.util.CommunicationActions -import org.thoughtcrime.securesms.util.navigation.safeNavigate - -/** - * Displays a Username education screen which displays some basic information - * about usernames and provides a learn-more link. - */ -class UsernameEducationFragment : Fragment(R.layout.username_education_fragment) { - private val binding by ViewBinderDelegate(UsernameEducationFragmentBinding::bind) - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - binding.toolbar.setNavigationOnClickListener { - findNavController().popBackStack() - } - - binding.usernameEducationLearnMore.setOnClickListener { - CommunicationActions.openBrowserLink(requireContext(), getString(R.string.username_support_url)) - } - - binding.continueButton.setOnClickListener { - SignalStore.uiHints().markHasSeenUsernameEducation() - ApplicationDependencies.getMegaphoneRepository().markFinished(Megaphones.Event.SET_UP_YOUR_USERNAME) - findNavController().safeNavigate(UsernameEducationFragmentDirections.actionUsernameEducationFragmentToUsernameManageFragment()) - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java index a0c4d29302..d0ba563a2c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/reactions/ReactionRecipientsAdapter.java @@ -8,10 +8,11 @@ import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.badges.BadgeImageView; import org.thoughtcrime.securesms.components.AvatarImageView; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.util.AvatarUtil; import java.util.Collections; @@ -65,12 +66,12 @@ void bind(@NonNull ReactionDetails reaction) { if (reaction.getSender().isSelf()) { this.recipient.setText(R.string.ReactionsRecipientAdapter_you); - this.avatar.setAvatar(GlideApp.with(avatar), null, false); + this.avatar.setAvatar(Glide.with(avatar), null, false); this.badge.setBadge(null); AvatarUtil.loadIconIntoImageView(reaction.getSender(), avatar); } else { this.recipient.setText(reaction.getSender().getDisplayName(itemView.getContext())); - this.avatar.setAvatar(GlideApp.with(avatar), reaction.getSender(), false); + this.avatar.setAvatar(Glide.with(avatar), reaction.getSender(), false); this.badge.setBadgeFromRecipient(reaction.getSender()); } } 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 320ae3f8cb..268208b75a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java @@ -562,7 +562,7 @@ public boolean hasAUserSetDisplayName(@NonNull Context context) { String name = getNameFromLocalData(context); if (Util.isEmpty(name)) { - name = context.getString(R.string.Recipient_unknown); + name = getUnknownDisplayName(context); } return StringUtil.isolateBidi(name); @@ -576,7 +576,7 @@ public boolean hasAUserSetDisplayName(@NonNull Context context) { } if (Util.isEmpty(name)) { - name = StringUtil.isolateBidi(context.getString(R.string.Recipient_unknown)); + name = StringUtil.isolateBidi(getUnknownDisplayName(context)); } return StringUtil.isolateBidi(name); @@ -660,6 +660,14 @@ public boolean hasNonUsernameDisplayName(@NonNull Context context) { return StringUtil.isolateBidi(name); } + private String getUnknownDisplayName(@NonNull Context context) { + if (getRegistered() == RegisteredState.NOT_REGISTERED) { + return context.getString(R.string.Recipient_deleted_account); + } else { + return context.getString(R.string.Recipient_unknown); + } + } + public @NonNull Optional getServiceId() { return OptionalUtil.or(Optional.ofNullable(aci), Optional.ofNullable(pni)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index 213fdb6d5b..df02d0d02f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -273,7 +273,7 @@ public void onViewCreated(@NonNull View fragmentView, @Nullable Bundle savedInst buttonStrip.setVisibility(View.GONE); } - if (recipient.isSystemContact() || recipient.isGroup() || recipient.isSelf() || recipient.isBlocked() || recipient.isReleaseNotes() || !recipient.hasE164()) { + if (recipient.isSystemContact() || recipient.isGroup() || recipient.isSelf() || recipient.isBlocked() || recipient.isReleaseNotes() || !recipient.hasE164() || !recipient.shouldShowE164()) { addContactButton.setVisibility(View.GONE); } else { addContactButton.setVisibility(View.VISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt new file mode 100644 index 0000000000..6936570bdd --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt @@ -0,0 +1,558 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.recipients.ui.findby + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.activity.compose.setContent +import androidx.activity.result.contract.ActivityResultContract +import androidx.compose.animation.slideInHorizontally +import androidx.compose.animation.slideOutHorizontally +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Arrangement.Absolute.spacedBy +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.VisualTransformation +import androidx.compose.ui.text.intl.Locale +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.lifecycleScope +import androidx.navigation.NavType +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.dialog +import androidx.navigation.compose.rememberNavController +import androidx.navigation.navArgument +import kotlinx.coroutines.launch +import org.signal.core.ui.Buttons +import org.signal.core.ui.Dialogs +import org.signal.core.ui.Dividers +import org.signal.core.ui.Previews +import org.signal.core.ui.Scaffolds +import org.signal.core.ui.TextFields +import org.signal.core.ui.theme.SignalTheme +import org.signal.core.util.getParcelableExtraCompat +import org.thoughtcrime.securesms.PassphraseRequiredActivity +import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.invites.InviteActions +import org.thoughtcrime.securesms.phonenumbers.PhoneNumberVisualTransformation +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.recipients.RecipientId +import org.thoughtcrime.securesms.registration.util.CountryPrefix +import org.thoughtcrime.securesms.util.viewModel +import org.whispersystems.signalservice.api.util.PhoneNumberFormatter + +/** + * Allows the user to look up another Signal user by phone number or username and + * retrieve a RecipientId for that data. + */ +class FindByActivity : PassphraseRequiredActivity() { + + companion object { + private const val MODE = "FindByActivity.mode" + private const val RECIPIENT_ID = "FindByActivity.recipientId" + } + + private val viewModel: FindByViewModel by viewModel { + FindByViewModel(FindByMode.valueOf(intent.getStringExtra(MODE)!!)) + } + + override fun onCreate(savedInstanceState: Bundle?, ready: Boolean) { + setContent { + val state by viewModel.state + + val navController = rememberNavController() + + SignalTheme { + NavHost( + navController = navController, + startDestination = "find-by-content", + enterTransition = { slideInHorizontally(initialOffsetX = { it }) }, + exitTransition = { slideOutHorizontally(targetOffsetX = { -it }) }, + popEnterTransition = { slideInHorizontally(initialOffsetX = { -it }) }, + popExitTransition = { slideOutHorizontally(targetOffsetX = { it }) } + ) { + composable("find-by-content") { + val title = remember(state.mode) { + if (state.mode == FindByMode.USERNAME) R.string.FindByActivity__find_by_username else R.string.FindByActivity__find_by_phone_number + } + + Scaffolds.Settings( + title = stringResource(id = title), + onNavigationClick = { finishAfterTransition() }, + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) + ) { + val context = LocalContext.current + FindByContent( + paddingValues = it, + state = state, + onUserEntryChanged = viewModel::onUserEntryChanged, + onNextClick = { + lifecycleScope.launch { + when (val result = viewModel.onNextClicked(context)) { + is FindByResult.Success -> { + setResult(RESULT_OK, Intent().putExtra(RECIPIENT_ID, result.recipientId)) + finishAfterTransition() + } + + FindByResult.InvalidEntry -> navController.navigate("invalid-entry") + is FindByResult.NotFound -> navController.navigate("not-found/${result.recipientId.toLong()}") + } + } + }, + onSelectCountryPrefixClick = { + navController.navigate("select-country-prefix") + } + ) + } + } + + composable("select-country-prefix") { + Scaffolds.Settings( + title = stringResource(id = R.string.FindByActivity__select_country_code), + onNavigationClick = { navController.popBackStack() }, + navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) + ) { paddingValues -> + SelectCountryScreen( + paddingValues = paddingValues, + searchEntry = state.countryPrefixSearchEntry, + onSearchEntryChanged = viewModel::onCountryPrefixSearchEntryChanged, + supportedCountryPrefixes = state.supportedCountryPrefixes, + onCountryPrefixSelected = { + navController.popBackStack() + viewModel.onCountryPrefixSelected(it) + viewModel.onCountryPrefixSearchEntryChanged("") + } + ) + } + } + + dialog("invalid-entry") { + val title = if (state.mode == FindByMode.USERNAME) { + stringResource(id = R.string.FindByActivity__invalid_username) + } else { + stringResource(id = R.string.FindByActivity__invalid_phone_number) + } + + val body = if (state.mode == FindByMode.USERNAME) { + stringResource(id = R.string.FindByActivity__s_is_not_a_valid_username, state.userEntry) + } else { + val formattedNumber = remember(state.userEntry) { + val cleansed = state.userEntry.removePrefix(state.selectedCountryPrefix.digits.toString()) + PhoneNumberFormatter.formatE164(state.selectedCountryPrefix.digits.toString(), cleansed) + } + stringResource(id = R.string.FindByActivity__s_is_not_a_valid_phone_number, formattedNumber) + } + + Dialogs.SimpleAlertDialog( + title = title, + body = body, + confirm = stringResource(id = android.R.string.ok), + onConfirm = {}, + onDismiss = { navController.popBackStack() } + ) + } + + dialog( + route = "not-found/{recipientId}", + arguments = listOf(navArgument("recipientId") { type = NavType.LongType }) + ) { navBackStackEntry -> + val title = if (state.mode == FindByMode.USERNAME) { + stringResource(id = R.string.FindByActivity__username_not_found) + } else { + stringResource(id = R.string.FindByActivity__invite_to_signal) + } + + val body = if (state.mode == FindByMode.USERNAME) { + stringResource(id = R.string.FindByActivity__s_is_not_a_signal_user, state.userEntry) + } else { + val formattedNumber = remember(state.userEntry) { + val cleansed = state.userEntry.removePrefix(state.selectedCountryPrefix.digits.toString()) + PhoneNumberFormatter.formatE164(state.selectedCountryPrefix.digits.toString(), cleansed) + } + stringResource(id = R.string.FindByActivity__s_is_not_a_signal_user_would, formattedNumber) + } + + val confirm = if (state.mode == FindByMode.USERNAME) { + stringResource(id = android.R.string.ok) + } else { + stringResource(id = R.string.FindByActivity__invite) + } + + val dismiss = if (state.mode == FindByMode.USERNAME) { + Dialogs.NoDismiss + } else { + stringResource(id = android.R.string.cancel) + } + + val context = LocalContext.current + Dialogs.SimpleAlertDialog( + title = title, + body = body, + confirm = confirm, + dismiss = dismiss, + onConfirm = { + if (state.mode == FindByMode.PHONE_NUMBER) { + val recipientId = navBackStackEntry.arguments?.getLong("recipientId")?.takeIf { it > 0 }?.let { RecipientId.from(it) } ?: RecipientId.UNKNOWN + if (recipientId != RecipientId.UNKNOWN) { + InviteActions.inviteUserToSignal( + context, + Recipient.resolved(recipientId), + null, + this@FindByActivity::startActivity + ) + } + } + }, + onDismiss = { navController.popBackStack() } + ) + } + } + } + } + } + + class Contract : ActivityResultContract() { + override fun createIntent(context: Context, input: FindByMode): Intent { + return Intent(context, FindByActivity::class.java) + .putExtra(MODE, input.name) + } + + override fun parseResult(resultCode: Int, intent: Intent?): RecipientId? { + return intent?.getParcelableExtraCompat(RECIPIENT_ID, RecipientId::class.java) + } + } +} + +@Preview +@Composable +private fun FindByContentPreview() { + Previews.Preview { + FindByContent( + paddingValues = PaddingValues(0.dp), + state = FindByState( + mode = FindByMode.PHONE_NUMBER, + userEntry = "" + ), + onUserEntryChanged = {}, + onNextClick = {}, + onSelectCountryPrefixClick = {} + ) + } +} + +@Composable +private fun FindByContent( + paddingValues: PaddingValues, + state: FindByState, + onUserEntryChanged: (String) -> Unit, + onNextClick: () -> Unit, + onSelectCountryPrefixClick: () -> Unit +) { + val placeholderLabel = remember(state.mode) { + if (state.mode == FindByMode.PHONE_NUMBER) R.string.FindByActivity__phone_number else R.string.FindByActivity__username + } + + val focusRequester = remember { + FocusRequester() + } + + val keyboardType = remember(state.mode) { + if (state.mode == FindByMode.PHONE_NUMBER) { + KeyboardType.Phone + } else { + KeyboardType.Text + } + } + + Column( + modifier = Modifier + .padding(paddingValues) + .fillMaxSize() + ) { + val onNextAction = remember(state.isLookupInProgress) { + KeyboardActions(onNext = { + if (!state.isLookupInProgress) { + onNextClick() + } + }) + } + + val visualTransformation = if (state.mode == FindByMode.USERNAME) { + VisualTransformation.None + } else { + remember(state.selectedCountryPrefix) { + PhoneNumberVisualTransformation(state.selectedCountryPrefix.regionCode) + } + } + + TextFields.TextField( + enabled = !state.isLookupInProgress, + value = state.userEntry, + onValueChange = onUserEntryChanged, + singleLine = true, + placeholder = { Text(text = stringResource(id = placeholderLabel)) }, + prefix = if (state.mode == FindByMode.USERNAME) { + null + } else { + { + PhoneNumberEntryPrefix( + enabled = !state.isLookupInProgress, + selectedCountryPrefix = state.selectedCountryPrefix, + onSelectCountryPrefixClick = onSelectCountryPrefixClick + ) + } + }, + visualTransformation = visualTransformation, + keyboardOptions = KeyboardOptions( + keyboardType = keyboardType, + imeAction = ImeAction.Next + ), + shape = RoundedCornerShape(32.dp), + colors = TextFieldDefaults.colors( + unfocusedIndicatorColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Transparent, + cursorColor = MaterialTheme.colorScheme.onSurface + ), + keyboardActions = onNextAction, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 10.dp) + .focusRequester(focusRequester) + .heightIn(min = 44.dp), + contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(top = 10.dp, bottom = 10.dp) + ) + + if (state.mode == FindByMode.USERNAME) { + Text( + text = stringResource(id = R.string.FindByActivity__enter_a_full_username), + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + .padding(top = 8.dp) + ) + } + + Spacer(modifier = Modifier.weight(1f)) + + Box( + contentAlignment = Alignment.BottomEnd, + modifier = Modifier.fillMaxWidth() + ) { + Buttons.LargeTonal( + enabled = !state.isLookupInProgress, + onClick = onNextClick, + contentPadding = PaddingValues(0.dp), + modifier = Modifier + .padding(16.dp) + .size(48.dp) + ) { + Icon( + painter = painterResource(id = R.drawable.symbol_arrow_right_24), + contentDescription = stringResource(id = R.string.FindByActivity__next) + ) + } + } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } + } +} + +@Composable +private fun PhoneNumberEntryPrefix( + enabled: Boolean, + selectedCountryPrefix: CountryPrefix, + onSelectCountryPrefixClick: () -> Unit +) { + Row( + modifier = Modifier.padding(end = 16.dp) + ) { + Row( + modifier = Modifier.clickable(onClick = onSelectCountryPrefixClick, enabled = enabled) + ) { + Text( + text = selectedCountryPrefix.toString() + ) + Icon( + painter = painterResource(id = R.drawable.symbol_dropdown_triangle_24), + contentDescription = null, + tint = MaterialTheme.colorScheme.onSurfaceVariant + ) + } + Dividers.Vertical( + thickness = 1.dp, + color = MaterialTheme.colorScheme.outline, + modifier = Modifier + .padding(vertical = 2.dp) + .padding(start = 8.dp) + .height(20.dp) + ) + } +} + +@Preview +@Composable +private fun SelectCountryScreenPreview() { + Previews.Preview { + SelectCountryScreen( + paddingValues = PaddingValues(0.dp), + searchEntry = "", + onSearchEntryChanged = {}, + supportedCountryPrefixes = FindByState(mode = FindByMode.PHONE_NUMBER).supportedCountryPrefixes, + onCountryPrefixSelected = {} + ) + } +} + +@Composable +private fun SelectCountryScreen( + paddingValues: PaddingValues, + searchEntry: String, + onSearchEntryChanged: (String) -> Unit, + onCountryPrefixSelected: (CountryPrefix) -> Unit, + supportedCountryPrefixes: List +) { + val focusRequester = remember { + FocusRequester() + } + + Column( + modifier = Modifier.padding(paddingValues) + ) { + TextFields.TextField( + value = searchEntry, + onValueChange = onSearchEntryChanged, + placeholder = { Text(text = stringResource(id = R.string.FindByActivity__search)) }, + shape = RoundedCornerShape(32.dp), + colors = TextFieldDefaults.colors( + unfocusedIndicatorColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + disabledIndicatorColor = Color.Transparent, + errorIndicatorColor = Color.Transparent, + cursorColor = MaterialTheme.colorScheme.onSurface + ), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp, vertical = 10.dp) + .focusRequester(focusRequester) + .heightIn(min = 44.dp), + contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(top = 10.dp, bottom = 10.dp) + ) + + LazyColumn { + items( + items = supportedCountryPrefixes + ) { + CountryPrefixRowItem( + searchTerm = searchEntry, + countryPrefix = it, + onClick = { onCountryPrefixSelected(it) } + ) + } + } + } + + LaunchedEffect(Unit) { + focusRequester.requestFocus() + } +} + +@Composable +private fun CountryPrefixRowItem( + searchTerm: String, + countryPrefix: CountryPrefix, + onClick: () -> Unit +) { + val regionDisplayName = remember(countryPrefix.regionCode, Locale.current) { + PhoneNumberFormatter.getRegionDisplayName(countryPrefix.regionCode).orElse(countryPrefix.regionCode) + } + + if (searchTerm.isNotBlank() && !regionDisplayName.contains(searchTerm, ignoreCase = true)) { + return + } + + val highlightedName: AnnotatedString = remember(regionDisplayName, searchTerm) { + if (searchTerm.isBlank()) { + AnnotatedString(regionDisplayName) + } else { + buildAnnotatedString { + append(regionDisplayName) + + val startIndex = regionDisplayName.indexOf(searchTerm, ignoreCase = true) + + addStyle( + style = SpanStyle( + fontWeight = FontWeight.Bold + ), + start = startIndex, + end = startIndex + searchTerm.length + ) + } + } + } + + Column( + verticalArrangement = spacedBy((-2).dp), + modifier = Modifier + .fillMaxWidth() + .clickable(onClick = onClick) + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + .padding(top = 16.dp, bottom = 14.dp) + ) { + Text( + text = highlightedName + ) + + Text( + text = countryPrefix.toString(), + color = MaterialTheme.colorScheme.onSurfaceVariant, + style = MaterialTheme.typography.bodyMedium + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByMode.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByMode.kt new file mode 100644 index 0000000000..bac2e138ae --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByMode.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.recipients.ui.findby + +enum class FindByMode { + PHONE_NUMBER, + USERNAME +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByResult.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByResult.kt new file mode 100644 index 0000000000..f845a54629 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByResult.kt @@ -0,0 +1,14 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.recipients.ui.findby + +import org.thoughtcrime.securesms.recipients.RecipientId + +sealed interface FindByResult { + data class Success(val recipientId: RecipientId) : FindByResult + object InvalidEntry : FindByResult + data class NotFound(val recipientId: RecipientId = RecipientId.UNKNOWN) : FindByResult +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByState.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByState.kt new file mode 100644 index 0000000000..de79b9f213 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByState.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.recipients.ui.findby + +import com.google.i18n.phonenumbers.PhoneNumberUtil +import org.thoughtcrime.securesms.registration.util.CountryPrefix + +data class FindByState( + val mode: FindByMode, + val userEntry: String = "", + val supportedCountryPrefixes: List = PhoneNumberUtil.getInstance().supportedCallingCodes + .map { CountryPrefix(it, PhoneNumberUtil.getInstance().getRegionCodeForCountryCode(it)) } + .sortedBy { it.digits.toString() }, + val selectedCountryPrefix: CountryPrefix = supportedCountryPrefixes.first(), + val countryPrefixSearchEntry: String = "", + val isLookupInProgress: Boolean = false +) diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt new file mode 100644 index 0000000000..8ed177d703 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt @@ -0,0 +1,118 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.recipients.ui.findby + +import android.content.Context +import androidx.annotation.WorkerThread +import androidx.compose.runtime.State +import androidx.compose.runtime.mutableStateOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async +import org.signal.core.util.concurrent.safeBlockingGet +import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery +import org.thoughtcrime.securesms.phonenumbers.NumberUtil +import org.thoughtcrime.securesms.profiles.manage.UsernameRepository +import org.thoughtcrime.securesms.recipients.Recipient +import org.thoughtcrime.securesms.registration.util.CountryPrefix +import org.thoughtcrime.securesms.util.UsernameUtil +import java.util.concurrent.TimeUnit + +class FindByViewModel( + mode: FindByMode +) : ViewModel() { + + private val internalState = mutableStateOf( + FindByState( + mode = mode + ) + ) + + val state: State = internalState + + fun onUserEntryChanged(userEntry: String) { + val cleansed = if (state.value.mode == FindByMode.PHONE_NUMBER) { + userEntry.filter { it.isDigit() } + } else { + userEntry + } + + internalState.value = state.value.copy(userEntry = cleansed) + } + + fun onCountryPrefixSearchEntryChanged(searchEntry: String) { + internalState.value = state.value.copy(countryPrefixSearchEntry = searchEntry) + } + + fun onCountryPrefixSelected(countryPrefix: CountryPrefix) { + internalState.value = state.value.copy(selectedCountryPrefix = countryPrefix) + } + + suspend fun onNextClicked(context: Context): FindByResult { + internalState.value = state.value.copy(isLookupInProgress = true) + val findByResult = viewModelScope.async(context = Dispatchers.IO) { + if (state.value.mode == FindByMode.USERNAME) { + performUsernameLookup() + } else { + performPhoneLookup(context) + } + }.await() + + internalState.value = state.value.copy(isLookupInProgress = false) + return findByResult + } + + @WorkerThread + private fun performUsernameLookup(): FindByResult { + val username = state.value.userEntry + + if (!UsernameUtil.isValidUsernameForSearch(username)) { + return FindByResult.InvalidEntry + } + + return when (val result = UsernameRepository.fetchAciForUsername(username = username).safeBlockingGet()) { + UsernameRepository.UsernameAciFetchResult.NetworkError -> FindByResult.NotFound() + UsernameRepository.UsernameAciFetchResult.NotFound -> FindByResult.NotFound() + is UsernameRepository.UsernameAciFetchResult.Success -> FindByResult.Success(Recipient.externalUsername(result.aci, username).id) + } + } + + @WorkerThread + private fun performPhoneLookup(context: Context): FindByResult { + val stateSnapshot = state.value + val countryCode = stateSnapshot.selectedCountryPrefix.digits + val nationalNumber = stateSnapshot.userEntry.removePrefix(countryCode.toString()) + + val e164 = "$countryCode$nationalNumber" + + if (!NumberUtil.isVisuallyValidNumber(e164)) { + return FindByResult.InvalidEntry + } + + val recipient = try { + Recipient.external(context, e164) + } catch (e: Exception) { + return FindByResult.InvalidEntry + } + + return if (!recipient.isRegistered || !recipient.hasServiceId()) { + try { + ContactDiscovery.refresh(context, recipient, false, TimeUnit.SECONDS.toMillis(10)) + val resolved = Recipient.resolved(recipient.id) + if (!resolved.isRegistered) { + FindByResult.NotFound(recipient.id) + } else { + FindByResult.Success(recipient.id) + } + } catch (e: Exception) { + FindByResult.NotFound(recipient.id) + } + } else { + FindByResult.Success(recipient.id) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java index c89d001c37..62dc03cd1f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/revealable/ViewOnceMessageActivity.java @@ -16,11 +16,12 @@ import androidx.appcompat.app.AppCompatDelegate; import androidx.lifecycle.ViewModelProvider; +import com.bumptech.glide.Glide; + import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.PartAuthority; import org.thoughtcrime.securesms.mms.VideoSlide; import org.thoughtcrime.securesms.providers.BlobProvider; @@ -141,7 +142,7 @@ private void displayImage(@NonNull Uri uri) { image.setVisibility(View.VISIBLE); duration.setVisibility(View.GONE); - GlideApp.with(this) + Glide.with(this) .load(new DecryptableUri(uri)) .fitCenter() .into(image); diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java index b93f9a44f2..e7664e9620 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/UriGlideRenderer.java @@ -19,6 +19,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; @@ -31,8 +33,6 @@ import org.signal.imageeditor.core.model.EditorElement; import org.signal.imageeditor.core.model.EditorModel; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideApp; -import org.thoughtcrime.securesms.mms.GlideRequest; import org.thoughtcrime.securesms.util.BitmapUtil; import java.util.concurrent.ExecutionException; @@ -94,13 +94,13 @@ public void render(@NonNull RendererContext rendererContext) { if (getBitmap() == null) { if (rendererContext.isBlockingLoad()) { try { - Bitmap bitmap = getBitmapGlideRequest(rendererContext.context, false).submit().get(); + Bitmap bitmap = getGlideRequestBuilder(rendererContext.context, false).submit().get(); setBitmap(rendererContext, bitmap); } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } } else { - getBitmapGlideRequest(rendererContext.context, true).into(new CustomTarget() { + getGlideRequestBuilder(rendererContext.context, true).into(new CustomTarget() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { setBitmap(rendererContext, resource); @@ -181,7 +181,7 @@ private void renderBlurOverlay(RendererContext rendererContext) { } } - private GlideRequest getBitmapGlideRequest(@NonNull Context context, boolean preview) { + private RequestBuilder getGlideRequestBuilder(@NonNull Context context, boolean preview) { int width = this.maxWidth; int height = this.maxHeight; @@ -190,7 +190,7 @@ private GlideRequest getBitmapGlideRequest(@NonNull Context context, boo height = Math.min(height, PREVIEW_DIMENSION_LIMIT); } - return GlideApp.with(context) + return Glide.with(context) .asBitmap() .override(width, height) .centerInside() diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java b/app/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java index a0d52db376..6b0de0c812 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/KeyCachingService.java @@ -245,7 +245,7 @@ private void foregroundService() { builder.setCategory(NotificationCompat.CATEGORY_STATUS); builder.setOngoing(true); - builder.addAction(R.drawable.ic_menu_lock_dark, getString(R.string.KeyCachingService_lock), buildLockIntent()); + builder.addAction(R.drawable.symbol_lock_24, getString(R.string.KeyCachingService_lock), buildLockIntent()); builder.setContentIntent(buildLaunchIntent()); stopForeground(true); diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt index de3b610a4f..7e7eecfbdf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/ActiveCallManager.kt @@ -11,11 +11,17 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.net.ConnectivityManager +import android.os.Build import android.telephony.PhoneStateListener import android.telephony.TelephonyManager import androidx.annotation.MainThread import androidx.core.app.NotificationManagerCompat import androidx.core.os.bundleOf +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.kotlin.subscribeBy +import io.reactivex.rxjava3.schedulers.Schedulers import org.signal.core.util.ThreadUtil import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.dependencies.ApplicationDependencies @@ -190,6 +196,7 @@ class ActiveCallManager( private var hangUpRtcOnDeviceCallAnswered: PhoneStateListener? = null private var notification: Notification? = null + private var notificationDisposable: Disposable = Disposable.disposed() override fun onCreate() { super.onCreate() @@ -205,6 +212,8 @@ class ActiveCallManager( } override fun onDestroy() { + notificationDisposable.dispose() + super.onDestroy() if (!AndroidTelecomUtil.telecomSupported) { @@ -219,18 +228,35 @@ class ActiveCallManager( return CallNotificationBuilder.getStoppingNotification(this) } - val recipientId: RecipientId = intent.getParcelableExtra(EXTRA_RECIPIENT_ID)!! + val recipient: Recipient = Recipient.resolved(intent.getParcelableExtra(EXTRA_RECIPIENT_ID)!!) val isVideoCall = intent.getBooleanExtra(EXTRA_IS_VIDEO_CALL, false) + val requiresAsyncNotificationLoad = Build.VERSION.SDK_INT <= 29 + + notification = createNotification(recipient, isVideoCall, skipAvatarLoad = requiresAsyncNotificationLoad) + + if (requiresAsyncNotificationLoad) { + notificationDisposable = Single.fromCallable { createNotification(recipient, isVideoCall, skipAvatarLoad = false) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy { + notification = it + if (NotificationManagerCompat.from(this).activeNotifications.any { n -> n.id == notificationId }) { + NotificationManagerCompat.from(application).notify(notificationId, notification!!) + } + } + } - notification = CallNotificationBuilder.getCallInProgressNotification( + return notification!! + } + + private fun createNotification(recipient: Recipient, isVideoCall: Boolean, skipAvatarLoad: Boolean): Notification { + return CallNotificationBuilder.getCallInProgressNotification( this, CallNotificationBuilder.TYPE_ESTABLISHED, - Recipient.resolved(recipientId), + recipient, isVideoCall, - false + skipAvatarLoad ) - - return notification!! } @Suppress("deprecation") diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java index 2b68b3e737..4da9b9dafb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/MultiShareSender.java @@ -344,7 +344,8 @@ private static List buildLinkPreviews(@NonNull Context context, @Nu private static Slide ensureDefaultQuality(@NonNull Context context, @NonNull ImageSlide imageSlide) { Attachment attachment = imageSlide.asAttachment(); - if (attachment.transformProperties.sentMediaQuality == SentMediaQuality.HIGH.getCode()) { + final AttachmentTable.TransformProperties transformProperties = attachment.transformProperties; + if (transformProperties != null && transformProperties.sentMediaQuality == SentMediaQuality.HIGH.getCode()) { return new ImageSlide( context, attachment.getUri(), diff --git a/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java b/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java index 974e893644..e3579a4dd9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/sharing/interstitial/ShareInterstitialActivity.java @@ -11,6 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.annimon.stream.Stream; +import com.bumptech.glide.Glide; import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; @@ -18,7 +19,6 @@ import org.thoughtcrime.securesms.components.SelectionAwareEmojiEditText; import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository; import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.sharing.MultiShareArgs; import org.thoughtcrime.securesms.sharing.MultiShareDialogs; @@ -156,7 +156,7 @@ private void initializeObservers() { preview.setLoading(); viewModel.onLinkPreviewChanged(null); } else if (linkPreviewState.linkPreview.isPresent()) { - preview.setLinkPreview(GlideApp.with(this), linkPreviewState.linkPreview.get(), true); + preview.setLinkPreview(Glide.with(this), linkPreviewState.linkPreview.get(), true); viewModel.onLinkPreviewChanged(linkPreviewState.linkPreview.get()); } else if (!linkPreviewState.hasLinks()) { preview.setVisibility(View.GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java index 593fa5630e..21c70f8826 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementActivity.java @@ -11,11 +11,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; + import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragment; import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.sharing.MultiShareArgs; import org.thoughtcrime.securesms.util.DeviceProperties; import org.thoughtcrime.securesms.util.DynamicTheme; @@ -110,7 +111,7 @@ public void onStickerPackShareClicked(@NonNull String packId, @NonNull String pa private void initView() { this.list = findViewById(R.id.sticker_management_list); - this.adapter = new StickerManagementAdapter(GlideApp.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(this)); + this.adapter = new StickerManagementAdapter(Glide.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(this)); list.setLayoutManager(new LinearLayoutManager(this)); list.setAdapter(adapter); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java index f0b3aff133..aff3a7a457 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerManagementAdapter.java @@ -17,6 +17,7 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import org.thoughtcrime.securesms.R; @@ -24,7 +25,8 @@ import org.thoughtcrime.securesms.database.model.StickerPackRecord; import org.thoughtcrime.securesms.glide.cache.ApngOptions; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; -import org.thoughtcrime.securesms.mms.GlideRequests; +import org.thoughtcrime.securesms.util.DrawableUtil; +import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.adapter.SectionedRecyclerViewAdapter; import org.thoughtcrime.securesms.util.adapter.StableIdGenerator; @@ -38,7 +40,7 @@ final class StickerManagementAdapter extends SectionedRecyclerViewAdapter idGenerator, int global void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int localPosition, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull EventListener eventListener, boolean allowApngAnimation) { @@ -210,7 +212,7 @@ void bindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, } else if (records.isEmpty()) { ((EmptyViewHolder) viewHolder).bind(emptyResId); } else { - ((StickerViewHolder) viewHolder).bind(glideRequests, eventListener, records.get(localPosition - 1), localPosition == records.size(), allowApngAnimation); + ((StickerViewHolder) viewHolder).bind(requestManager, eventListener, records.get(localPosition - 1), localPosition == records.size(), allowApngAnimation); } } @@ -256,7 +258,7 @@ static class StickerViewHolder extends RecyclerView.ViewHolder { this.blessedBadge = buildBlessedBadge(itemView.getContext()); } - void bind(@NonNull GlideRequests glideRequests, + void bind(@NonNull RequestManager requestManager, @NonNull EventListener eventListener, @NonNull StickerPackRecord stickerPack, boolean lastInList, @@ -271,7 +273,7 @@ void bind(@NonNull GlideRequests glideRequests, author.setText(stickerPack.getAuthor().orElse(itemView.getResources().getString(R.string.StickerManagementAdapter_unknown))); divider.setVisibility(lastInList ? View.GONE : View.VISIBLE); - glideRequests.load(new DecryptableUri(stickerPack.getCover().getUri())) + requestManager.load(new DecryptableUri(stickerPack.getCover().getUri())) .transition(DrawableTransitionOptions.withCrossFade()) .fitCenter() .set(ApngOptions.ANIMATE, allowApngAnimation) @@ -304,10 +306,10 @@ void recycle() { private static @NonNull CharSequence buildBlessedBadge(@NonNull Context context) { SpannableString badgeSpan = new SpannableString(" "); - Drawable badge = ContextCompat.getDrawable(context, R.drawable.ic_check_circle_white_18dp); + Drawable badge = ContextCompat.getDrawable(context, R.drawable.symbol_check_circle_fill_24); - badge.setBounds(0, 0, badge.getIntrinsicWidth(), badge.getIntrinsicHeight()); - badge.setColorFilter(ContextCompat.getColor(context, R.color.core_ultramarine), PorterDuff.Mode.MULTIPLY); + badge.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); + DrawableUtil.tint(badge, ContextCompat.getColor(context, R.color.core_ultramarine)); badgeSpan.setSpan(new ImageSpan(badge), 1, badgeSpan.length(), 0); return badgeSpan; diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java index 4948d040b4..eb0c348828 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewActivity.java @@ -16,6 +16,7 @@ import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import org.signal.core.util.logging.Log; @@ -26,7 +27,6 @@ import org.thoughtcrime.securesms.conversation.mutiselect.forward.MultiselectForwardFragmentArgs; import org.thoughtcrime.securesms.glide.cache.ApngOptions; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.sharing.MultiShareArgs; import org.thoughtcrime.securesms.stickers.StickerManifest.Sticker; import org.thoughtcrime.securesms.util.DeviceProperties; @@ -154,9 +154,9 @@ private void initView() { this.shareButton = findViewById(R.id.sticker_install_share_button); this.shareButtonImage = findViewById(R.id.sticker_install_share_button_image); - this.adapter = new StickerPackPreviewAdapter(GlideApp.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(this)); + this.adapter = new StickerPackPreviewAdapter(Glide.with(this), this, DeviceProperties.shouldAllowApngStickerAnimation(this)); this.layoutManager = new GridLayoutManager(this, 2); - this.touchListener = new StickerRolloverTouchListener(this, GlideApp.with(this), this, this); + this.touchListener = new StickerRolloverTouchListener(this, Glide.with(this), this, this); onScreenWidthChanged(getScreenWidth()); stickerList.setLayoutManager(layoutManager); @@ -204,7 +204,7 @@ private void presentManifest(@NonNull StickerManifest manifest) { if (cover != null) { Object model = cover.getUri().isPresent() ? new DecryptableStreamUriLoader.DecryptableUri(cover.getUri().get()) : new StickerRemoteUri(cover.getPackId(), cover.getPackKey(), cover.getId()); - GlideApp.with(this).load(model) + Glide.with(this).load(model) .transition(DrawableTransitionOptions.withCrossFade()) .fitCenter() .set(ApngOptions.ANIMATE, DeviceProperties.shouldAllowApngStickerAnimation(this)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java index 684d8d8037..e2d1e5a198 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPackPreviewAdapter.java @@ -9,25 +9,25 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.glide.cache.ApngOptions; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideRequests; import java.util.ArrayList; import java.util.List; public final class StickerPackPreviewAdapter extends RecyclerView.Adapter { - private final GlideRequests glideRequests; + private final RequestManager requestManager; private final EventListener eventListener; private final List list; private final boolean allowApngAnimation; - public StickerPackPreviewAdapter(@NonNull GlideRequests glideRequests, @NonNull EventListener eventListener, boolean allowApngAnimation) { - this.glideRequests = glideRequests; + public StickerPackPreviewAdapter(@NonNull RequestManager requestManager, @NonNull EventListener eventListener, boolean allowApngAnimation) { + this.requestManager = requestManager; this.eventListener = eventListener; this.allowApngAnimation = allowApngAnimation; this.list = new ArrayList<>(); @@ -40,7 +40,7 @@ public StickerPackPreviewAdapter(@NonNull GlideRequests glideRequests, @NonNull @Override public void onBindViewHolder(@NonNull StickerViewHolder stickerViewHolder, int i) { - stickerViewHolder.bind(glideRequests, list.get(i), eventListener, allowApngAnimation); + stickerViewHolder.bind(requestManager, list.get(i), eventListener, allowApngAnimation); } @Override @@ -71,7 +71,7 @@ private StickerViewHolder(@NonNull View itemView) { this.image = itemView.findViewById(R.id.sticker_install_item_image); } - void bind(@NonNull GlideRequests glideRequests, + void bind(@NonNull RequestManager requestManager, @NonNull StickerManifest.Sticker sticker, @NonNull EventListener eventListener, boolean allowApngAnimation) @@ -79,7 +79,7 @@ void bind(@NonNull GlideRequests glideRequests, currentEmoji = sticker.getEmoji(); currentGlideModel = sticker.getUri().isPresent() ? new DecryptableStreamUriLoader.DecryptableUri(sticker.getUri().get()) : new StickerRemoteUri(sticker.getPackId(), sticker.getPackKey(), sticker.getId()); - glideRequests.load(currentGlideModel) + requestManager.load(currentGlideModel) .transition(DrawableTransitionOptions.withCrossFade()) .set(ApngOptions.ANIMATE, allowApngAnimation) .centerInside() diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java index 53999f25f1..90446ab225 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerPreviewPopup.java @@ -10,10 +10,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.mms.GlideRequests; /** @@ -21,24 +21,24 @@ */ final class StickerPreviewPopup extends PopupWindow { - private final GlideRequests glideRequests; - private final ImageView image; - private final TextView emojiText; + private final RequestManager requestManager; + private final ImageView image; + private final TextView emojiText; - StickerPreviewPopup(@NonNull Context context, @NonNull GlideRequests glideRequests) { + StickerPreviewPopup(@NonNull Context context, @NonNull RequestManager requestManager) { super(LayoutInflater.from(context).inflate(R.layout.sticker_preview_popup, null), ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); - this.glideRequests = glideRequests; - this.image = getContentView().findViewById(R.id.sticker_popup_image); - this.emojiText = getContentView().findViewById(R.id.sticker_popup_emoji); + this.requestManager = requestManager; + this.image = getContentView().findViewById(R.id.sticker_popup_image); + this.emojiText = getContentView().findViewById(R.id.sticker_popup_emoji); setTouchable(false); } void presentSticker(@NonNull Object stickerGlideModel, @Nullable String emoji) { emojiText.setText(emoji); - glideRequests.load(stickerGlideModel) + requestManager.load(stickerGlideModel) .diskCacheStrategy(DiskCacheStrategy.NONE) .fitCenter() .into(image); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java index 01cb216b75..c858a85c63 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/stickers/StickerRolloverTouchListener.java @@ -9,10 +9,11 @@ import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; +import com.bumptech.glide.RequestManager; + import org.signal.libsignal.protocol.util.Pair; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.keyboard.sticker.KeyboardStickerListAdapter; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.ViewUtil; import java.lang.ref.WeakReference; @@ -26,13 +27,13 @@ public class StickerRolloverTouchListener implements RecyclerView.OnItemTouchLis private boolean hoverMode; public StickerRolloverTouchListener(@NonNull Context context, - @NonNull GlideRequests glideRequests, + @NonNull RequestManager requestManager, @NonNull RolloverEventListener eventListener, @NonNull RolloverStickerRetriever stickerRetriever) { this.eventListener = eventListener; this.stickerRetriever = stickerRetriever; - this.popup = new StickerPreviewPopup(context, glideRequests); + this.popup = new StickerPreviewPopup(context, requestManager); this.currentView = new WeakReference<>(null); popup.setAnimationStyle(R.style.StickerPopupAnimation); diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java index 2ec2fce0b1..dd380187b0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java @@ -125,8 +125,8 @@ boolean isInvalid(@NonNull SignalAccountRecord remote) { boolean hasViewedOnboardingStory = remote.hasViewedOnboardingStory() || local.hasViewedOnboardingStory(); boolean storiesDisabled = remote.isStoriesDisabled(); boolean hasSeenGroupStoryEducation = remote.hasSeenGroupStoryEducationSheet() || local.hasSeenGroupStoryEducationSheet(); - String username = !StringUtil.isEmpty(remote.getUsername()) ? remote.getUsername() : local.getUsername(); - AccountRecord.UsernameLink usernameLink = remote.getUsernameLink() != null ? remote.getUsernameLink() : local.getUsernameLink(); + String username = remote.getUsername(); + AccountRecord.UsernameLink usernameLink = remote.getUsernameLink(); boolean matchesRemote = doParamsMatch(remote, unknownFields, givenName, familyName, avatarUrlPath, profileKey, noteToSelfArchived, noteToSelfForcedUnread, readReceipts, typingIndicators, sealedSenderIndicators, linkPreviews, phoneNumberSharingMode, unlisted, pinnedConversations, preferContactAvatars, payments, universalExpireTimer, primarySendsSms, e164, defaultReactions, subscriber, displayBadgesOnProfile, subscriptionManuallyCancelled, keepMutedChatsArchived, hasSetMyStoriesPrivacy, hasViewedOnboardingStory, storiesDisabled, storyViewReceiptsState, username, usernameLink); boolean matchesLocal = doParamsMatch(local, unknownFields, givenName, familyName, avatarUrlPath, profileKey, noteToSelfArchived, noteToSelfForcedUnread, readReceipts, typingIndicators, sealedSenderIndicators, linkPreviews, phoneNumberSharingMode, unlisted, pinnedConversations, preferContactAvatars, payments, universalExpireTimer, primarySendsSms, e164, defaultReactions, subscriber, displayBadgesOnProfile, subscriptionManuallyCancelled, keepMutedChatsArchived, hasSetMyStoriesPrivacy, hasViewedOnboardingStory, storiesDisabled, storyViewReceiptsState, username, usernameLink); diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java index b090198589..aef4c9ba01 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/ContactRecordProcessor.java @@ -56,17 +56,13 @@ public ContactRecordProcessor() { /** * For contact records specifically, we have some extra work that needs to be done before we process all of the records. * - * We have to look and see if there is an unregistered ACI-only record and another E164/PNI-only record that points to the - * same local contact row. - * - * If so, we actually want to mimic the split and turn them into two separate contact rows locally. The reasons are nuanced, - * but the TL;DR is that we want to split unregistered users into separate rows so that a user could re-register and get a - * different ACI. + * We have to find all unregistered ACI-only records and split them into two separate contact rows locally, if necessary. + * The reasons are nuanced, but the TL;DR is that we want to split unregistered users into separate rows so that a user + * could re-register and get a different ACI. */ @Override public void process(@NonNull Collection remoteRecords, @NonNull StorageKeyGenerator keyGenerator) throws IOException { List unregisteredAciOnly = new ArrayList<>(); - List pniE164Only = new ArrayList<>(); for (SignalContactRecord remoteRecord : remoteRecords) { if (isInvalid(remoteRecord)) { @@ -75,39 +71,15 @@ public void process(@NonNull Collection remoteRecords, @Non if (remoteRecord.getUnregisteredTimestamp() > 0 && remoteRecord.getAci().isPresent() && remoteRecord.getPni().isEmpty() && remoteRecord.getNumber().isEmpty()) { unregisteredAciOnly.add(remoteRecord); - } else if (remoteRecord.getAci().isEmpty()) { - pniE164Only.add(remoteRecord); - } - } - - if (unregisteredAciOnly.isEmpty() || pniE164Only.isEmpty()) { - super.process(remoteRecords, keyGenerator); - return; - } - - Log.i(TAG, "We have some unregistered ACI-only contacts as well as some PNI-only contacts. Need to do an intersection to detect any possible required splits."); - - TreeSet localMatches = new TreeSet<>(this); - - for (SignalContactRecord aciOnly : unregisteredAciOnly) { - Optional localMatch = getMatching(aciOnly, keyGenerator); - - if (localMatch.isPresent()) { - localMatches.add(localMatch.get()); } } - for (SignalContactRecord pniOnly : pniE164Only) { - Optional localMatch = getMatching(pniOnly, keyGenerator); - - if (localMatch.isPresent() && localMatches.contains(localMatch.get())) { - Log.w(TAG, "Found a situation where we need to split our local record in two in order to match the remote state."); - - SignalDatabase.recipients().splitForStorageSync(localMatch.get().getId().getRaw()); + if (unregisteredAciOnly.size() > 0) { + for (SignalContactRecord aciOnly : unregisteredAciOnly) { + SignalDatabase.recipients().splitForStorageSyncIfNecessary(aciOnly.getAci().get()); } } - super.process(remoteRecords, keyGenerator); } @@ -244,8 +216,9 @@ boolean isInvalid(@NonNull SignalContactRecord remote) { String systemGivenName = SignalStore.account().isPrimaryDevice() ? local.getSystemGivenName().orElse("") : remote.getSystemGivenName().orElse(""); String systemFamilyName = SignalStore.account().isPrimaryDevice() ? local.getSystemFamilyName().orElse("") : remote.getSystemFamilyName().orElse(""); String systemNickname = remote.getSystemNickname().orElse(""); - boolean matchesRemote = doParamsMatch(remote, unknownFields, aci, pni, e164, profileGivenName, profileFamilyName, systemGivenName, systemFamilyName, systemNickname, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden); - boolean matchesLocal = doParamsMatch(local, unknownFields, aci, pni, e164, profileGivenName, profileFamilyName, systemGivenName, systemFamilyName, systemNickname, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden); + boolean pniSignatureVerified = remote.isPniSignatureVerified() || local.isPniSignatureVerified(); + boolean matchesRemote = doParamsMatch(remote, unknownFields, aci, pni, e164, profileGivenName, profileFamilyName, systemGivenName, systemFamilyName, systemNickname, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden, pniSignatureVerified); + boolean matchesLocal = doParamsMatch(local, unknownFields, aci, pni, e164, profileGivenName, profileFamilyName, systemGivenName, systemFamilyName, systemNickname, profileKey, username, identityState, identityKey, blocked, profileSharing, archived, forcedUnread, muteUntil, hideStory, unregisteredTimestamp, hidden, pniSignatureVerified); if (matchesRemote) { return remote; @@ -272,6 +245,7 @@ boolean isInvalid(@NonNull SignalContactRecord remote) { .setHideStory(hideStory) .setUnregisteredTimestamp(unregisteredTimestamp) .setHidden(hidden) + .setPniSignatureVerified(pniSignatureVerified) .build(); } } @@ -323,7 +297,8 @@ private static boolean doParamsMatch(@NonNull SignalContactRecord contact, long muteUntil, boolean hideStory, long unregisteredTimestamp, - boolean hidden) + boolean hidden, + boolean pniSignatureVerified) { return Arrays.equals(contact.serializeUnknownFields(), unknownFields) && Objects.equals(contact.getAci().orElse(null), aci) && @@ -345,6 +320,7 @@ private static boolean doParamsMatch(@NonNull SignalContactRecord contact, contact.getMuteUntil() == muteUntil && contact.shouldHideStory() == hideStory && contact.getUnregisteredTimestamp() == unregisteredTimestamp && - contact.isHidden() == hidden; + contact.isHidden() == hidden && + contact.isPniSignatureVerified() == pniSignatureVerified; } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java index 05c3d8c97a..92377e79d2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java @@ -154,6 +154,7 @@ public static List localToRemotePinnedCo .setUnregisteredTimestamp(recipient.getSyncExtras().getUnregisteredTimestamp()) .setHidden(recipient.getHiddenState() != Recipient.HiddenState.NOT_HIDDEN) .setUsername(recipient.getUsername()) + .setPniSignatureVerified(recipient.getSyncExtras().getPniSignatureVerified()) .build(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt index 046c565a51..1ccdebc5c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryFirstTimeNavigationView.kt @@ -12,13 +12,13 @@ import android.view.View import android.widget.ImageView import androidx.constraintlayout.widget.ConstraintLayout import com.airbnb.lottie.LottieAnimationView +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.blurhash.BlurHash -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.visible @@ -57,14 +57,14 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( gotIt.setOnClickListener { callback?.onGotItClicked() - GlideApp.with(this).clear(blurHashView) + Glide.with(this).clear(blurHashView) blurHashView.setImageDrawable(null) hide() } close.setOnClickListener { callback?.onCloseClicked() - GlideApp.with(this).clear(blurHashView) + Glide.with(this).clear(blurHashView) blurHashView.setImageDrawable(null) hide() } @@ -81,7 +81,7 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( blurHashView.visible = false overlayView.visible = true overlayView.setImageDrawable(ColorDrawable(Color.argb(NO_BLUR_ALPHA, 0, 0, 0))) - GlideApp.with(this).clear(blurHashView) + Glide.with(this).clear(blurHashView) return } else { blurHashView.visible = true @@ -89,7 +89,7 @@ class StoryFirstTimeNavigationView @JvmOverloads constructor( overlayView.setImageDrawable(ColorDrawable(Color.argb(BLUR_ALPHA, 0, 0, 0))) } - GlideApp.with(this) + Glide.with(this) .load(blurHash) .addListener(object : RequestListener { override fun onLoadFailed(e: GlideException?, model: Any?, target: Target?, isFirstResource: Boolean): Boolean { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryLinkPreviewView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryLinkPreviewView.kt index aea93c29eb..bd4da75ec7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryLinkPreviewView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryLinkPreviewView.kt @@ -7,6 +7,9 @@ import android.text.TextUtils import android.util.AttributeSet import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import com.bumptech.glide.Glide +import org.signal.core.util.concurrent.ListenableFuture +import org.signal.core.util.concurrent.SettableFuture import org.signal.core.util.isAbsent import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ThumbnailView @@ -14,11 +17,8 @@ import org.thoughtcrime.securesms.databinding.StoriesTextPostLinkPreviewBinding import org.thoughtcrime.securesms.linkpreview.LinkPreview import org.thoughtcrime.securesms.linkpreview.LinkPreviewState import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.mms.ImageSlide import org.thoughtcrime.securesms.mms.Slide -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture -import org.thoughtcrime.securesms.util.concurrent.SettableFuture import org.thoughtcrime.securesms.util.views.Stub import org.thoughtcrime.securesms.util.visible import java.text.DateFormat @@ -56,7 +56,7 @@ class StoryLinkPreviewView @JvmOverloads constructor( fun setThumbnailDrawable(drawable: Drawable?, useLargeThumbnail: Boolean) { val image = getThumbnailTarget(useLargeThumbnail) - image.setImageDrawable(GlideApp.with(this), drawable) + image.setImageDrawable(Glide.with(this), drawable) } fun bind(linkPreview: LinkPreview?, hiddenVisibility: Int = View.INVISIBLE, useLargeThumbnail: Boolean, loadThumbnail: Boolean = true): ListenableFuture { @@ -120,7 +120,7 @@ class StoryLinkPreviewView @JvmOverloads constructor( if (imageSlide != null) { if (loadThumbnail) { future = image.setImageResource( - GlideApp.with(this), + Glide.with(this), imageSlide, false, false diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt index 35a50f2235..73f6c61821 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StorySlateView.kt @@ -8,12 +8,12 @@ import android.view.View import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView +import com.bumptech.glide.Glide import org.signal.core.util.getParcelableCompat import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.blurhash.BlurHash import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.visible @@ -67,11 +67,11 @@ class StorySlateView @JvmOverloads constructor( fun setBackground(blur: BlurHash?) { if (blur != null) { - GlideApp.with(background) + Glide.with(background) .load(blur) .into(background) } else { - GlideApp.with(background).clear(background) + Glide.with(background).clear(background) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt index 2cd4931174..17dcc46ba6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostModel.kt @@ -10,6 +10,7 @@ import android.view.ContextThemeWrapper import android.view.View import androidx.core.graphics.scale import androidx.core.view.drawToBitmap +import com.bumptech.glide.Glide import com.bumptech.glide.load.Key import com.bumptech.glide.load.Options import com.bumptech.glide.load.ResourceDecoder @@ -30,7 +31,6 @@ import org.thoughtcrime.securesms.fonts.TextFont import org.thoughtcrime.securesms.fonts.TextToScript import org.thoughtcrime.securesms.fonts.TypefaceCache import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.util.ParcelUtil import java.io.IOException @@ -148,7 +148,7 @@ data class StoryTextPostModel( view.layout(0, 0, view.measuredWidth, view.measuredHeight) val drawable = if (linkPreview != null && linkPreview.thumbnail.isPresent) { - GlideApp + Glide .with(view) .load(DecryptableStreamUriLoader.DecryptableUri(linkPreview.thumbnail.get().uri!!)) .centerCrop() diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt index 4e8f72042b..3732af36cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/StoryTextPostView.kt @@ -12,6 +12,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.graphics.ColorUtils import androidx.core.view.doOnNextLayout import androidx.core.view.isVisible +import org.signal.core.util.concurrent.ListenableFuture import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.ClippedCardView import org.thoughtcrime.securesms.conversation.MessageStyler @@ -25,7 +26,6 @@ import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryPostCreationState import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryScale import org.thoughtcrime.securesms.mediasend.v2.text.TextStoryTextWatcher import org.thoughtcrime.securesms.util.LongClickMovementMethod -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture import org.thoughtcrime.securesms.util.visible import java.util.Locale diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingItem.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingItem.kt index 028e5361b3..bfb820e13c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/landing/StoriesLandingItem.kt @@ -8,6 +8,7 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.core.view.ViewCompat +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener @@ -18,7 +19,6 @@ import org.thoughtcrime.securesms.avatar.view.AvatarView import org.thoughtcrime.securesms.badges.BadgeImageView import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.stories.StoryTextPostModel import org.thoughtcrime.securesms.stories.dialogs.StoryContextMenu @@ -164,14 +164,14 @@ object StoriesLandingItem { clearGlide() storyBlur.visible = blur != null if (blur != null) { - GlideApp.with(storyBlur).load(blur).into(storyBlur) + Glide.with(storyBlur).load(blur).into(storyBlur) } @Suppress("CascadeIf") if (record.storyType.isTextStory) { storyBlur.visible = false val storyTextPostModel = StoryTextPostModel.parseFrom(record) - GlideApp.with(storyPreview) + Glide.with(storyPreview) .load(storyTextPostModel) .placeholder(storyTextPostModel.getPlaceholder()) .centerCrop() @@ -179,7 +179,7 @@ object StoriesLandingItem { .into(storyPreview) } else if (thumbnail != null) { storyBlur.visible = blur != null - GlideApp.with(storyPreview) + Glide.with(storyPreview) .load(DecryptableStreamUriLoader.DecryptableUri(thumbnail)) .addListener(HideBlurAfterLoadListener()) .centerCrop() @@ -195,7 +195,7 @@ object StoriesLandingItem { @Suppress("CascadeIf") if (secondaryRecord.storyType.isTextStory) { val storyTextPostModel = StoryTextPostModel.parseFrom(secondaryRecord) - GlideApp.with(storyMulti) + Glide.with(storyMulti) .load(storyTextPostModel) .placeholder(storyTextPostModel.getPlaceholder()) .centerCrop() @@ -203,7 +203,7 @@ object StoriesLandingItem { .into(storyMulti) storyMulti.visible = true } else if (secondaryThumb != null) { - GlideApp.with(storyMulti) + Glide.with(storyMulti) .load(DecryptableStreamUriLoader.DecryptableUri(secondaryThumb)) .centerCrop() .dontAnimate() @@ -211,12 +211,12 @@ object StoriesLandingItem { storyMulti.visible = true } else { storyOutline.setBackgroundColor(Color.TRANSPARENT) - GlideApp.with(storyMulti).clear(storyMulti) + Glide.with(storyMulti).clear(storyMulti) storyMulti.visible = false } } else { storyOutline.setBackgroundColor(Color.TRANSPARENT) - GlideApp.with(storyMulti).clear(storyMulti) + Glide.with(storyMulti).clear(storyMulti) storyMulti.visible = false } @@ -303,8 +303,8 @@ object StoriesLandingItem { } private fun clearGlide() { - GlideApp.with(storyPreview).clear(storyPreview) - GlideApp.with(storyBlur).clear(storyBlur) + Glide.with(storyPreview).clear(storyPreview) + Glide.with(storyBlur).clear(storyBlur) } private inner class HideBlurAfterLoadListener : RequestListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt index 193599409f..002521b184 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/my/MyStoriesItem.kt @@ -5,6 +5,7 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.TextView +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener @@ -17,7 +18,6 @@ import org.thoughtcrime.securesms.components.settings.PreferenceModel import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.stories.StoryTextPostModel import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.DebouncedOnClickListener @@ -136,14 +136,14 @@ object MyStoriesItem { clearGlide() storyBlur.visible = blur != null if (blur != null) { - GlideApp.with(storyBlur).load(blur).into(storyBlur) + Glide.with(storyBlur).load(blur).into(storyBlur) } @Suppress("CascadeIf") if (record.storyType.isTextStory) { storyBlur.visible = false val storyTextPostModel = StoryTextPostModel.parseFrom(record) - GlideApp.with(storyPreview) + Glide.with(storyPreview) .load(storyTextPostModel) .placeholder(storyTextPostModel.getPlaceholder()) .centerCrop() @@ -151,7 +151,7 @@ object MyStoriesItem { .into(storyPreview) } else if (thumbnail != null) { storyBlur.visible = blur != null - GlideApp.with(storyPreview) + Glide.with(storyPreview) .load(DecryptableStreamUriLoader.DecryptableUri(thumbnail)) .addListener(HideBlurAfterLoadListener()) .centerCrop() @@ -207,8 +207,8 @@ object MyStoriesItem { } private fun clearGlide() { - GlideApp.with(storyPreview).clear(storyPreview) - GlideApp.with(storyBlur).clear(storyBlur) + Glide.with(storyPreview).clear(storyPreview) + Glide.with(storyBlur).clear(storyBlur) } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryCache.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryCache.kt index 062c3549a0..66b6a07c49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryCache.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryCache.kt @@ -3,13 +3,13 @@ package org.thoughtcrime.securesms.stories.viewer.page import android.graphics.drawable.Drawable import android.net.Uri import com.bumptech.glide.Priority +import com.bumptech.glide.RequestManager import com.bumptech.glide.request.target.CustomTarget import com.bumptech.glide.request.transition.Transition import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.attachments.Attachment import org.thoughtcrime.securesms.database.AttachmentTable import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideRequests import org.thoughtcrime.securesms.util.MediaUtil /** @@ -17,7 +17,7 @@ import org.thoughtcrime.securesms.util.MediaUtil * works with Images. */ class StoryCache( - private val glideRequests: GlideRequests, + private val requestManager: RequestManager, private val storySize: StoryDisplay.Size ) { @@ -43,7 +43,7 @@ class StoryCache( val newMappings: Map = prefetchableAttachments.associateWith { attachment -> val imageTarget = if (MediaUtil.isImage(attachment)) { - glideRequests + requestManager .load(DecryptableStreamUriLoader.DecryptableUri(attachment.uri!!)) .priority(Priority.HIGH) .centerInside() @@ -53,7 +53,7 @@ class StoryCache( } val blurTarget = if (attachment.blurHash != null) { - glideRequests + requestManager .load(attachment.blurHash) .priority(Priority.HIGH) .into(StoryCacheTarget(attachment.uri!!, storySize)) @@ -74,8 +74,8 @@ class StoryCache( val values = ArrayList(cache.values) values.forEach { value -> - glideRequests.clear(value.imageTarget) - value.blurTarget?.let { glideRequests.clear(it) } + requestManager.clear(value.imageTarget) + value.blurTarget?.let { requestManager.clear(it) } } cache.clear() diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index 00ed6954b4..c2080918e5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -28,6 +28,7 @@ import androidx.core.view.animation.PathInterpolatorCompat import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels +import com.bumptech.glide.Glide import com.google.android.material.button.MaterialButton import com.google.android.material.card.MaterialCardView import com.google.android.material.progressindicator.CircularProgressIndicatorSpec @@ -61,7 +62,6 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList import org.thoughtcrime.securesms.mediapreview.MediaPreviewFragment import org.thoughtcrime.securesms.mediapreview.VideoControlsDelegate -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment @@ -138,7 +138,7 @@ class StoryViewerPageFragment : storyViewStateViewModel.storyViewStateCache ), StoryCache( - GlideApp.with(requireActivity()), + Glide.with(requireActivity()), StoryDisplay.getStorySize(resources) ) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryBlurLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryBlurLoader.kt index 5c978c90e7..f3fde8c19c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryBlurLoader.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryBlurLoader.kt @@ -6,13 +6,13 @@ import android.widget.ImageView import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.blurhash.BlurHash -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.stories.viewer.page.StoryCache import org.thoughtcrime.securesms.stories.viewer.page.StoryDisplay @@ -58,7 +58,7 @@ class StoryBlurLoader( } fun clear() { - GlideApp.with(blurImage).clear(blurImage) + Glide.with(blurImage).clear(blurImage) blurImage.setImageDrawable(null) } @@ -77,7 +77,7 @@ class StoryBlurLoader( private fun loadViaGlide(blurHash: BlurHash?, storySize: StoryDisplay.Size) { if (blurHash != null) { - GlideApp.with(blurImage) + Glide.with(blurImage) .load(blurHash) .override(storySize.width, storySize.height) .addListener(object : RequestListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt index 18ffe6bca6..80136f6bb1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/post/StoryImageLoader.kt @@ -4,13 +4,13 @@ import android.graphics.drawable.Drawable import android.widget.ImageView import androidx.lifecycle.DefaultLifecycleObserver import androidx.lifecycle.LifecycleOwner +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.stories.viewer.page.StoryCache import org.thoughtcrime.securesms.stories.viewer.page.StoryDisplay @@ -70,7 +70,7 @@ class StoryImageLoader( } fun clear() { - GlideApp.with(postImage).clear(postImage) + Glide.with(postImage).clear(postImage) postImage.setImageDrawable(null) @@ -86,7 +86,7 @@ class StoryImageLoader( private fun loadViaGlide(storySize: StoryDisplay.Size) { Log.d(TAG, "Image not in cache. Loading via glide...") - GlideApp.with(postImage) + Glide.with(postImage) .load(DecryptableStreamUriLoader.DecryptableUri(imagePost.imageUri)) .override(storySize.width, storySize.height) .centerInside() diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/StoriesSharedElementCrossFaderView.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/StoriesSharedElementCrossFaderView.kt index 74a9b52f69..0a7a5b89e9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/StoriesSharedElementCrossFaderView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/StoriesSharedElementCrossFaderView.kt @@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable import android.net.Uri import android.util.AttributeSet import android.widget.ImageView +import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener @@ -17,7 +18,6 @@ import org.thoughtcrime.securesms.animation.transitions.CrossfaderTransition import org.thoughtcrime.securesms.blurhash.BlurHash import org.thoughtcrime.securesms.database.model.MmsMessageRecord import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader -import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.stories.StoryTextPostModel import kotlin.reflect.KProperty @@ -58,7 +58,7 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( latestSource = storyTextPostModel - GlideApp.with(sourceView) + Glide.with(sourceView) .load(storyTextPostModel) .addListener( OnReadyListener { @@ -70,7 +70,7 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( .centerCrop() .into(sourceView) - GlideApp.with(sourceBlurView).clear(sourceBlurView) + Glide.with(sourceBlurView).clear(sourceBlurView) isSourceBlurReady = true } @@ -81,7 +81,7 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( latestSource = uri - GlideApp.with(sourceView) + Glide.with(sourceView) .load(DecryptableStreamUriLoader.DecryptableUri(uri)) .addListener( OnReadyListener { @@ -93,10 +93,10 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( .into(sourceView) if (blur == null) { - GlideApp.with(sourceBlurView).clear(sourceBlurView) + Glide.with(sourceBlurView).clear(sourceBlurView) isSourceBlurReady = true } else { - GlideApp.with(sourceBlurView) + Glide.with(sourceBlurView) .load(blur) .addListener( OnReadyListener { @@ -128,7 +128,7 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( latestTarget = storyTextPostModel - GlideApp.with(targetView) + Glide.with(targetView) .load(storyTextPostModel) .addListener( OnReadyListener { @@ -140,7 +140,7 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( .centerCrop() .into(targetView) - GlideApp.with(targetBlurView).clear(targetBlurView) + Glide.with(targetBlurView).clear(targetBlurView) isTargetBlurReady = true } @@ -151,7 +151,7 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( latestTarget = uri - GlideApp.with(targetView) + Glide.with(targetView) .load(DecryptableStreamUriLoader.DecryptableUri(uri)) .addListener( OnReadyListener { @@ -163,10 +163,10 @@ class StoriesSharedElementCrossFaderView @JvmOverloads constructor( .into(targetView) if (blur == null) { - GlideApp.with(targetBlurView).clear(targetBlurView) + Glide.with(targetBlurView).clear(targetBlurView) isTargetBlurReady = true } else { - GlideApp.with(targetBlurView) + Glide.with(targetBlurView) .load(blur) .addListener( OnReadyListener { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyRepository.kt index cb548fcd9d..29fbf722ca 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyRepository.kt @@ -1,23 +1,20 @@ package org.thoughtcrime.securesms.stories.viewer.reply.group -import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers -import org.signal.core.util.ThreadUtil import org.signal.paging.ObservablePagedData import org.signal.paging.PagedData import org.signal.paging.PagingConfig import org.signal.paging.PagingController +import org.thoughtcrime.securesms.conversation.colors.GroupAuthorNameColorHelper import org.thoughtcrime.securesms.conversation.colors.NameColor -import org.thoughtcrime.securesms.conversation.colors.NameColors import org.thoughtcrime.securesms.database.DatabaseObserver +import org.thoughtcrime.securesms.database.NoSuchMessageException import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.database.model.MessageId import org.thoughtcrime.securesms.dependencies.ApplicationDependencies -import org.thoughtcrime.securesms.groups.GroupId -import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId class StoryGroupReplyRepository { @@ -55,18 +52,21 @@ class StoryGroupReplyRepository { } } - fun getNameColorsMap(storyId: Long, sessionMemberCache: MutableMap>): Observable> { - return Single.fromCallable { SignalDatabase.messages.getMessageRecord(storyId).fromRecipient.id } - .subscribeOn(Schedulers.io()) - .flatMapObservable { recipientId -> - Observable.create?> { emitter -> - val nameColorsMapLiveData = NameColors.getNameColorsMapLiveData(MutableLiveData(recipientId), sessionMemberCache) - val observer = Observer> { emitter.onNext(it) } - - ThreadUtil.postToMain { nameColorsMapLiveData.observeForever(observer) } - - emitter.setCancellable { ThreadUtil.postToMain { nameColorsMapLiveData.removeObserver(observer) } } - }.subscribeOn(Schedulers.io()) + fun getNameColorsMap(storyId: Long): Observable> { + return Single + .fromCallable { + try { + val messageRecord = SignalDatabase.messages.getMessageRecord(storyId) + val groupId = messageRecord.toRecipient.groupId.or { messageRecord.fromRecipient.groupId } + if (groupId.isPresent) { + GroupAuthorNameColorHelper().getColorMap(groupId.get()) + } else { + emptyMap() + } + } catch (e: NoSuchMessageException) { + emptyMap() + } } + .toObservable() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt index be7861927e..e7a51bfe50 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyViewModel.kt @@ -2,20 +2,17 @@ package org.thoughtcrime.securesms.stories.viewer.reply.group import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.plusAssign import io.reactivex.rxjava3.kotlin.subscribeBy import org.signal.paging.ProxyPagingController -import org.thoughtcrime.securesms.conversation.colors.NameColors import org.thoughtcrime.securesms.database.model.MessageId -import org.thoughtcrime.securesms.groups.GroupId -import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.rx.RxStore class StoryGroupReplyViewModel(storyId: Long, repository: StoryGroupReplyRepository) : ViewModel() { - private val sessionMemberCache: MutableMap> = NameColors.createSessionMembersCache() private val store = RxStore(StoryGroupReplyState()) private val disposables = CompositeDisposable() @@ -41,7 +38,8 @@ class StoryGroupReplyViewModel(storyId: Long, repository: StoryGroupReplyReposit } } - disposables += repository.getNameColorsMap(storyId, sessionMemberCache) + disposables += repository.getNameColorsMap(storyId) + .observeOn(AndroidSchedulers.mainThread()) .subscribeBy { nameColors -> store.update { state -> state.copy(nameColors = nameColors) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/AvatarUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/AvatarUtil.java index 71298fc0ab..75c482f737 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/AvatarUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/AvatarUtil.java @@ -14,6 +14,9 @@ import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.IconCompat; +import com.bumptech.glide.Glide; +import com.bumptech.glide.RequestBuilder; +import com.bumptech.glide.RequestManager; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; import com.bumptech.glide.load.resource.bitmap.CenterCrop; @@ -28,9 +31,6 @@ import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.GeneratedContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; -import org.thoughtcrime.securesms.mms.GlideApp; -import org.thoughtcrime.securesms.mms.GlideRequest; -import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.providers.AvatarProvider; import org.thoughtcrime.securesms.recipients.Recipient; @@ -65,7 +65,7 @@ public static void loadBlurredIconIntoImageView(@NonNull Recipient recipient, @N photo = recipient.getContactPhoto(); } - GlideApp.with(target) + Glide.with(target) .load(photo) .transform(new BlurTransformation(context, 0.25f, BlurTransformation.MAX_RADIUS), new CenterCrop()) .into(new CustomViewTarget(target) { @@ -94,7 +94,7 @@ public static void loadIconIntoImageView(@NonNull Recipient recipient, @NonNull public static void loadIconIntoImageView(@NonNull Recipient recipient, @NonNull ImageView target, int requestedSize) { Context context = target.getContext(); - requestCircle(GlideApp.with(context).asDrawable(), context, recipient, requestedSize).into(target); + requestCircle(Glide.with(context).asDrawable(), context, recipient, requestedSize).into(target); } public static Bitmap loadIconBitmapSquareNoCache(@NonNull Context context, @@ -103,7 +103,7 @@ public static Bitmap loadIconBitmapSquareNoCache(@NonNull Context context, int height) throws ExecutionException, InterruptedException { - return requestSquare(GlideApp.with(context).asBitmap(), context, recipient) + return requestSquare(Glide.with(context).asBitmap(), context, recipient) .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) .submit(width, height) @@ -129,10 +129,10 @@ public static Bitmap getBitmapForNotification(@NonNull Context context, @NonNull ThreadUtil.assertNotMainThread(); try { - AvatarTarget avatarTarget = new AvatarTarget(size); - GlideRequests glideRequests = GlideApp.with(context); + AvatarTarget avatarTarget = new AvatarTarget(size); + RequestManager requestManager = Glide.with(context); - requestCircle(glideRequests.asBitmap(), context, recipient, size).into(avatarTarget); + requestCircle(requestManager.asBitmap(), context, recipient, size).into(avatarTarget); Bitmap bitmap = avatarTarget.await(); return Objects.requireNonNullElseGet(bitmap, () -> DrawableUtil.toBitmap(getFallback(context, recipient, size), size, size)); @@ -141,19 +141,19 @@ public static Bitmap getBitmapForNotification(@NonNull Context context, @NonNull } } - private static GlideRequest requestCircle(@NonNull GlideRequest glideRequest, @NonNull Context context, @NonNull Recipient recipient, int targetSize) { - return request(glideRequest, context, recipient, targetSize, new CircleCrop()); + private static RequestBuilder requestCircle(@NonNull RequestBuilder requestBuilder, @NonNull Context context, @NonNull Recipient recipient, int targetSize) { + return request(requestBuilder, context, recipient, targetSize, new CircleCrop()); } - private static GlideRequest requestSquare(@NonNull GlideRequest glideRequest, @NonNull Context context, @NonNull Recipient recipient) { - return request(glideRequest, context, recipient, UNDEFINED_SIZE, new CenterCrop()); + private static RequestBuilder requestSquare(@NonNull RequestBuilder requestBuilder, @NonNull Context context, @NonNull Recipient recipient) { + return request(requestBuilder, context, recipient, UNDEFINED_SIZE, new CenterCrop()); } - private static GlideRequest request(@NonNull GlideRequest glideRequest, @NonNull Context context, @NonNull Recipient recipient, int targetSize, @Nullable BitmapTransformation transformation) { - return request(glideRequest, context, recipient, true, targetSize, transformation); + private static RequestBuilder request(@NonNull RequestBuilder requestBuilder, @NonNull Context context, @NonNull Recipient recipient, int targetSize, @Nullable BitmapTransformation transformation) { + return request(requestBuilder, context, recipient, true, targetSize, transformation); } - private static GlideRequest request(@NonNull GlideRequest glideRequest, @NonNull Context context, @NonNull Recipient recipient, boolean loadSelf, int targetSize, @Nullable BitmapTransformation transformation) { + private static RequestBuilder request(@NonNull RequestBuilder requestBuilder, @NonNull Context context, @NonNull Recipient recipient, boolean loadSelf, int targetSize, @Nullable BitmapTransformation transformation) { final ContactPhoto photo; if (Recipient.self().equals(recipient) && loadSelf) { @@ -163,7 +163,7 @@ private static GlideRequest request(@NonNull GlideRequest glideRequest } final int size = targetSize == -1 ? DrawableUtil.SHORTCUT_INFO_WRAPPED_SIZE : targetSize; - final GlideRequest request = glideRequest.load(photo) + final RequestBuilder request = requestBuilder.load(photo) .error(getFallback(context, recipient, size)) .diskCacheStrategy(DiskCacheStrategy.ALL) .override(size); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java index 1961ef321f..e036fb7596 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/BitmapUtil.java @@ -18,11 +18,11 @@ import androidx.annotation.WorkerThread; import androidx.exifinterface.media.ExifInterface; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import org.signal.core.util.ThreadUtil; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.MediaConstraints; import java.io.BufferedInputStream; @@ -113,7 +113,7 @@ private static ScaleResult createScaledBytes(@NonNull Context context, int attempts = 0; byte[] bytes; - Bitmap scaledBitmap = GlideApp.with(context.getApplicationContext()) + Bitmap scaledBitmap = Glide.with(context.getApplicationContext()) .asBitmap() .load(model) .skipMemoryCache(true) @@ -179,7 +179,7 @@ public static Bitmap createScaledBitmap(Context context, T model, int maxWid throws BitmapDecodingException { try { - return GlideApp.with(context.getApplicationContext()) + return Glide.with(context.getApplicationContext()) .asBitmap() .load(model) .centerInside() 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 5b27b9e65d..6788d8b02e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -84,7 +84,6 @@ public final class FeatureFlags { private static final String USE_HARDWARE_AEC_IF_OLD = "android.calling.useHardwareAecIfOlderThanApi29"; private static final String PAYMENTS_COUNTRY_BLOCKLIST = "global.payments.disabledRegions"; public static final String PHONE_NUMBER_PRIVACY = "android.pnp"; - public static final String BLOCK_SSE = "android.blockSessionSwitchoverEvents"; private static final String STORIES_AUTO_DOWNLOAD_MAXIMUM = "android.stories.autoDownloadMaximum"; private static final String TELECOM_MANUFACTURER_ALLOWLIST = "android.calling.telecomAllowList"; private static final String TELECOM_MODEL_BLOCKLIST = "android.calling.telecomModelBlockList"; @@ -118,7 +117,10 @@ public final class FeatureFlags { private static final String CALLING_REACTIONS = "android.calling.reactions"; private static final String NOTIFICATION_THUMBNAIL_BLOCKLIST = "android.notificationThumbnailProductBlocklist"; private static final String CALLING_RAISE_HAND = "android.calling.raiseHand"; - private static final String USE_ACTIVE_CALL_MANAGER = "android.calling.useActiveCallManager"; + private static final String USE_ACTIVE_CALL_MANAGER = "android.calling.useActiveCallManager.4"; + private static final String GIF_SEARCH = "global.gifSearch"; + private static final String AUDIO_REMUXING = "android.media.audioRemux.1"; + private static final String VIDEO_RECORD_1X_ZOOM = "android.media.videoCaptureDefaultZoom"; /** * We will only store remote values for flags in this set. If you want a flag to be controllable @@ -181,7 +183,6 @@ public final class FeatureFlags { USERNAMES, INSTANT_VIDEO_PLAYBACK, CRASH_PROMPT_CONFIG, - BLOCK_SSE, SEPA_DEBIT_DONATIONS, IDEAL_DONATIONS, IDEAL_ENABLED_REGIONS, @@ -190,7 +191,10 @@ public final class FeatureFlags { NOTIFICATION_THUMBNAIL_BLOCKLIST, CALLING_RAISE_HAND, PHONE_NUMBER_PRIVACY, - USE_ACTIVE_CALL_MANAGER + USE_ACTIVE_CALL_MANAGER, + GIF_SEARCH, + AUDIO_REMUXING, + VIDEO_RECORD_1X_ZOOM ); @VisibleForTesting @@ -257,11 +261,11 @@ public final class FeatureFlags { PROMPT_BATTERY_SAVER, USERNAMES, CRASH_PROMPT_CONFIG, - BLOCK_SSE, CALLING_REACTIONS, NOTIFICATION_THUMBNAIL_BLOCKLIST, CALLING_RAISE_HAND, - PHONE_NUMBER_PRIVACY + PHONE_NUMBER_PRIVACY, + VIDEO_RECORD_1X_ZOOM ); /** @@ -385,13 +389,6 @@ public static boolean phoneNumberPrivacy() { return getBoolean(PHONE_NUMBER_PRIVACY, false); } - /** - * Whether session switchover events should be blocked on the client. - */ - public static boolean blockSessionSwitchoverEvents() { - return getBoolean(BLOCK_SSE, false) && !phoneNumberPrivacy(); - } - /** Whether to use the custom streaming muxer or built in android muxer. */ public static boolean useStreamingVideoMuxer() { return getBoolean(CUSTOM_VIDEO_MUXER, false); @@ -611,6 +608,21 @@ public static boolean useActiveCallManager() { return getBoolean(USE_ACTIVE_CALL_MANAGER, false); } + /** Whether the in-app GIF search is available for use. */ + public static boolean gifSearchAvailable() { + return getBoolean(GIF_SEARCH, true); + } + + /** Allow media converters to remux audio instead of transcoding it. */ + public static boolean allowAudioRemuxing() { + return getBoolean(AUDIO_REMUXING, false); + } + + /** Get the default video zoom, expressed as 10x the actual Float value due to the service limiting us to whole numbers. */ + public static boolean startVideoRecordAt1x() { + return getBoolean(VIDEO_RECORD_1X_ZOOM, false); + } + /** Only for rendering debug info. */ public static synchronized @NonNull Map getMemoryValues() { return new TreeMap<>(REMOTE_VALUES); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java index 61e06c0960..9791076f42 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/IdentityUtil.java @@ -6,6 +6,8 @@ import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.signal.core.util.concurrent.SignalExecutors; import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; @@ -31,8 +33,6 @@ import org.thoughtcrime.securesms.notifications.v2.ConversationId; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; import org.whispersystems.signalservice.api.SignalSessionLock; import org.whispersystems.signalservice.api.messages.multidevice.VerifiedMessage; import org.whispersystems.signalservice.api.push.ServiceId; @@ -164,6 +164,7 @@ public static void markIdentityUpdate(@NonNull Context context, @NonNull Recipie throw new AssertionError(e); } + SignalDatabase.messageLog().deleteAllForRecipient(recipientId); } public static void saveIdentity(String user, IdentityKey identityKey) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java index 723fdcd377..e8cd01a4c3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ImageCompressionUtil.java @@ -8,6 +8,7 @@ import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; @@ -16,7 +17,6 @@ import org.signal.core.util.ByteSize; import org.signal.core.util.logging.Log; -import org.thoughtcrime.securesms.mms.GlideApp; import java.io.ByteArrayOutputStream; import java.util.List; @@ -82,7 +82,7 @@ private ImageCompressionUtil () {} Bitmap scaledBitmap; try { - scaledBitmap = GlideApp.with(context.getApplicationContext()) + scaledBitmap = Glide.with(context.getApplicationContext()) .asBitmap() .addListener(bitmapRequestListener) .load(glideModel) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/LinkUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/LinkUtil.kt index 704192e4c4..2422480a63 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/LinkUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/LinkUtil.kt @@ -2,6 +2,8 @@ package org.thoughtcrime.securesms.util import okhttp3.HttpUrl import org.thoughtcrime.securesms.stickers.StickerUrl +import java.net.URI +import java.net.URISyntaxException import java.util.Objects import java.util.regex.Pattern @@ -37,6 +39,10 @@ object LinkUtil { return false } + if (!isValidURI(linkUrl)) { + return false + } + return HttpUrl.parse(linkUrl)?.scheme() == "https" } @@ -85,5 +91,19 @@ object LinkUtil { ) } + @JvmStatic + private fun isValidURI(linkUri: String?): Boolean { + return if (linkUri == null) { + false + } else { + try { + val ignored = URI(linkUri) + true + } catch (e: URISyntaxException) { + false + } + } + } + private data class LegalCharactersResult(val isLegal: Boolean, val domain: String? = null) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java index 1b664ff0e1..39025c2e36 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/MediaUtil.java @@ -23,6 +23,7 @@ import androidx.annotation.WorkerThread; import androidx.exifinterface.media.ExifInterface; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.gif.GifDrawable; @@ -35,7 +36,6 @@ import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; import org.thoughtcrime.securesms.mms.DocumentSlide; import org.thoughtcrime.securesms.mms.GifSlide; -import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.ImageSlide; import org.thoughtcrime.securesms.mms.MmsSlide; import org.thoughtcrime.securesms.mms.PartAuthority; @@ -201,7 +201,7 @@ public static Pair getDimensions(@NonNull Context context, @Nu if (MediaUtil.isGif(contentType)) { try { - GifDrawable drawable = GlideApp.with(context) + GifDrawable drawable = Glide.with(context) .asGif() .skipMemoryCache(true) .diskCacheStrategy(DiskCacheStrategy.NONE) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java index 57a34d813d..bcd2ed14af 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentTask.java @@ -438,7 +438,7 @@ public static void showWarningDialog(Context context, OnClickListener onAcceptLi public static void showWarningDialog(Context context, OnClickListener onAcceptListener, int count) { AlertDialog.Builder builder = new MaterialAlertDialogBuilder(context); builder.setTitle(R.string.ConversationFragment_save_to_sd_card); - builder.setIcon(R.drawable.ic_warning); + builder.setIcon(R.drawable.symbol_error_triangle_fill_24); builder.setCancelable(true); builder.setMessage(context.getResources().getQuantityString(R.plurals.ConversationFragment_saving_n_media_to_storage_warning, count, count)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentUtil.kt index 03348fa757..da29fca579 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SaveAttachmentUtil.kt @@ -55,7 +55,7 @@ object SaveAttachmentUtil { fun showWarningDialog(context: Context, count: Int, onAcceptListener: OnClickListener) { MaterialAlertDialogBuilder(context) .setTitle(R.string.ConversationFragment_save_to_sd_card) - .setIcon(R.drawable.ic_warning) + .setIcon(R.drawable.symbol_error_triangle_fill_24) .setCancelable(true) .setMessage(context.resources.getQuantityString(R.plurals.ConversationFragment_saving_n_media_to_storage_warning, count, count)) .setPositiveButton(R.string.yes, onAcceptListener) diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java index 1abe9fa9a1..dcb88431e7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java @@ -1,5 +1,7 @@ package org.thoughtcrime.securesms.util; +import android.os.SystemClock; + import androidx.annotation.MainThread; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -213,6 +215,11 @@ public static void onMessageReceived(long serverReceiveTimestamp, long serverDel String name = highPriority ? NAME_HIGH : NAME_LOW; long latency = serverDeliverTimestamp - serverReceiveTimestamp; + if (latency > SystemClock.elapsedRealtime()) { + // Ignore messages with latency that would be before device boot time + return; + } + String id = name + System.currentTimeMillis(); LocalMetrics.getInstance().start(id, name); LocalMetrics.getInstance().splitWithDuration(id, SPLIT_LATENCY, latency); diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java index a62e3a3da8..d0c63c7798 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java @@ -149,7 +149,7 @@ public static void appendCenteredImageSpan(@NonNull SpannableStringBuilder build public static void appendBottomImageSpan(@NonNull SpannableStringBuilder builder, @NonNull Drawable drawable, int width, int height) { drawable.setBounds(0, 0, ViewUtil.dpToPx(width), ViewUtil.dpToPx(height)); - builder.append(" ").append(SpanUtil.buildImageSpan(drawable, DynamicDrawableSpan.ALIGN_BOTTOM)); + builder.append(SpanUtil.buildImageSpan(drawable, DynamicDrawableSpan.ALIGN_BOTTOM)); } public static CharSequence learnMore(@NonNull Context context, diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt index 0777040305..c391e5bca0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt @@ -64,6 +64,12 @@ object UsernameUtil { value == null -> { null } + value == "00" -> { + InvalidReason.INVALID_NUMBER + } + value.startsWith("00") -> { + InvalidReason.INVALID_NUMBER_PREFIX + } value.length < MIN_DISCRIMINATOR_LENGTH -> { InvalidReason.TOO_SHORT } @@ -83,6 +89,8 @@ object UsernameUtil { TOO_SHORT, TOO_LONG, INVALID_CHARACTERS, - STARTS_WITH_NUMBER + STARTS_WITH_NUMBER, + INVALID_NUMBER, + INVALID_NUMBER_PREFIX } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt b/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt index dbf23514b1..40de3c5f47 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ViewModelFactory.kt @@ -52,6 +52,15 @@ class SavedStateViewModelFactory( } } +@MainThread +inline fun ComponentActivity.viewModel( + noinline create: () -> VM +): Lazy { + return viewModels( + factoryProducer = ViewModelFactory.factoryProducer(create) + ) +} + @MainThread inline fun Fragment.viewModel( noinline create: () -> VM diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java index 56113b7afc..af256d61b8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java @@ -46,8 +46,8 @@ import androidx.interpolator.view.animation.FastOutSlowInInterpolator; import androidx.lifecycle.Lifecycle; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; -import org.thoughtcrime.securesms.util.concurrent.SettableFuture; +import org.signal.core.util.concurrent.ListenableFuture; +import org.signal.core.util.concurrent.SettableFuture; import org.thoughtcrime.securesms.util.views.Stub; public final class ViewUtil { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java index 1bd4e81248..735c0c2536 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/concurrent/AssertedSuccessListener.java @@ -1,6 +1,6 @@ package org.thoughtcrime.securesms.util.concurrent; -import org.thoughtcrime.securesms.util.concurrent.ListenableFuture.Listener; +import org.signal.core.util.concurrent.ListenableFuture.Listener; import java.util.concurrent.ExecutionException; diff --git a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/UriChatWallpaper.java b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/UriChatWallpaper.java index 1517a5a955..fcd3b32abd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/wallpaper/UriChatWallpaper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/wallpaper/UriChatWallpaper.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.GlideException; @@ -20,7 +21,6 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.database.model.databaseprotos.Wallpaper; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader; -import org.thoughtcrime.securesms.mms.GlideApp; import java.util.Objects; import java.util.concurrent.ExecutionException; @@ -64,7 +64,7 @@ public void loadInto(@NonNull ImageView imageView) { imageView.setImageBitmap(cached); } else { Log.d(TAG, "Not in cache or recycled. Fetching using Glide."); - GlideApp.with(imageView.getContext().getApplicationContext()) + Glide.with(imageView.getContext().getApplicationContext()) .asBitmap() .load(new DecryptableStreamUriLoader.DecryptableUri(uri)) .skipMemoryCache(true) @@ -97,7 +97,7 @@ public boolean prefetch(@NonNull Context context, long maxWaitTime) { long startTime = System.currentTimeMillis(); try { - Bitmap bitmap = GlideApp.with(context.getApplicationContext()) + Bitmap bitmap = Glide.with(context.getApplicationContext()) .asBitmap() .load(new DecryptableStreamUriLoader.DecryptableUri(uri)) .skipMemoryCache(true) diff --git a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java index c61425ce9e..7ae8d4d3fd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/webrtc/CallNotificationBuilder.java @@ -122,7 +122,7 @@ public static Notification getCallInProgressNotification( return builder.build(); } else if (type == TYPE_OUTGOING_RINGING) { builder.setContentText(context.getString(R.string.NotificationBarManager__establishing_signal_call)); - builder.addAction(getServiceNotificationAction(context, WebRtcCallService.hangupIntent(context), R.drawable.ic_call_end_grey600_32dp, R.string.NotificationBarManager__cancel_call)); + builder.addAction(getServiceNotificationAction(context, WebRtcCallService.hangupIntent(context), R.drawable.symbol_phone_down_fill_24, R.string.NotificationBarManager__cancel_call)); return builder.build(); } else { builder.setContentText(getOngoingCallContentText(context, recipient, isVideoCall)); diff --git a/app/src/main/protowire/Backup.proto b/app/src/main/protowire/Backup.proto index 6bcb277bbf..0299d77ffa 100644 --- a/app/src/main/protowire/Backup.proto +++ b/app/src/main/protowire/Backup.proto @@ -7,7 +7,6 @@ option java_package = "org.thoughtcrime.securesms.backup.v2.proto"; message BackupInfo { uint64 version = 1; uint64 backupTimeMs = 2; - bytes iv = 3; } message Frame { @@ -207,6 +206,9 @@ message ChatItem { repeated SendStatus sendStatus = 1; } + message DirectionlessMessageDetails { + } + uint64 chatId = 1; // conversation id uint64 authorId = 2; // recipient id uint64 dateSent = 3; @@ -217,8 +219,9 @@ message ChatItem { bool sms = 8; oneof directionalDetails { - IncomingMessageDetails incoming = 10; - OutgoingMessageDetails outgoing = 12; + IncomingMessageDetails incoming = 9; + OutgoingMessageDetails outgoing = 10; + DirectionlessMessageDetails directionless = 11; } oneof item { @@ -415,16 +418,17 @@ message FilePointer { optional bytes key = 5; optional string contentType = 6; + // Size of fullsize decrypted media blob in bytes. + // Can be ignored if unset/unavailable. optional uint32 size = 7; - optional bytes digest = 8; - optional bytes incrementalMac = 9; - optional bytes incrementalMacChunkSize = 10; - optional string fileName = 11; - optional uint32 flags = 12; - optional uint32 width = 13; - optional uint32 height = 14; - optional string caption = 15; - optional string blurHash = 16; + optional bytes incrementalMac = 8; + optional bytes incrementalMacChunkSize = 9; + optional string fileName = 10; + optional uint32 flags = 11; + optional uint32 width = 12; + optional uint32 height = 13; + optional string caption = 14; + optional string blurHash = 15; } message Quote { @@ -478,7 +482,7 @@ message Reaction { message ChatUpdateMessage { oneof update { SimpleChatUpdate simpleUpdate = 1; - GroupDescriptionChatUpdate groupDescription = 2; + GroupChangeChatUpdate groupChange = 2; ExpirationTimerChatUpdate expirationTimerChange = 3; ProfileChangeChatUpdate profileChange = 4; ThreadMergeChatUpdate threadMerge = 5; @@ -533,10 +537,6 @@ message SimpleChatUpdate { Type type = 1; } -message GroupDescriptionChatUpdate { - string newDescription = 1; -} - message ExpirationTimerChatUpdate { uint32 expiresInMs = 1; } @@ -554,6 +554,246 @@ message SessionSwitchoverChatUpdate { uint64 e164 = 1; } +message GroupChangeChatUpdate { + message Update { + // Note: group expiration timer changes are represented as ExpirationTimerChatUpdate. + oneof update { + GenericGroupUpdate genericGroupUpdate = 1; + GroupCreationUpdate groupCreationUpdate = 2; + GroupNameUpdate groupNameUpdate = 3; + GroupAvatarUpdate groupAvatarUpdate = 4; + GroupDescriptionUpdate groupDescriptionUpdate = 5; + GroupMembershipAccessLevelChangeUpdate groupMembershipAccessLevelChangeUpdate = 6; + GroupAttributesAccessLevelChangeUpdate groupAttributesAccessLevelChangeUpdate = 7; + GroupAnnouncementOnlyChangeUpdate groupAnnouncementOnlyChangeUpdate = 8; + GroupAdminStatusUpdate groupAdminStatusUpdate = 9; + GroupMemberLeftUpdate groupMemberLeftUpdate = 10; + GroupMemberRemovedUpdate groupMemberRemovedUpdate = 11; + SelfInvitedToGroupUpdate selfInvitedToGroupUpdate = 12; + SelfInvitedOtherUserToGroupUpdate selfInvitedOtherUserToGroupUpdate = 13; + GroupUnknownInviteeUpdate groupUnknownInviteeUpdate = 14; + GroupInvitationAcceptedUpdate groupInvitationAcceptedUpdate = 15; + GroupInvitationDeclinedUpdate groupInvitationDeclinedUpdate = 16; + GroupMemberJoinedUpdate groupMemberJoinedUpdate = 17; + GroupMemberAddedUpdate groupMemberAddedUpdate = 18; + GroupSelfInvitationRevokedUpdate groupSelfInvitationRevokedUpdate = 19; + GroupInvitationRevokedUpdate groupInvitationRevokedUpdate = 20; + GroupJoinRequestUpdate groupJoinRequestUpdate = 21; + GroupJoinRequestApprovalUpdate groupJoinRequestApprovalUpdate = 22; + GroupJoinRequestCanceledUpdate groupJoinRequestCanceledUpdate = 23; + GroupInviteLinkResetUpdate groupInviteLinkResetUpdate = 24; + GroupInviteLinkEnabledUpdate groupInviteLinkEnabledUpdate = 25; + GroupInviteLinkAdminApprovalUpdate groupInviteLinkAdminApprovalUpdate = 26; + GroupInviteLinkDisabledUpdate groupInviteLinkDisabledUpdate = 27; + GroupMemberJoinedByLinkUpdate groupMemberJoinedByLinkUpdate = 28; + GroupV2MigrationUpdate groupV2MigrationUpdate = 29; + GroupV2MigrationSelfInvitedUpdate groupV2MigrationSelfInvitedUpdate = 30; + GroupV2MigrationInvitedMembersUpdate groupV2MigrationInvitedMembersUpdate = 31; + GroupV2MigrationDroppedMembersUpdate groupV2MigrationDroppedMembersUpdate = 32; + GroupSequenceOfRequestsAndCancelsUpdate groupSequenceOfRequestsAndCancelsUpdate = 33; + } + } + + // Must be one or more; all updates batched together came from + // a single batched group state update. + repeated Update updates = 1; +} + +message GenericGroupUpdate { + optional bytes updaterAci = 1; +} + +message GroupCreationUpdate { + optional bytes updaterAci = 1; +} + +message GroupNameUpdate { + optional bytes updaterAci = 1; + // Null value means the group name was removed. + optional string newGroupName = 2; +} + +message GroupAvatarUpdate { + optional bytes updaterAci = 1; + bool wasRemoved = 2; +} + +message GroupDescriptionUpdate { + optional bytes updaterAci = 1; + // Null value means the group description was removed. + optional string newDescription = 2; +} + +enum GroupV2AccessLevel { + UNKNOWN = 0; + ANY = 1; + MEMBER = 2; + ADMINISTRATOR = 3; + UNSATISFIABLE = 4; +} + +message GroupMembershipAccessLevelChangeUpdate { + optional bytes updaterAci = 1; + GroupV2AccessLevel accessLevel = 2; +} + +message GroupAttributesAccessLevelChangeUpdate { + optional bytes updaterAci = 1; + GroupV2AccessLevel accessLevel = 2; +} + +message GroupAnnouncementOnlyChangeUpdate { + optional bytes updaterAci = 1; + bool isAnnouncementOnly = 2; +} + +message GroupAdminStatusUpdate { + optional bytes updaterAci = 1; + // The aci who had admin status granted or revoked. + bytes memberAci = 2; + bool wasAdminStatusGranted = 3; +} + +message GroupMemberLeftUpdate { + optional bytes aci = 1; +} + +message GroupMemberRemovedUpdate { + optional bytes removerAci = 1; + bytes removedAci = 2; +} + +message SelfInvitedToGroupUpdate { + optional bytes inviterAci = 1; +} + +message SelfInvitedOtherUserToGroupUpdate { + // If no invitee id available, use GroupUnknownInviteeUpdate + bytes inviteeServiceId = 1; +} + +message GroupUnknownInviteeUpdate { + // Can be the self user. + optional bytes inviterAci = 1; + uint32 inviteeCount = 2; +} + +message GroupInvitationAcceptedUpdate { + optional bytes inviterAci = 1; + bytes newMemberAci = 2; +} + +message GroupInvitationDeclinedUpdate { + optional bytes inviterAci = 1; + // Note: if invited by pni, just set inviteeAci to nil. + optional bytes inviteeAci = 2; +} + +message GroupMemberJoinedUpdate { + bytes newMemberAci = 1; +} + +message GroupMemberAddedUpdate { + optional bytes updaterAci = 1; + bytes newMemberAci = 2; + bool hadOpenInvitation = 3; + // If hadOpenInvitation is true, optionally include aci of the inviter. + optional bytes inviterAci = 4; +} + +// An invitation to self was revoked. +message GroupSelfInvitationRevokedUpdate { + optional bytes revokerAci = 1; +} + +// These invitees should never be the local user. +// Use GroupSelfInvitationRevokedUpdate in those cases. +// The inviter or updater can be the local user. +message GroupInvitationRevokedUpdate { + message Invitee { + optional bytes inviterAci = 1; + // Prefer to use aci over pni. No need to set + // pni if aci is set. Both can be missing. + optional bytes inviteeAci = 2; + optional bytes inviteePni = 3; + } + + // The member that revoked the invite(s), not the inviter! + // Assumed to be an admin (at the time, may no longer be an + // admin or even a member). + optional bytes updaterAci = 1; + repeated Invitee invitees = 2; +} + +message GroupJoinRequestUpdate { + bytes requestorAci = 1; +} + +message GroupJoinRequestApprovalUpdate { + bytes requestorAci = 1; + // The aci that approved or rejected the request. + optional bytes updaterAci = 2; + bool wasApproved = 3; +} + +message GroupJoinRequestCanceledUpdate { + bytes requestorAci = 1; +} + +// A single requestor has requested to join and cancelled +// their request repeatedly with no other updates in between. +// The last action encompassed by this update is always a +// cancellation; if there was another open request immediately +// after, it will be a separate GroupJoinRequestUpdate, either +// in the same frame or in a subsequent frame. +message GroupSequenceOfRequestsAndCancelsUpdate { + bytes requestorAci = 1; + uint32 count = 2; +} + +message GroupInviteLinkResetUpdate { + optional bytes updaterAci = 1; +} + +message GroupInviteLinkEnabledUpdate { + optional bytes updaterAci = 1; + bool linkRequiresAdminApproval = 2; +} + +message GroupInviteLinkAdminApprovalUpdate { + optional bytes updaterAci = 1; + bool linkRequiresAdminApproval = 2; +} + +message GroupInviteLinkDisabledUpdate { + optional bytes updaterAci = 1; +} + +message GroupMemberJoinedByLinkUpdate { + bytes newMemberAci = 1; +} + +// A gv1->gv2 migration occurred. +message GroupV2MigrationUpdate {} + +// Another user migrated gv1->gv2 but was unable to add +// the local user and invited them instead. +message GroupV2MigrationSelfInvitedUpdate {} + +// The local user migrated gv1->gv2 but was unable to +// add some members and invited them instead. +// (Happens if we don't have the invitee's profile key) +message GroupV2MigrationInvitedMembersUpdate { + int32 invitedMembersCount = 1; +} + +// The local user migrated gv1->gv2 but was unable to +// add or invite some members and dropped them instead. +// (Happens for e164 members where we don't have an aci). +message GroupV2MigrationDroppedMembersUpdate { + int32 droppedMembersCount = 1; +} + message StickerPack { bytes id = 1; bytes key = 2; diff --git a/app/src/main/protowire/Database.proto b/app/src/main/protowire/Database.proto index ced4593290..a80304067b 100644 --- a/app/src/main/protowire/Database.proto +++ b/app/src/main/protowire/Database.proto @@ -11,6 +11,8 @@ package signal; option java_package = "org.thoughtcrime.securesms.database.model.databaseprotos"; option java_multiple_files = true; +import Backup.proto; + // DEPRECATED -- only here for database migrations message ReactionList { option deprecated = true; @@ -243,10 +245,11 @@ message SignalStoreList { } message PendingChangeNumberMetadata { - bytes previousPni = 1; - bytes pniIdentityKeyPair = 2; - int32 pniRegistrationId = 3; - int32 pniSignedPreKeyId = 4; + bytes previousPni = 1; + bytes pniIdentityKeyPair = 2; + int32 pniRegistrationId = 3; + int32 pniSignedPreKeyId = 4; + int32 pniLastResortKyberPreKeyId = 5; } message MessageExportState { @@ -371,3 +374,12 @@ message ExternalLaunchTransactionState { GatewayRequest gatewayRequest = 2; string paymentSourceType = 3; } + +message MessageExtras { + GV2UpdateDescription gv2UpdateDescription = 1; +} + +message GV2UpdateDescription { + optional DecryptedGroupV2Context gv2ChangeDescription = 1; + backup.GroupChangeChatUpdate groupChangeUpdate = 2; +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/baseline_account_circle_white_24.webp b/app/src/main/res/drawable-hdpi/baseline_account_circle_white_24.webp deleted file mode 100644 index da28de1843..0000000000 Binary files a/app/src/main/res/drawable-hdpi/baseline_account_circle_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/baseline_email_white_24.webp b/app/src/main/res/drawable-hdpi/baseline_email_white_24.webp deleted file mode 100644 index 81444d4af3..0000000000 Binary files a/app/src/main/res/drawable-hdpi/baseline_email_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/check.webp b/app/src/main/res/drawable-hdpi/check.webp deleted file mode 100644 index 007bfc405b..0000000000 Binary files a/app/src/main/res/drawable-hdpi/check.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_action_warning_red.webp b/app/src/main/res/drawable-hdpi/ic_action_warning_red.webp deleted file mode 100644 index 566f486d2e..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_action_warning_red.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_add_white_original_24dp.webp b/app/src/main/res/drawable-hdpi/ic_add_white_original_24dp.webp deleted file mode 100644 index 544145e9fe..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_add_white_original_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-hdpi/ic_arrow_forward.webp deleted file mode 100644 index 439083bdc3..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_audio.webp b/app/src/main/res/drawable-hdpi/ic_audio.webp deleted file mode 100644 index b4b5d301d7..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_block_grey600_18dp.webp b/app/src/main/res/drawable-hdpi/ic_block_grey600_18dp.webp deleted file mode 100644 index 0bd6cc2b46..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_block_grey600_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_broken_link.webp b/app/src/main/res/drawable-hdpi/ic_broken_link.webp deleted file mode 100644 index 4db5a3df8e..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_broken_link.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.webp b/app/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.webp deleted file mode 100644 index de1b0c8456..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_call_end_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_call_end_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_call_end_white_48dp.webp deleted file mode 100644 index 6ac9f58b8d..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_call_end_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_call_split_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_call_split_white_24dp.webp deleted file mode 100644 index 10b8113f43..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_call_split_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_caption_28.webp b/app/src/main/res/drawable-hdpi/ic_caption_28.webp deleted file mode 100644 index 1bf447ac07..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_caption_28.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.webp b/app/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.webp deleted file mode 100644 index fe3141fc74..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_check_circle_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_check_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_check_white_24dp.webp deleted file mode 100644 index 4c18f6f5f4..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_check_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_check_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_check_white_48dp.webp deleted file mode 100644 index 5b9959970c..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_check_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_clear_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_clear_white_24dp.webp deleted file mode 100644 index 43a36dfda7..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_clear_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_close_white_18dp.webp b/app/src/main/res/drawable-hdpi/ic_close_white_18dp.webp deleted file mode 100644 index 63a6bf18be..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_close_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_close_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_close_white_24dp.webp deleted file mode 100644 index 1f97cd4184..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_close_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_close_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_close_white_48dp.webp deleted file mode 100644 index 1ae09899ee..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_close_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_contact_picture.webp b/app/src/main/res/drawable-hdpi/ic_contact_picture.webp deleted file mode 100644 index 6d1f5e32e9..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_contact_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_contact_picture_large.webp b/app/src/main/res/drawable-hdpi/ic_contact_picture_large.webp deleted file mode 100644 index 53c8929ca0..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_contact_picture_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_contacts_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_contacts_white_48dp.webp deleted file mode 100644 index 0d2d887f00..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_contacts_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_create_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_create_white_24dp.webp deleted file mode 100644 index 236efc9c0a..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_create_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_delivery_status_delivered.webp b/app/src/main/res/drawable-hdpi/ic_delivery_status_delivered.webp deleted file mode 100644 index a3ed7edf3c..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_delivery_status_delivered.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_delivery_status_read.webp b/app/src/main/res/drawable-hdpi/ic_delivery_status_read.webp deleted file mode 100644 index 19525c3123..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_delivery_status_read.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_delivery_status_sending.webp b/app/src/main/res/drawable-hdpi/ic_delivery_status_sending.webp deleted file mode 100644 index 10ccbb0ed8..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_delivery_status_sending.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_delivery_status_sent.webp b/app/src/main/res/drawable-hdpi/ic_delivery_status_sent.webp deleted file mode 100644 index b3a3347683..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_delivery_status_sent.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_devices_white.webp b/app/src/main/res/drawable-hdpi/ic_devices_white.webp deleted file mode 100644 index fe4d862bba..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_devices_white.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.webp deleted file mode 100644 index fbdd7b4120..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_download_circle_fill_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_folder_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_folder_white_48dp.webp deleted file mode 100644 index 361edbb33f..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_folder_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_down_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_down_white_24dp.webp deleted file mode 100644 index 879e382de6..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_down_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index b269b86940..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_up_white_36dp.webp b/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_up_white_36dp.webp deleted file mode 100644 index 0d77a62234..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_keyboard_arrow_up_white_36dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_location_on_white_24dp.webp b/app/src/main/res/drawable-hdpi/ic_location_on_white_24dp.webp deleted file mode 100644 index 72c634d291..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_location_on_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_lock_white_48dp.webp b/app/src/main/res/drawable-hdpi/ic_lock_white_48dp.webp deleted file mode 100644 index efb7f01a75..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_lock_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_menu_lock_dark.webp b/app/src/main/res/drawable-hdpi/ic_menu_lock_dark.webp deleted file mode 100644 index cb5c5dd787..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_menu_lock_dark.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_menu_login.webp b/app/src/main/res/drawable-hdpi/ic_menu_login.webp deleted file mode 100644 index c01bd30001..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_menu_login.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_menu_search_holo_light.webp b/app/src/main/res/drawable-hdpi/ic_menu_search_holo_light.webp deleted file mode 100644 index dff4d4c4c1..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_menu_search_holo_light.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.webp b/app/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.webp deleted file mode 100644 index 03981ed4c0..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_missing_thumbnail_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.webp b/app/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.webp deleted file mode 100644 index 014a16ddc0..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_phone_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/ic_warning.webp b/app/src/main/res/drawable-hdpi/ic_warning.webp deleted file mode 100644 index 685af09f42..0000000000 Binary files a/app/src/main/res/drawable-hdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/message_24dp.webp b/app/src/main/res/drawable-hdpi/message_24dp.webp deleted file mode 100644 index 457b497f6a..0000000000 Binary files a/app/src/main/res/drawable-hdpi/message_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-hdpi/phone_24dp.webp b/app/src/main/res/drawable-hdpi/phone_24dp.webp deleted file mode 100644 index 50fe33766e..0000000000 Binary files a/app/src/main/res/drawable-hdpi/phone_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index 7aee3d20ab..0000000000 Binary files a/app/src/main/res/drawable-ldrtl-hdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index 369f201462..0000000000 Binary files a/app/src/main/res/drawable-ldrtl-xhdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index 8003d672bc..0000000000 Binary files a/app/src/main/res/drawable-ldrtl-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index 2877169a9f..0000000000 Binary files a/app/src/main/res/drawable-ldrtl-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/baseline_account_circle_white_24.webp b/app/src/main/res/drawable-mdpi/baseline_account_circle_white_24.webp deleted file mode 100644 index 44f3c39c8b..0000000000 Binary files a/app/src/main/res/drawable-mdpi/baseline_account_circle_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/baseline_email_white_24.webp b/app/src/main/res/drawable-mdpi/baseline_email_white_24.webp deleted file mode 100644 index 9a6678f1d9..0000000000 Binary files a/app/src/main/res/drawable-mdpi/baseline_email_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/check.webp b/app/src/main/res/drawable-mdpi/check.webp deleted file mode 100644 index 3b9b3209f3..0000000000 Binary files a/app/src/main/res/drawable-mdpi/check.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_action_warning_red.webp b/app/src/main/res/drawable-mdpi/ic_action_warning_red.webp deleted file mode 100644 index 27110de535..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_action_warning_red.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_add_white_original_24dp.webp b/app/src/main/res/drawable-mdpi/ic_add_white_original_24dp.webp deleted file mode 100644 index d6aa25be18..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_add_white_original_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-mdpi/ic_arrow_forward.webp deleted file mode 100644 index edade98d9f..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_audio.png b/app/src/main/res/drawable-mdpi/ic_audio.png deleted file mode 100644 index fd2d3d06da..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_audio.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_block_grey600_18dp.webp b/app/src/main/res/drawable-mdpi/ic_block_grey600_18dp.webp deleted file mode 100644 index 08afbc9ea0..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_block_grey600_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_broken_link.webp b/app/src/main/res/drawable-mdpi/ic_broken_link.webp deleted file mode 100644 index 3ab7ebef7b..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_broken_link.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.webp b/app/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.webp deleted file mode 100644 index b42bcd9fec..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_call_end_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_call_end_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_call_end_white_48dp.webp deleted file mode 100644 index 627d07b161..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_call_end_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_call_split_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_call_split_white_24dp.webp deleted file mode 100644 index 953f846fd6..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_call_split_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_caption_28.webp b/app/src/main/res/drawable-mdpi/ic_caption_28.webp deleted file mode 100644 index b47add58e3..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_caption_28.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.webp b/app/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.webp deleted file mode 100644 index f8be216fab..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_check_circle_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_check_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_check_white_24dp.webp deleted file mode 100644 index 9267e09711..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_check_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_check_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_check_white_48dp.webp deleted file mode 100644 index b29483e0c3..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_check_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_clear_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_clear_white_24dp.webp deleted file mode 100644 index 1266fa5707..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_clear_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_close_white_18dp.webp b/app/src/main/res/drawable-mdpi/ic_close_white_18dp.webp deleted file mode 100644 index 779b7b513c..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_close_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_close_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_close_white_24dp.webp deleted file mode 100644 index 5943a7a982..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_close_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_close_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_close_white_48dp.webp deleted file mode 100644 index c1d0fd16e9..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_close_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_contact_picture.webp b/app/src/main/res/drawable-mdpi/ic_contact_picture.webp deleted file mode 100644 index 56f1d7ed5a..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_contact_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_contact_picture_large.webp b/app/src/main/res/drawable-mdpi/ic_contact_picture_large.webp deleted file mode 100644 index 3c87e8c023..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_contact_picture_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_contacts_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_contacts_white_48dp.webp deleted file mode 100644 index eab84d08e9..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_contacts_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_create_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_create_white_24dp.webp deleted file mode 100644 index bf789ff18e..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_create_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_delivery_status_delivered.webp b/app/src/main/res/drawable-mdpi/ic_delivery_status_delivered.webp deleted file mode 100644 index 8efe94fbfd..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_delivery_status_delivered.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_delivery_status_read.webp b/app/src/main/res/drawable-mdpi/ic_delivery_status_read.webp deleted file mode 100644 index 693ce088ca..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_delivery_status_read.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_delivery_status_sending.webp b/app/src/main/res/drawable-mdpi/ic_delivery_status_sending.webp deleted file mode 100644 index c90b0b6f1d..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_delivery_status_sending.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_delivery_status_sent.webp b/app/src/main/res/drawable-mdpi/ic_delivery_status_sent.webp deleted file mode 100644 index d95c4e485e..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_delivery_status_sent.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_devices_white.webp b/app/src/main/res/drawable-mdpi/ic_devices_white.webp deleted file mode 100644 index 9aeba4648a..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_devices_white.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.webp deleted file mode 100644 index 7b1362be86..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_download_circle_fill_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_folder_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_folder_white_48dp.webp deleted file mode 100644 index 2cad1dcaac..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_folder_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_down_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_down_white_24dp.webp deleted file mode 100644 index bcce2a559b..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_down_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index e3bb5d37ab..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_up_white_36dp.webp b/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_up_white_36dp.webp deleted file mode 100644 index ede63a9186..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_keyboard_arrow_up_white_36dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_location_on_white_24dp.webp b/app/src/main/res/drawable-mdpi/ic_location_on_white_24dp.webp deleted file mode 100644 index e6cac0641e..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_location_on_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_lock_white_48dp.webp b/app/src/main/res/drawable-mdpi/ic_lock_white_48dp.webp deleted file mode 100644 index b0459f5c30..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_lock_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_menu_lock_dark.webp b/app/src/main/res/drawable-mdpi/ic_menu_lock_dark.webp deleted file mode 100644 index 9b30767545..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_menu_lock_dark.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_menu_login.png b/app/src/main/res/drawable-mdpi/ic_menu_login.png deleted file mode 100644 index 07dd6a510e..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_menu_login.png and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_menu_search_holo_light.webp b/app/src/main/res/drawable-mdpi/ic_menu_search_holo_light.webp deleted file mode 100644 index a99e8f67e6..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_menu_search_holo_light.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.webp b/app/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.webp deleted file mode 100644 index 0ac35c1da1..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_missing_thumbnail_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.webp b/app/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.webp deleted file mode 100644 index fef359da21..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_phone_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_warning.webp b/app/src/main/res/drawable-mdpi/ic_warning.webp deleted file mode 100644 index c13bfaefa5..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/ic_x_24_outlined.webp b/app/src/main/res/drawable-mdpi/ic_x_24_outlined.webp deleted file mode 100644 index e390913c8c..0000000000 Binary files a/app/src/main/res/drawable-mdpi/ic_x_24_outlined.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/message_24dp.webp b/app/src/main/res/drawable-mdpi/message_24dp.webp deleted file mode 100644 index 9bdab599d9..0000000000 Binary files a/app/src/main/res/drawable-mdpi/message_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-mdpi/phone_24dp.webp b/app/src/main/res/drawable-mdpi/phone_24dp.webp deleted file mode 100644 index 43d532c40a..0000000000 Binary files a/app/src/main/res/drawable-mdpi/phone_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-hdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-night-hdpi/ic_arrow_forward.webp deleted file mode 100644 index 37bcf63306..0000000000 Binary files a/app/src/main/res/drawable-night-hdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-hdpi/ic_audio.webp b/app/src/main/res/drawable-night-hdpi/ic_audio.webp deleted file mode 100644 index fc3999ddb8..0000000000 Binary files a/app/src/main/res/drawable-night-hdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-hdpi/ic_document_large.webp b/app/src/main/res/drawable-night-hdpi/ic_document_large.webp deleted file mode 100644 index 72bc5d4071..0000000000 Binary files a/app/src/main/res/drawable-night-hdpi/ic_document_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-hdpi/ic_document_small.webp b/app/src/main/res/drawable-night-hdpi/ic_document_small.webp deleted file mode 100644 index f66bcd59b1..0000000000 Binary files a/app/src/main/res/drawable-night-hdpi/ic_document_small.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-hdpi/ic_warning.webp b/app/src/main/res/drawable-night-hdpi/ic_warning.webp deleted file mode 100644 index dc41fe89cc..0000000000 Binary files a/app/src/main/res/drawable-night-hdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-mdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-night-mdpi/ic_arrow_forward.webp deleted file mode 100644 index 16d6e2608a..0000000000 Binary files a/app/src/main/res/drawable-night-mdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-mdpi/ic_audio.webp b/app/src/main/res/drawable-night-mdpi/ic_audio.webp deleted file mode 100644 index 9044aee944..0000000000 Binary files a/app/src/main/res/drawable-night-mdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-mdpi/ic_document_large.webp b/app/src/main/res/drawable-night-mdpi/ic_document_large.webp deleted file mode 100644 index 1923e7041e..0000000000 Binary files a/app/src/main/res/drawable-night-mdpi/ic_document_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-mdpi/ic_document_small.webp b/app/src/main/res/drawable-night-mdpi/ic_document_small.webp deleted file mode 100644 index a6bbd9b4b0..0000000000 Binary files a/app/src/main/res/drawable-night-mdpi/ic_document_small.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-mdpi/ic_warning.webp b/app/src/main/res/drawable-night-mdpi/ic_warning.webp deleted file mode 100644 index ab9690a14c..0000000000 Binary files a/app/src/main/res/drawable-night-mdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xhdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-night-xhdpi/ic_arrow_forward.webp deleted file mode 100644 index 4d2e592fc1..0000000000 Binary files a/app/src/main/res/drawable-night-xhdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xhdpi/ic_audio.webp b/app/src/main/res/drawable-night-xhdpi/ic_audio.webp deleted file mode 100644 index 2a3b35a14c..0000000000 Binary files a/app/src/main/res/drawable-night-xhdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xhdpi/ic_document_large.webp b/app/src/main/res/drawable-night-xhdpi/ic_document_large.webp deleted file mode 100644 index a3b0c1d4b8..0000000000 Binary files a/app/src/main/res/drawable-night-xhdpi/ic_document_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xhdpi/ic_document_small.webp b/app/src/main/res/drawable-night-xhdpi/ic_document_small.webp deleted file mode 100644 index ab317667ae..0000000000 Binary files a/app/src/main/res/drawable-night-xhdpi/ic_document_small.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xhdpi/ic_warning.webp b/app/src/main/res/drawable-night-xhdpi/ic_warning.webp deleted file mode 100644 index c973ed9d45..0000000000 Binary files a/app/src/main/res/drawable-night-xhdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-night-xxhdpi/ic_arrow_forward.webp deleted file mode 100644 index 47ac793e83..0000000000 Binary files a/app/src/main/res/drawable-night-xxhdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_audio.webp b/app/src/main/res/drawable-night-xxhdpi/ic_audio.webp deleted file mode 100644 index 2da12c6382..0000000000 Binary files a/app/src/main/res/drawable-night-xxhdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_document_large.webp b/app/src/main/res/drawable-night-xxhdpi/ic_document_large.webp deleted file mode 100644 index 7d1d95252d..0000000000 Binary files a/app/src/main/res/drawable-night-xxhdpi/ic_document_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_document_small.webp b/app/src/main/res/drawable-night-xxhdpi/ic_document_small.webp deleted file mode 100644 index 4f27c9ac78..0000000000 Binary files a/app/src/main/res/drawable-night-xxhdpi/ic_document_small.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxhdpi/ic_warning.webp b/app/src/main/res/drawable-night-xxhdpi/ic_warning.webp deleted file mode 100644 index e279c8bac1..0000000000 Binary files a/app/src/main/res/drawable-night-xxhdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxxhdpi/ic_document_large.webp b/app/src/main/res/drawable-night-xxxhdpi/ic_document_large.webp deleted file mode 100644 index 6699c61da2..0000000000 Binary files a/app/src/main/res/drawable-night-xxxhdpi/ic_document_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-night-xxxhdpi/ic_document_small.webp b/app/src/main/res/drawable-night-xxxhdpi/ic_document_small.webp deleted file mode 100644 index 59f526e954..0000000000 Binary files a/app/src/main/res/drawable-night-xxxhdpi/ic_document_small.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.webp b/app/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.webp deleted file mode 100644 index bb8453eb33..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/baseline_account_circle_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_email_white_24.webp b/app/src/main/res/drawable-xhdpi/baseline_email_white_24.webp deleted file mode 100644 index cfc805087e..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/baseline_email_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/check.webp b/app/src/main/res/drawable-xhdpi/check.webp deleted file mode 100644 index afa4a36b8d..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/check.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_action_warning_red.webp b/app/src/main/res/drawable-xhdpi/ic_action_warning_red.webp deleted file mode 100644 index da00181049..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_action_warning_red.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.webp deleted file mode 100644 index 86a06eb4e4..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_add_white_original_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-xhdpi/ic_arrow_forward.webp deleted file mode 100644 index e34558832b..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_audio.webp b/app/src/main/res/drawable-xhdpi/ic_audio.webp deleted file mode 100644 index 4733040f7e..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.webp b/app/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.webp deleted file mode 100644 index d26c70e698..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_block_grey600_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_broken_link.webp b/app/src/main/res/drawable-xhdpi/ic_broken_link.webp deleted file mode 100644 index 3a94210361..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_broken_link.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.webp b/app/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.webp deleted file mode 100644 index 5d5354019a..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_call_end_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.webp deleted file mode 100644 index fe688062b0..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_call_end_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.webp deleted file mode 100644 index e0c5655f4d..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_call_split_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_caption_28.webp b/app/src/main/res/drawable-xhdpi/ic_caption_28.webp deleted file mode 100644 index 702e65fd97..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_caption_28.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.webp b/app/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.webp deleted file mode 100644 index af27a23354..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_check_circle_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_check_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_check_white_24dp.webp deleted file mode 100644 index 8ce408f335..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_check_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_check_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_check_white_48dp.webp deleted file mode 100644 index 44885d6f58..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_check_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.webp deleted file mode 100644 index 7f1e72cb59..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_clear_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white_18dp.webp b/app/src/main/res/drawable-xhdpi/ic_close_white_18dp.webp deleted file mode 100644 index 541301f06d..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_close_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.webp deleted file mode 100644 index 88a57fe20f..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_close_white_48dp.webp deleted file mode 100644 index 439b8fe896..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_close_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_contact_picture.webp b/app/src/main/res/drawable-xhdpi/ic_contact_picture.webp deleted file mode 100644 index 507c4702b0..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_contact_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_contact_picture_large.webp b/app/src/main/res/drawable-xhdpi/ic_contact_picture_large.webp deleted file mode 100644 index d6164bb9ab..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_contact_picture_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.webp deleted file mode 100644 index 89502d59fb..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_contacts_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_create_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_create_white_24dp.webp deleted file mode 100644 index a15beb23f4..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_create_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.webp b/app/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.webp deleted file mode 100644 index a248a924db..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_delivery_status_delivered.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_delivery_status_read.webp b/app/src/main/res/drawable-xhdpi/ic_delivery_status_read.webp deleted file mode 100644 index 8cb73484a4..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_delivery_status_read.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_delivery_status_sending.webp b/app/src/main/res/drawable-xhdpi/ic_delivery_status_sending.webp deleted file mode 100644 index 3d8731de92..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_delivery_status_sending.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_delivery_status_sent.webp b/app/src/main/res/drawable-xhdpi/ic_delivery_status_sent.webp deleted file mode 100644 index 611359cd24..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_delivery_status_sent.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_devices_white.webp b/app/src/main/res/drawable-xhdpi/ic_devices_white.webp deleted file mode 100644 index 93d7e2eea3..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_devices_white.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.webp deleted file mode 100644 index b277c13095..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_download_circle_fill_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_folder_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_folder_white_48dp.webp deleted file mode 100644 index 183ffe30b1..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_folder_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_down_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_down_white_24dp.webp deleted file mode 100644 index 8edbab62b3..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_down_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index 11cd4381cf..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_up_white_36dp.webp b/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_up_white_36dp.webp deleted file mode 100644 index cc4835bca0..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_keyboard_arrow_up_white_36dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.webp b/app/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.webp deleted file mode 100644 index b67c68118d..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_location_on_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_lock_white_48dp.webp b/app/src/main/res/drawable-xhdpi/ic_lock_white_48dp.webp deleted file mode 100644 index 2de76faac3..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_lock_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_lock_dark.webp b/app/src/main/res/drawable-xhdpi/ic_menu_lock_dark.webp deleted file mode 100644 index 8212b28ae4..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_menu_lock_dark.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_login.webp b/app/src/main/res/drawable-xhdpi/ic_menu_login.webp deleted file mode 100644 index da2ac6c9e0..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_menu_login.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.webp b/app/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.webp deleted file mode 100644 index 9dd42004ba..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_menu_search_holo_light.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.webp b/app/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.webp deleted file mode 100644 index c2e1681928..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_missing_thumbnail_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.webp b/app/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.webp deleted file mode 100644 index 09630019e9..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_phone_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_warning.webp b/app/src/main/res/drawable-xhdpi/ic_warning.webp deleted file mode 100644 index 8428399f34..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/ic_x_24_outlined.webp b/app/src/main/res/drawable-xhdpi/ic_x_24_outlined.webp deleted file mode 100644 index 74ed1e457c..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/ic_x_24_outlined.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/message_24dp.webp b/app/src/main/res/drawable-xhdpi/message_24dp.webp deleted file mode 100644 index cd066df293..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/message_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xhdpi/phone_24dp.webp b/app/src/main/res/drawable-xhdpi/phone_24dp.webp deleted file mode 100644 index 9b9a27ad2f..0000000000 Binary files a/app/src/main/res/drawable-xhdpi/phone_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.webp b/app/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.webp deleted file mode 100644 index a5563725b1..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/baseline_account_circle_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_email_white_24.webp b/app/src/main/res/drawable-xxhdpi/baseline_email_white_24.webp deleted file mode 100644 index 4c165d3287..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/baseline_email_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/check.webp b/app/src/main/res/drawable-xxhdpi/check.webp deleted file mode 100644 index 9e90cbd07b..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/check.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_warning_red.webp b/app/src/main/res/drawable-xxhdpi/ic_action_warning_red.webp deleted file mode 100644 index 59472c09da..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_warning_red.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.webp deleted file mode 100644 index bbbf16470b..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_add_white_original_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_arrow_forward.webp b/app/src/main/res/drawable-xxhdpi/ic_arrow_forward.webp deleted file mode 100644 index df8eb7f52b..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_arrow_forward.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_audio.webp b/app/src/main/res/drawable-xxhdpi/ic_audio.webp deleted file mode 100644 index da2ba30148..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_audio.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.webp b/app/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.webp deleted file mode 100644 index 02a97dba95..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_block_grey600_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_broken_link.webp b/app/src/main/res/drawable-xxhdpi/ic_broken_link.webp deleted file mode 100644 index 5f6a70010a..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_broken_link.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.webp b/app/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.webp deleted file mode 100644 index 693ef75dee..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_call_end_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.webp deleted file mode 100644 index 4bfafe34b3..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_call_end_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.webp deleted file mode 100644 index be329cc29d..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_call_split_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_caption_28.webp b/app/src/main/res/drawable-xxhdpi/ic_caption_28.webp deleted file mode 100644 index 3a00c0ab51..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_caption_28.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.webp b/app/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.webp deleted file mode 100644 index 3069c3e84e..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_check_circle_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_check_white_24dp.webp deleted file mode 100644 index 61cd93f3c1..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_check_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_check_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_check_white_48dp.webp deleted file mode 100644 index b52d8cfb86..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_check_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.webp deleted file mode 100644 index 6a06c9f867..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_clear_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white_18dp.webp b/app/src/main/res/drawable-xxhdpi/ic_close_white_18dp.webp deleted file mode 100644 index 1b7a9e54d3..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_close_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.webp deleted file mode 100644 index c69f105b07..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_close_white_48dp.webp deleted file mode 100644 index 0b4f0ba45f..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_close_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_contact_picture.webp b/app/src/main/res/drawable-xxhdpi/ic_contact_picture.webp deleted file mode 100644 index a6a6f85cc0..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_contact_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_contact_picture_large.webp b/app/src/main/res/drawable-xxhdpi/ic_contact_picture_large.webp deleted file mode 100644 index c4538cfd16..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_contact_picture_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.webp deleted file mode 100644 index 4f5c20c561..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_contacts_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.webp deleted file mode 100644 index 2d4890198d..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_create_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.webp b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.webp deleted file mode 100644 index 09615477e6..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_delivered.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_read.webp b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_read.webp deleted file mode 100644 index 403c7e7679..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_read.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.webp b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.webp deleted file mode 100644 index 46f241fd61..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sending.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.webp b/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.webp deleted file mode 100644 index f2171514c4..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_delivery_status_sent.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_devices_white.webp b/app/src/main/res/drawable-xxhdpi/ic_devices_white.webp deleted file mode 100644 index 4caee3916b..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_devices_white.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.webp deleted file mode 100644 index 151daa6e36..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_download_circle_fill_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_error_white_18dp.webp b/app/src/main/res/drawable-xxhdpi/ic_error_white_18dp.webp deleted file mode 100644 index b316c7f989..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_error_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_folder_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_folder_white_48dp.webp deleted file mode 100644 index 85ad872623..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_folder_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_down_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_down_white_24dp.webp deleted file mode 100644 index fde8f22023..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_down_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index 27deddbc34..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_up_white_36dp.webp b/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_up_white_36dp.webp deleted file mode 100644 index 3296214cb8..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_keyboard_arrow_up_white_36dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.webp b/app/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.webp deleted file mode 100644 index 9fd0c6973d..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_location_on_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.webp b/app/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.webp deleted file mode 100644 index e5df382708..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_lock_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.webp b/app/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.webp deleted file mode 100644 index c374dee71c..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_menu_lock_dark.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.webp b/app/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.webp deleted file mode 100644 index 758a237657..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_menu_search_holo_light.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.webp b/app/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.webp deleted file mode 100644 index dac8e83fe8..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_missing_thumbnail_picture.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.webp b/app/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.webp deleted file mode 100644 index b6951bb12b..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_phone_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_refresh_white_18dp.webp b/app/src/main/res/drawable-xxhdpi/ic_refresh_white_18dp.webp deleted file mode 100644 index da23759f59..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_refresh_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_warning.webp b/app/src/main/res/drawable-xxhdpi/ic_warning.webp deleted file mode 100644 index 1d4af43bf1..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_warning.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_x_24_outlined.webp b/app/src/main/res/drawable-xxhdpi/ic_x_24_outlined.webp deleted file mode 100644 index ef1a7a9892..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/ic_x_24_outlined.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/message_24dp.webp b/app/src/main/res/drawable-xxhdpi/message_24dp.webp deleted file mode 100644 index 869faf2a8c..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/message_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/phone_24dp.webp b/app/src/main/res/drawable-xxhdpi/phone_24dp.webp deleted file mode 100644 index 344db69684..0000000000 Binary files a/app/src/main/res/drawable-xxhdpi/phone_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxhdpi/safety_tip1.png b/app/src/main/res/drawable-xxhdpi/safety_tip1.png new file mode 100644 index 0000000000..adfaf2d763 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/safety_tip1.png differ diff --git a/app/src/main/res/drawable-xxhdpi/safety_tip2.png b/app/src/main/res/drawable-xxhdpi/safety_tip2.png new file mode 100644 index 0000000000..fc480f1b3e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/safety_tip2.png differ diff --git a/app/src/main/res/drawable-xxhdpi/safety_tip3.png b/app/src/main/res/drawable-xxhdpi/safety_tip3.png new file mode 100644 index 0000000000..edbc3797cb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/safety_tip3.png differ diff --git a/app/src/main/res/drawable-xxhdpi/safety_tip4.png b/app/src/main/res/drawable-xxhdpi/safety_tip4.png new file mode 100644 index 0000000000..2a0e16c1be Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/safety_tip4.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.webp b/app/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.webp deleted file mode 100644 index efe2d51c9e..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/baseline_account_circle_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_email_white_24.webp b/app/src/main/res/drawable-xxxhdpi/baseline_email_white_24.webp deleted file mode 100644 index 623920e3e1..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/baseline_email_white_24.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.webp deleted file mode 100644 index 918078e23c..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_add_white_original_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.webp deleted file mode 100644 index 92ff7720e9..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_block_grey600_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_broken_link.webp b/app/src/main/res/drawable-xxxhdpi/ic_broken_link.webp deleted file mode 100644 index 4711f691ea..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_broken_link.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.webp deleted file mode 100644 index 4f2c8b5d6e..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_call_end_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.webp deleted file mode 100644 index f7ed931073..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_call_end_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_caption_28.webp b/app/src/main/res/drawable-xxxhdpi/ic_caption_28.webp deleted file mode 100644 index 46cc43cbc6..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_caption_28.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.webp deleted file mode 100644 index 644877b630..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_check_circle_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.webp deleted file mode 100644 index 75bd23c39f..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_check_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.webp deleted file mode 100644 index a8abeefafa..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_check_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.webp deleted file mode 100644 index 4f84702dd0..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_clear_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.webp deleted file mode 100644 index 1ae09899ee..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_close_white_18dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.webp deleted file mode 100644 index 75309d240a..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.webp deleted file mode 100644 index 22e78ba849..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_close_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.webp b/app/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.webp deleted file mode 100644 index edbba47b41..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_contact_picture_large.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.webp deleted file mode 100644 index c113d2d04b..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_contacts_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.webp b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.webp deleted file mode 100644 index 42ab8f1fa6..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_delivered.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.webp b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.webp deleted file mode 100644 index 3ca1497fa2..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_read.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.webp b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.webp deleted file mode 100644 index 898d4c21bc..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sending.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.webp b/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.webp deleted file mode 100644 index 791dbf0119..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_delivery_status_sent.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_devices_white.webp b/app/src/main/res/drawable-xxxhdpi/ic_devices_white.webp deleted file mode 100644 index e321eb595e..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_devices_white.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.webp deleted file mode 100644 index f941c1a39e..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_download_circle_fill_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_folder_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_folder_white_48dp.webp deleted file mode 100644 index 1155b33115..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_folder_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_down_white_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_down_white_24dp.webp deleted file mode 100644 index f28ed25569..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_down_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp deleted file mode 100644 index aeba3b2da7..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_left_grey600_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_up_white_36dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_up_white_36dp.webp deleted file mode 100644 index 020e5283bc..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_keyboard_arrow_up_white_36dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.webp deleted file mode 100644 index a995f7dc3b..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_location_on_white_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.webp deleted file mode 100644 index 6889b61711..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_lock_white_48dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.webp b/app/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.webp deleted file mode 100644 index c4322f9430..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_menu_lock_dark.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.webp b/app/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.webp deleted file mode 100644 index 2fab32234a..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_phone_grey600_32dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_x_24_outlined.webp b/app/src/main/res/drawable-xxxhdpi/ic_x_24_outlined.webp deleted file mode 100644 index 8d2244768d..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/ic_x_24_outlined.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/marker_shadow.webp b/app/src/main/res/drawable-xxxhdpi/marker_shadow.webp deleted file mode 100644 index 6c7b09e533..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/marker_shadow.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/message_24dp.webp b/app/src/main/res/drawable-xxxhdpi/message_24dp.webp deleted file mode 100644 index d2d2043112..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/message_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable-xxxhdpi/phone_24dp.webp b/app/src/main/res/drawable-xxxhdpi/phone_24dp.webp deleted file mode 100644 index 3d5109b0c5..0000000000 Binary files a/app/src/main/res/drawable-xxxhdpi/phone_24dp.webp and /dev/null differ diff --git a/app/src/main/res/drawable/background_pattern.png b/app/src/main/res/drawable/background_pattern.png deleted file mode 100644 index 9035edeb02..0000000000 Binary files a/app/src/main/res/drawable/background_pattern.png and /dev/null differ diff --git a/app/src/main/res/drawable/background_pattern_repeat.xml b/app/src/main/res/drawable/background_pattern_repeat.xml deleted file mode 100644 index 5e3165a49f..0000000000 --- a/app/src/main/res/drawable/background_pattern_repeat.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/app/src/main/res/drawable/conversation_attachment_close_circle.xml b/app/src/main/res/drawable/conversation_attachment_close_circle.xml index 86741f86e3..c373951010 100644 --- a/app/src/main/res/drawable/conversation_attachment_close_circle.xml +++ b/app/src/main/res/drawable/conversation_attachment_close_circle.xml @@ -2,14 +2,19 @@ - - - + + + - - - + diff --git a/app/src/main/res/drawable/conversation_attachment_edit.xml b/app/src/main/res/drawable/conversation_attachment_edit.xml index 4e3413c1cb..68a2276f7c 100644 --- a/app/src/main/res/drawable/conversation_attachment_edit.xml +++ b/app/src/main/res/drawable/conversation_attachment_edit.xml @@ -7,7 +7,7 @@ - + + + + + + + + diff --git a/app/src/main/res/drawable/ic_phone_right_unlock_solid_24.xml b/app/src/main/res/drawable/ic_phone_right_unlock_solid_24.xml deleted file mode 100644 index e3321a7147..0000000000 --- a/app/src/main/res/drawable/ic_phone_right_unlock_solid_24.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/link_color_48.xml b/app/src/main/res/drawable/link_color_48.xml deleted file mode 100644 index 4c53202b60..0000000000 --- a/app/src/main/res/drawable/link_color_48.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/drawable/lock_color_48.xml b/app/src/main/res/drawable/lock_color_48.xml deleted file mode 100644 index 0dd82a324d..0000000000 --- a/app/src/main/res/drawable/lock_color_48.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - diff --git a/app/src/main/res/drawable/missing_thumbnail.xml b/app/src/main/res/drawable/missing_thumbnail.xml new file mode 100644 index 0000000000..130c3efda1 --- /dev/null +++ b/app/src/main/res/drawable/missing_thumbnail.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/drawable/number_color_48.xml b/app/src/main/res/drawable/number_color_48.xml deleted file mode 100644 index 9ee7d9c842..0000000000 --- a/app/src/main/res/drawable/number_color_48.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - diff --git a/app/src/main/res/drawable/symbol_album_compact_bold_16.xml b/app/src/main/res/drawable/symbol_album_compact_bold_16.xml new file mode 100644 index 0000000000..a23d8b1222 --- /dev/null +++ b/app/src/main/res/drawable/symbol_album_compact_bold_16.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_arrow_down_tint_24.xml b/app/src/main/res/drawable/symbol_arrow_down_tint_24.xml new file mode 100644 index 0000000000..862b6da2b9 --- /dev/null +++ b/app/src/main/res/drawable/symbol_arrow_down_tint_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_arrow_right_24.xml b/app/src/main/res/drawable/symbol_arrow_right_24.xml new file mode 100644 index 0000000000..fd74d60b42 --- /dev/null +++ b/app/src/main/res/drawable/symbol_arrow_right_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/symbol_block_16.xml b/app/src/main/res/drawable/symbol_block_16.xml new file mode 100644 index 0000000000..6cbc444693 --- /dev/null +++ b/app/src/main/res/drawable/symbol_block_16.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/symbol_block_24.xml b/app/src/main/res/drawable/symbol_block_24.xml new file mode 100644 index 0000000000..17dc5c451f --- /dev/null +++ b/app/src/main/res/drawable/symbol_block_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_caption_24.xml b/app/src/main/res/drawable/symbol_caption_24.xml new file mode 100644 index 0000000000..6491f07976 --- /dev/null +++ b/app/src/main/res/drawable/symbol_caption_24.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/symbol_chat_fill_24.xml b/app/src/main/res/drawable/symbol_chat_fill_24.xml new file mode 100644 index 0000000000..28047c1b99 --- /dev/null +++ b/app/src/main/res/drawable/symbol_chat_fill_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_check_circle_fill_24.xml b/app/src/main/res/drawable/symbol_check_circle_fill_24.xml new file mode 100644 index 0000000000..424b509e30 --- /dev/null +++ b/app/src/main/res/drawable/symbol_check_circle_fill_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_check_square_compact_20.xml b/app/src/main/res/drawable/symbol_check_square_compact_20.xml new file mode 100644 index 0000000000..df67976558 --- /dev/null +++ b/app/src/main/res/drawable/symbol_check_square_compact_20.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_check_white_48.xml b/app/src/main/res/drawable/symbol_check_white_48.xml new file mode 100644 index 0000000000..865dd86791 --- /dev/null +++ b/app/src/main/res/drawable/symbol_check_white_48.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_chevron_down_24.xml b/app/src/main/res/drawable/symbol_chevron_down_24.xml new file mode 100644 index 0000000000..e300419e90 --- /dev/null +++ b/app/src/main/res/drawable/symbol_chevron_down_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_chevron_left_16.xml b/app/src/main/res/drawable/symbol_chevron_left_16.xml new file mode 100644 index 0000000000..da621f4f2e --- /dev/null +++ b/app/src/main/res/drawable/symbol_chevron_left_16.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/symbol_chevron_up_24.xml b/app/src/main/res/drawable/symbol_chevron_up_24.xml new file mode 100644 index 0000000000..09de6950f0 --- /dev/null +++ b/app/src/main/res/drawable/symbol_chevron_up_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_connections_24.xml b/app/src/main/res/drawable/symbol_connections_24.xml index fb4e987dd8..5103337dcc 100644 --- a/app/src/main/res/drawable/symbol_connections_24.xml +++ b/app/src/main/res/drawable/symbol_connections_24.xml @@ -1,24 +1,24 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M7.95 1.25C5.88 1.25 4.2 2.93 4.2 5c0 2.07 1.68 3.75 3.75 3.75 2.07 0 3.75-1.68 3.75-3.75 0-2.07-1.68-3.75-3.75-3.75ZM5.95 5c0-1.1 0.9-2 2-2s2 0.9 2 2-0.9 2-2 2-2-0.9-2-2Z"/> + android:pathData="M7.95 15.25c-2.07 0-3.75 1.68-3.75 3.75 0 2.07 1.68 3.75 3.75 3.75 2.07 0 3.75-1.68 3.75-3.75 0-2.07-1.68-3.75-3.75-3.75Zm-2 3.75c0-1.1 0.9-2 2-2s2 0.9 2 2-0.9 2-2 2-2-0.9-2-2Z"/> + android:pathData="M12.3 5c0-2.07 1.68-3.75 3.75-3.75 2.07 0 3.75 1.68 3.75 3.75 0 2.07-1.68 3.75-3.75 3.75-2.07 0-3.75-1.68-3.75-3.75Zm3.75-2c-1.1 0-2 0.9-2 2s0.9 2 2 2 2-0.9 2-2-0.9-2-2-2Z"/> + android:pathData="M16.05 15.25c-2.07 0-3.75 1.68-3.75 3.75 0 2.07 1.68 3.75 3.75 3.75 2.07 0 3.75-1.68 3.75-3.75 0-2.07-1.68-3.75-3.75-3.75Zm-2 3.75c0-1.1 0.9-2 2-2s2 0.9 2 2-0.9 2-2 2-2-0.9-2-2Z"/> + android:pathData="M16.38 12c0-2.07 1.67-3.75 3.75-3.75 2.07 0 3.75 1.68 3.75 3.75 0 2.07-1.68 3.75-3.75 3.75-2.08 0-3.75-1.68-3.75-3.75Zm3.75-2c-1.11 0-2 0.9-2 2s0.89 2 2 2c1.1 0 2-0.9 2-2s-0.9-2-2-2Z"/> + android:pathData="M3.88 8.25C1.8 8.25 0.13 9.93 0.13 12c0 2.07 1.67 3.75 3.75 3.75 2.07 0 3.75-1.68 3.75-3.75 0-2.07-1.68-3.75-3.75-3.75Zm-2 3.75c0-1.1 0.89-2 2-2 1.1 0 2 0.9 2 2s-0.9 2-2 2c-1.11 0-2-0.9-2-2Z"/> diff --git a/app/src/main/res/drawable/symbol_data_bold_24.xml b/app/src/main/res/drawable/symbol_data_bold_24.xml new file mode 100644 index 0000000000..910fb3d3d1 --- /dev/null +++ b/app/src/main/res/drawable/symbol_data_bold_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_dropdown_triangle_24.xml b/app/src/main/res/drawable/symbol_dropdown_triangle_24.xml new file mode 100644 index 0000000000..61d3abb2b7 --- /dev/null +++ b/app/src/main/res/drawable/symbol_dropdown_triangle_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_edit_white_24.xml b/app/src/main/res/drawable/symbol_edit_white_24.xml new file mode 100644 index 0000000000..bceba41ca0 --- /dev/null +++ b/app/src/main/res/drawable/symbol_edit_white_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/symbol_error_circle_fill_16.xml b/app/src/main/res/drawable/symbol_error_circle_fill_16.xml new file mode 100644 index 0000000000..00ba6e098a --- /dev/null +++ b/app/src/main/res/drawable/symbol_error_circle_fill_16.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_error_triangle_fill_24.xml b/app/src/main/res/drawable/symbol_error_triangle_fill_24.xml new file mode 100644 index 0000000000..7b528c4399 --- /dev/null +++ b/app/src/main/res/drawable/symbol_error_triangle_fill_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_error_triangle_fill_32.xml b/app/src/main/res/drawable/symbol_error_triangle_fill_32.xml new file mode 100644 index 0000000000..ae636547de --- /dev/null +++ b/app/src/main/res/drawable/symbol_error_triangle_fill_32.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_heart_compact_bold_16.xml b/app/src/main/res/drawable/symbol_heart_compact_bold_16.xml new file mode 100644 index 0000000000..2c83e9d2ad --- /dev/null +++ b/app/src/main/res/drawable/symbol_heart_compact_bold_16.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_key_24.xml b/app/src/main/res/drawable/symbol_key_24.xml new file mode 100644 index 0000000000..c0996ce8bf --- /dev/null +++ b/app/src/main/res/drawable/symbol_key_24.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_keyboard_24.xml b/app/src/main/res/drawable/symbol_keyboard_24.xml new file mode 100644 index 0000000000..e8390a6f58 --- /dev/null +++ b/app/src/main/res/drawable/symbol_keyboard_24.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/symbol_leave_24.xml b/app/src/main/res/drawable/symbol_leave_24.xml new file mode 100644 index 0000000000..568d033669 --- /dev/null +++ b/app/src/main/res/drawable/symbol_leave_24.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_link_slash_16.xml b/app/src/main/res/drawable/symbol_link_slash_16.xml new file mode 100644 index 0000000000..93f717b2df --- /dev/null +++ b/app/src/main/res/drawable/symbol_link_slash_16.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/symbol_location_white_24.xml b/app/src/main/res/drawable/symbol_location_white_24.xml new file mode 100644 index 0000000000..457840435b --- /dev/null +++ b/app/src/main/res/drawable/symbol_location_white_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_lock_compact_20.xml b/app/src/main/res/drawable/symbol_lock_compact_20.xml new file mode 100644 index 0000000000..14be5a8e4f --- /dev/null +++ b/app/src/main/res/drawable/symbol_lock_compact_20.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_lock_white_48.xml b/app/src/main/res/drawable/symbol_lock_white_48.xml new file mode 100644 index 0000000000..1241cdb5a8 --- /dev/null +++ b/app/src/main/res/drawable/symbol_lock_white_48.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_messagestatus_delivered_24.xml b/app/src/main/res/drawable/symbol_messagestatus_delivered_24.xml new file mode 100644 index 0000000000..9f72985338 --- /dev/null +++ b/app/src/main/res/drawable/symbol_messagestatus_delivered_24.xml @@ -0,0 +1,20 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/symbol_messagestatus_read_24.xml b/app/src/main/res/drawable/symbol_messagestatus_read_24.xml new file mode 100644 index 0000000000..bf89f552d4 --- /dev/null +++ b/app/src/main/res/drawable/symbol_messagestatus_read_24.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/drawable/symbol_messagestatus_sending_24.xml b/app/src/main/res/drawable/symbol_messagestatus_sending_24.xml new file mode 100644 index 0000000000..3e139c0fcc --- /dev/null +++ b/app/src/main/res/drawable/symbol_messagestatus_sending_24.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/symbol_messagestatus_sent_24.xml b/app/src/main/res/drawable/symbol_messagestatus_sent_24.xml new file mode 100644 index 0000000000..7d390954e1 --- /dev/null +++ b/app/src/main/res/drawable/symbol_messagestatus_sent_24.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/drawable/symbol_number_24.xml b/app/src/main/res/drawable/symbol_number_24.xml new file mode 100644 index 0000000000..1c4c48b212 --- /dev/null +++ b/app/src/main/res/drawable/symbol_number_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_number_pad_24.xml b/app/src/main/res/drawable/symbol_number_pad_24.xml new file mode 100644 index 0000000000..b43c69abdb --- /dev/null +++ b/app/src/main/res/drawable/symbol_number_pad_24.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/symbol_person_display_40.xml b/app/src/main/res/drawable/symbol_person_display_40.xml new file mode 100644 index 0000000000..24f27b6e5b --- /dev/null +++ b/app/src/main/res/drawable/symbol_person_display_40.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_phone_fill_24.xml b/app/src/main/res/drawable/symbol_phone_fill_24.xml new file mode 100644 index 0000000000..341b2d8d25 --- /dev/null +++ b/app/src/main/res/drawable/symbol_phone_fill_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_phone_fill_white_24.xml b/app/src/main/res/drawable/symbol_phone_fill_white_24.xml new file mode 100644 index 0000000000..f9d8a852e0 --- /dev/null +++ b/app/src/main/res/drawable/symbol_phone_fill_white_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_photo_slash_24.xml b/app/src/main/res/drawable/symbol_photo_slash_24.xml new file mode 100644 index 0000000000..01569947ab --- /dev/null +++ b/app/src/main/res/drawable/symbol_photo_slash_24.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/symbol_recent_compact_bold_16.xml b/app/src/main/res/drawable/symbol_recent_compact_bold_16.xml new file mode 100644 index 0000000000..6fc21220ff --- /dev/null +++ b/app/src/main/res/drawable/symbol_recent_compact_bold_16.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/drawable/symbol_spam_16.xml b/app/src/main/res/drawable/symbol_spam_16.xml new file mode 100644 index 0000000000..9e382372ca --- /dev/null +++ b/app/src/main/res/drawable/symbol_spam_16.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/symbol_spam_24.xml b/app/src/main/res/drawable/symbol_spam_24.xml new file mode 100644 index 0000000000..2dab928bcc --- /dev/null +++ b/app/src/main/res/drawable/symbol_spam_24.xml @@ -0,0 +1,15 @@ + + + + + diff --git a/app/src/main/res/drawable/symbol_thread_16.xml b/app/src/main/res/drawable/symbol_thread_16.xml new file mode 100644 index 0000000000..6fc31c6cdb --- /dev/null +++ b/app/src/main/res/drawable/symbol_thread_16.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_thread_compact_bold_16.xml b/app/src/main/res/drawable/symbol_thread_compact_bold_16.xml new file mode 100644 index 0000000000..463cc29729 --- /dev/null +++ b/app/src/main/res/drawable/symbol_thread_compact_bold_16.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/symbol_trash_compact_20.xml b/app/src/main/res/drawable/symbol_trash_compact_20.xml new file mode 100644 index 0000000000..9e5c71349c --- /dev/null +++ b/app/src/main/res/drawable/symbol_trash_compact_20.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/drawable/symbol_x_white_24.xml b/app/src/main/res/drawable/symbol_x_white_24.xml new file mode 100644 index 0000000000..d06acd653b --- /dev/null +++ b/app/src/main/res/drawable/symbol_x_white_24.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/symbol_x_white_48.xml b/app/src/main/res/drawable/symbol_x_white_48.xml new file mode 100644 index 0000000000..e569bef6f0 --- /dev/null +++ b/app/src/main/res/drawable/symbol_x_white_48.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/webrtc_call_screen_answer.xml b/app/src/main/res/drawable/webrtc_call_screen_answer.xml index 125e498ddb..32a726ff9a 100644 --- a/app/src/main/res/drawable/webrtc_call_screen_answer.xml +++ b/app/src/main/res/drawable/webrtc_call_screen_answer.xml @@ -3,7 +3,7 @@ diff --git a/app/src/main/res/layout/activity_shared_contact_details.xml b/app/src/main/res/layout/activity_shared_contact_details.xml index 5cd697c1c3..b65556f0ef 100644 --- a/app/src/main/res/layout/activity_shared_contact_details.xml +++ b/app/src/main/res/layout/activity_shared_contact_details.xml @@ -99,7 +99,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="6dp" android:tint="?attr/colorAccent" - android:src="@drawable/message_24dp"/> + android:src="@drawable/symbol_chat_fill_24"/> + android:src="@drawable/symbol_phone_fill_24"/> + android:layout_height="match_parent" + tools:viewBindingIgnore="true"> + app:title="@string/AddMembersActivity__add_members" + app:titleTextAppearance="@style/Signal.Text.Title" /> + android:layout_marginBottom="12dp" + android:minHeight="44dp" + app:cfv_autoFocus="false" /> \ No newline at end of file diff --git a/app/src/main/res/layout/audio_view_circle_small.xml b/app/src/main/res/layout/audio_view_circle_small.xml index f7ec83b203..a57d94583a 100644 --- a/app/src/main/res/layout/audio_view_circle_small.xml +++ b/app/src/main/res/layout/audio_view_circle_small.xml @@ -41,7 +41,7 @@ android:clickable="true" android:contentDescription="@string/audio_view__download_accessibility_description" android:focusable="true" - android:src="@drawable/ic_download_circle_fill_white_48dp" + android:src="@drawable/download_attachment" android:visibility="gone" /> \ No newline at end of file diff --git a/app/src/main/res/layout/audio_view_draft_circle.xml b/app/src/main/res/layout/audio_view_draft_circle.xml index 78fd9bccaa..67585aed05 100644 --- a/app/src/main/res/layout/audio_view_draft_circle.xml +++ b/app/src/main/res/layout/audio_view_draft_circle.xml @@ -49,7 +49,7 @@ android:clickable="true" android:contentDescription="@string/audio_view__download_accessibility_description" android:focusable="true" - android:src="@drawable/ic_download_circle_fill_white_48dp" + android:src="@drawable/download_attachment" android:visibility="gone" /> \ No newline at end of file diff --git a/app/src/main/res/layout/bio_preference_item.xml b/app/src/main/res/layout/bio_preference_item.xml index ef3c36d31f..56a0a6c0d3 100644 --- a/app/src/main/res/layout/bio_preference_item.xml +++ b/app/src/main/res/layout/bio_preference_item.xml @@ -1,20 +1,20 @@ + android:minHeight="56dp" + tools:viewBindingIgnore="true"> + tools:text="+1 (999) 555-1234" /> + android:visibility="gone" + tools:text="miles.07" /> + + + app:iconTint="@color/signal_colorOnSurface" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/call_screen_pending_participants_view.xml b/app/src/main/res/layout/call_screen_pending_participants_view.xml index d66d1c0307..021b58d7db 100644 --- a/app/src/main/res/layout/call_screen_pending_participants_view.xml +++ b/app/src/main/res/layout/call_screen_pending_participants_view.xml @@ -4,11 +4,12 @@ --> \ No newline at end of file diff --git a/app/src/main/res/layout/chat_wallpaper_crop_activity.xml b/app/src/main/res/layout/chat_wallpaper_crop_activity.xml index 3c70ab7b2b..312a6b4f3c 100644 --- a/app/src/main/res/layout/chat_wallpaper_crop_activity.xml +++ b/app/src/main/res/layout/chat_wallpaper_crop_activity.xml @@ -131,7 +131,7 @@ android:text="@string/DateUtils_just_now" android:textAppearance="@style/Signal.Text.Caption" android:textColor="@color/transparent_white_80" - app:drawableEndCompat="@drawable/ic_delivery_status_read" + app:drawableEndCompat="@drawable/symbol_messagestatus_read_24" app:drawableTint="@color/transparent_white_80" /> diff --git a/app/src/main/res/layout/chat_wallpaper_preview_activity.xml b/app/src/main/res/layout/chat_wallpaper_preview_activity.xml index 6d2ed7336f..6651b89dd9 100644 --- a/app/src/main/res/layout/chat_wallpaper_preview_activity.xml +++ b/app/src/main/res/layout/chat_wallpaper_preview_activity.xml @@ -121,7 +121,7 @@ android:text="@string/DateUtils_just_now" android:textAppearance="@style/Signal.Text.Caption" android:textColor="@color/transparent_white_80" - app:drawableEndCompat="@drawable/ic_delivery_status_read" + app:drawableEndCompat="@drawable/symbol_messagestatus_read_24" app:drawableTint="@color/core_white" /> diff --git a/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml b/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml deleted file mode 100644 index 306cb47128..0000000000 --- a/app/src/main/res/layout/choose_a_new_default_sms_app_fragment.xml +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/circular_progress_material_button.xml b/app/src/main/res/layout/circular_progress_material_button.xml index 2886e7a34b..03964d71a7 100644 --- a/app/src/main/res/layout/circular_progress_material_button.xml +++ b/app/src/main/res/layout/circular_progress_material_button.xml @@ -1,16 +1,17 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:parentTag="org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton" + tools:viewBindingIgnore="true"> + android:layout_gravity="center_horizontal" + app:indicatorInset="2dp" /> + android:orientation="vertical" + tools:viewBindingIgnore="true"> + android:minHeight="44sp" + app:cfv_autoFocus="false" /> + + + + + + diff --git a/app/src/main/res/layout/contact_selection_find_by_username_item.xml b/app/src/main/res/layout/contact_selection_find_by_username_item.xml new file mode 100644 index 0000000000..7ea90b9451 --- /dev/null +++ b/app/src/main/res/layout/contact_selection_find_by_username_item.xml @@ -0,0 +1,41 @@ + + + + + + + diff --git a/app/src/main/res/layout/conversation_header_view.xml b/app/src/main/res/layout/conversation_header_view.xml index de150c6d76..d86b25b368 100644 --- a/app/src/main/res/layout/conversation_header_view.xml +++ b/app/src/main/res/layout/conversation_header_view.xml @@ -142,11 +142,27 @@ android:textAppearance="@style/Signal.Text.BodyMedium" android:visibility="gone" app:layout_constrainedWidth="true" - app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintBottom_toTopOf="@+id/message_request_button" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/message_request_subtitle" - tools:text="Member of NYC Rock Climbers, Dinner Party and Friends" /> + app:layout_goneMarginTop="0dp" + tools:text="Member of NYC Rock Climbers, Dinner Party and Friends" + tools:visibility="visible" /> + + diff --git a/app/src/main/res/layout/conversation_list_item_view.xml b/app/src/main/res/layout/conversation_list_item_view.xml index 4500674edf..6d2a4182e5 100644 --- a/app/src/main/res/layout/conversation_list_item_view.xml +++ b/app/src/main/res/layout/conversation_list_item_view.xml @@ -57,7 +57,7 @@ app:layout_constraintStart_toEndOf="@id/conversation_list_item_check_container" app:layout_constraintTop_toTopOf="@id/conversation_list_item_name" app:layout_goneMarginStart="0dp" - tools:src="@drawable/ic_contact_picture" /> + tools:src="@tools:sample/avatars" /> + app:fallbackImageSize="small" /> diff --git a/app/src/main/res/layout/create_group_activity.xml b/app/src/main/res/layout/create_group_activity.xml index 71dbef2662..f22de9cad2 100644 --- a/app/src/main/res/layout/create_group_activity.xml +++ b/app/src/main/res/layout/create_group_activity.xml @@ -1,12 +1,12 @@ + android:orientation="vertical" + tools:viewBindingIgnore="true"> diff --git a/app/src/main/res/layout/device_add_fragment.xml b/app/src/main/res/layout/device_add_fragment.xml index fd1d77c884..51fbf06a4d 100644 --- a/app/src/main/res/layout/device_add_fragment.xml +++ b/app/src/main/res/layout/device_add_fragment.xml @@ -44,15 +44,16 @@ + app:layout_constraintTop_toTopOf="parent" + android:transitionName="devices" /> diff --git a/app/src/main/res/layout/edit_profile_fragment.xml b/app/src/main/res/layout/edit_profile_fragment.xml index 802910cb95..dc2c9e1c97 100644 --- a/app/src/main/res/layout/edit_profile_fragment.xml +++ b/app/src/main/res/layout/edit_profile_fragment.xml @@ -93,9 +93,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="@dimen/dsl_settings_gutter" - android:layout_marginTop="14dp" + android:layout_marginTop="16dp" android:layout_marginEnd="@dimen/dsl_settings_gutter" android:text="@string/ManageProfileFragment__edit_photo" + android:textColor="@color/signal_colorOnSurface" + app:backgroundTint="@color/signal_colorSurface4" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/manage_profile_avatar_background" /> diff --git a/app/src/main/res/layout/export_sms_complete_fragment.xml b/app/src/main/res/layout/export_sms_complete_fragment.xml deleted file mode 100644 index c998755a39..0000000000 --- a/app/src/main/res/layout/export_sms_complete_fragment.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/export_sms_full_error_fragment.xml b/app/src/main/res/layout/export_sms_full_error_fragment.xml deleted file mode 100644 index d6af75a1ea..0000000000 --- a/app/src/main/res/layout/export_sms_full_error_fragment.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/export_sms_partially_complete_fragment.xml b/app/src/main/res/layout/export_sms_partially_complete_fragment.xml deleted file mode 100644 index d8149bd83b..0000000000 --- a/app/src/main/res/layout/export_sms_partially_complete_fragment.xml +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/export_your_sms_messages_fragment.xml b/app/src/main/res/layout/export_your_sms_messages_fragment.xml deleted file mode 100644 index 6ed011f3a1..0000000000 --- a/app/src/main/res/layout/export_your_sms_messages_fragment.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/exporting_sms_messages_fragment.xml b/app/src/main/res/layout/exporting_sms_messages_fragment.xml deleted file mode 100644 index 7963b1d1ff..0000000000 --- a/app/src/main/res/layout/exporting_sms_messages_fragment.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_registration_country_picker.xml b/app/src/main/res/layout/fragment_registration_country_picker.xml index f7f1fc1cbb..616d234a2e 100644 --- a/app/src/main/res/layout/fragment_registration_country_picker.xml +++ b/app/src/main/res/layout/fragment_registration_country_picker.xml @@ -12,7 +12,7 @@ android:id="@+id/country_search" android:layout_width="fill_parent" android:layout_height="wrap_content" - android:drawableStart="@drawable/ic_menu_search_holo_light" + android:drawableStart="@drawable/symbol_search_24" android:hint="@string/country_selection_fragment__search" app:drawableTint="@color/signal_icon_tint_primary" /> diff --git a/app/src/main/res/layout/item_selectable_contact_field.xml b/app/src/main/res/layout/item_selectable_contact_field.xml index 9dbce997ac..d6037a08f6 100644 --- a/app/src/main/res/layout/item_selectable_contact_field.xml +++ b/app/src/main/res/layout/item_selectable_contact_field.xml @@ -29,7 +29,7 @@ android:layout_marginStart="24dp" android:contentDescription="@string/ContactShareEditActivity__avatar" android:visibility="gone" - tools:src="@drawable/ic_contact_picture" + tools:src="@tools:sample/avatars" tools:visibility="visible" /> \ No newline at end of file diff --git a/app/src/main/res/layout/main_activity_list_host_fragment.xml b/app/src/main/res/layout/main_activity_list_host_fragment.xml index 2648b85ecd..46430c7bfc 100644 --- a/app/src/main/res/layout/main_activity_list_host_fragment.xml +++ b/app/src/main/res/layout/main_activity_list_host_fragment.xml @@ -38,7 +38,7 @@ app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:src="@drawable/ic_contact_picture" /> + tools:src="@tools:sample/avatars" /> - diff --git a/app/src/main/res/layout/message_details_header.xml b/app/src/main/res/layout/message_details_header.xml index d62aef7788..906c823bab 100644 --- a/app/src/main/res/layout/message_details_header.xml +++ b/app/src/main/res/layout/message_details_header.xml @@ -69,7 +69,8 @@ android:layout_gravity="center_vertical" android:text="@string/message_recipients_list_item__resend" android:visibility="gone" - app:icon="@drawable/ic_refresh_white_18dp" + app:icon="@drawable/symbol_refresh_24" + app:iconTint="@color/signal_colorOnPrimaryContainer" tools:visibility="visible" /> diff --git a/app/src/main/res/layout/message_details_recipient.xml b/app/src/main/res/layout/message_details_recipient.xml index a4e855ac07..1badae713a 100644 --- a/app/src/main/res/layout/message_details_recipient.xml +++ b/app/src/main/res/layout/message_details_recipient.xml @@ -31,7 +31,7 @@ app:layout_constraintEnd_toStartOf="@+id/message_details_recipient_name" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - tools:src="@drawable/ic_contact_picture" /> + tools:src="@tools:sample/avatars" /> + tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" + tools:viewBindingIgnore="true"> - - - - - + app:layout_constraintStart_toStartOf="parent"> - + - + - + - + - + + + - - - - - - - - - - - - - - +
diff --git a/spinner/lib/src/main/assets/query.hbs b/spinner/lib/src/main/assets/query.hbs index 441cdc09d3..6e87f52fb3 100644 --- a/spinner/lib/src/main/assets/query.hbs +++ b/spinner/lib/src/main/assets/query.hbs @@ -54,9 +54,10 @@ {{> partials/suffix}} - - - + + + + diff --git a/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt b/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt index 44841805e0..11441fdd35 100644 --- a/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt +++ b/video/app/src/main/java/org/thoughtcrime/video/app/MainActivity.kt @@ -7,6 +7,7 @@ package org.thoughtcrime.video.app import android.content.Context import android.content.Intent +import android.content.SharedPreferences import android.media.MediaScannerConnection import android.os.Bundle import android.os.Environment @@ -14,11 +15,21 @@ import androidx.activity.compose.setContent import androidx.appcompat.app.AppCompatActivity import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Checkbox import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import org.signal.core.util.logging.AndroidLogger import org.signal.core.util.logging.Log import org.thoughtcrime.video.app.playback.PlaybackTestActivity import org.thoughtcrime.video.app.transcode.TranscodeTestActivity @@ -29,30 +40,87 @@ import org.thoughtcrime.video.app.ui.theme.SignalTheme * Main activity for this sample app. */ class MainActivity : AppCompatActivity() { - private val TAG = Log.tag(MainActivity::class.java) + companion object { + private val TAG = Log.tag(MainActivity::class.java) + private var appLaunch = true + } + + private val sharedPref: SharedPreferences by lazy { + getSharedPreferences( + getString(R.string.preference_file_key), + Context.MODE_PRIVATE + ) + } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val startPlaybackScreen = Intent(this, PlaybackTestActivity::class.java) - val startTranscodeScreen = Intent(this, TranscodeTestActivity::class.java) + Log.initialize(AndroidLogger()) + + val startPlaybackScreen = { saveChoice: Boolean -> proceed(Screen.TEST_PLAYBACK, saveChoice) } + val startTranscodeScreen = { saveChoice: Boolean -> proceed(Screen.TEST_TRANSCODE, saveChoice) } setContent { - SignalTheme { - Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { - Column( - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally + Body(startPlaybackScreen, startTranscodeScreen) + } + refreshMediaProviderForExternalStorage(this, arrayOf("video/*")) + if (appLaunch) { + appLaunch = false + getLaunchChoice()?.let { + proceed(it, false) + } + } + } + + @Composable + private fun Body(startPlaybackScreen: (Boolean) -> Unit, startTranscodeScreen: (Boolean) -> Unit) { + var rememberChoice by remember { mutableStateOf(getLaunchChoice() != null) } + SignalTheme { + Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background) { + Column( + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + LabeledButton("Test Playback") { + startPlaybackScreen(rememberChoice) + } + LabeledButton("Test Transcode") { + startTranscodeScreen(rememberChoice) + } + Row( + verticalAlignment = Alignment.CenterVertically ) { - LabeledButton("Test Playback") { startActivity(startPlaybackScreen) } - LabeledButton("Test Transcode") { startActivity(startTranscodeScreen) } + Checkbox( + checked = rememberChoice, + onCheckedChange = { isChecked -> + rememberChoice = isChecked + if (!isChecked) { + clearLaunchChoice() + } + } + ) + Text(text = "Remember & Skip This Screen", style = MaterialTheme.typography.labelLarge) } } } } } - override fun onStart() { - super.onStart() - refreshMediaProviderForExternalStorage(this, arrayOf("video/*")) + private fun getLaunchChoice(): Screen? { + val screenName = sharedPref.getString(getString(R.string.preference_activity_shortcut_key), null) ?: return null + return Screen.valueOf(screenName) + } + + private fun clearLaunchChoice() { + with(sharedPref.edit()) { + remove(getString(R.string.preference_activity_shortcut_key)) + apply() + } + } + + private fun saveLaunchChoice(choice: Screen) { + with(sharedPref.edit()) { + putString(getString(R.string.preference_activity_shortcut_key), choice.name) + apply() + } } private fun refreshMediaProviderForExternalStorage(context: Context, mimeTypes: Array) { @@ -65,4 +133,25 @@ class MainActivity : AppCompatActivity() { Log.i(TAG, "Re-scan of external storage for media completed.") } } + + private fun proceed(screen: Screen, saveChoice: Boolean) { + if (saveChoice) { + saveLaunchChoice(screen) + } + when (screen) { + Screen.TEST_PLAYBACK -> startActivity(Intent(this, PlaybackTestActivity::class.java)) + Screen.TEST_TRANSCODE -> startActivity(Intent(this, TranscodeTestActivity::class.java)) + } + } + + private enum class Screen { + TEST_PLAYBACK, + TEST_TRANSCODE + } + + @Preview + @Composable + private fun PreviewBody() { + Body({}, {}) + } } diff --git a/video/app/src/main/java/org/thoughtcrime/video/app/transcode/TranscodeWorker.kt b/video/app/src/main/java/org/thoughtcrime/video/app/transcode/TranscodeWorker.kt index a764ff1335..5316780c87 100644 --- a/video/app/src/main/java/org/thoughtcrime/video/app/transcode/TranscodeWorker.kt +++ b/video/app/src/main/java/org/thoughtcrime/video/app/transcode/TranscodeWorker.kt @@ -36,6 +36,8 @@ import java.time.Instant * A WorkManager worker to transcode videos in the background. This utilizes [StreamingTranscoder]. */ class TranscodeWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker(ctx, params) { + private var lastProgress = 0 + @UnstableApi override suspend fun doWork(): Result { val logPrefix = "[Job ${id.toString().takeLast(4)}]" @@ -84,9 +86,9 @@ class TranscodeWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker( } val transcoder = if (resolution > 0 && desiredBitrate > 0) { - StreamingTranscoder(datasource, null, desiredBitrate, resolution) + StreamingTranscoder(datasource, null, desiredBitrate, resolution, false) } else { - StreamingTranscoder(datasource, null, DEFAULT_FILE_SIZE_LIMIT) + StreamingTranscoder(datasource, null, DEFAULT_FILE_SIZE_LIMIT, true) } setForeground(createForegroundInfo(-1, notificationId)) @@ -95,10 +97,13 @@ class TranscodeWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker( Log.w(TAG, "$logPrefix Could not open temp file for I/O!") return Result.failure() } - transcoder.transcode({ percent: Int -> - setProgressAsync(Data.Builder().putInt(KEY_PROGRESS, percent).build()) - setForegroundAsync(createForegroundInfo(percent, notificationId)) + if (lastProgress != percent) { + lastProgress = percent + Log.v(TAG, "$logPrefix Updating progress percent to $percent%") + setProgressAsync(Data.Builder().putInt(KEY_PROGRESS, percent).build()) + setForegroundAsync(createForegroundInfo(percent, notificationId)) + } }, outputStream, { isStopped }) } Log.v(TAG, "$logPrefix Initial transcode completed successfully!") @@ -165,6 +170,7 @@ class TranscodeWorker(ctx: Context, params: WorkerParameters) : CoroutineWorker( .setSmallIcon(R.drawable.ic_notification) .setOngoing(true) .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_LOW) .addAction(android.R.drawable.ic_delete, cancel, intent) .build() diff --git a/video/app/src/main/res/values/strings.xml b/video/app/src/main/res/values/strings.xml index 6534313baf..789bee530b 100644 --- a/video/app/src/main/res/values/strings.xml +++ b/video/app/src/main/res/values/strings.xml @@ -10,4 +10,6 @@ Cancel Transcoding progress updates. Persistent notifications that allow the transcode job to complete when the app is in the background. + settings + activity_shortcut \ No newline at end of file diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java index d5e8ea11ab..99d27fd8a5 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/StreamingTranscoder.java @@ -39,17 +39,20 @@ public final class StreamingTranscoder { private final boolean transcodeRequired; private final long fileSizeEstimate; private final @Nullable TranscoderOptions options; + private final boolean allowAudioRemux; /** * @param upperSizeLimit A upper size to transcode to. The actual output size can be up to 10% smaller. */ public StreamingTranscoder(@NonNull MediaDataSource dataSource, @Nullable TranscoderOptions options, - long upperSizeLimit) + long upperSizeLimit, + boolean allowAudioRemux) throws IOException, VideoSourceException { this.dataSource = dataSource; this.options = options; + this.allowAudioRemux = allowAudioRemux; final MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); try { @@ -81,11 +84,13 @@ public StreamingTranscoder(@NonNull MediaDataSource dataSource, public StreamingTranscoder(@NonNull MediaDataSource dataSource, @Nullable TranscoderOptions options, int videoBitrate, - int shortEdge) + int shortEdge, + boolean allowAudioRemux) throws IOException, VideoSourceException { - this.dataSource = dataSource; - this.options = options; + this.dataSource = dataSource; + this.options = options; + this.allowAudioRemux = allowAudioRemux; final MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever(); try { @@ -142,7 +147,7 @@ public void transcode(@NonNull Progress progress, final long startTime = System.currentTimeMillis(); - final MediaConverter converter = new MediaConverter(); + final MediaConverter converter = new MediaConverter(); converter.setInput(new MediaDataSourceMediaInput(dataSource)); final CountingOutputStream outStream; @@ -155,6 +160,7 @@ public void transcode(@NonNull Progress progress, converter.setVideoResolution(targetQuality.getOutputResolution()); converter.setVideoBitrate(targetQuality.getTargetVideoBitRate()); converter.setAudioBitrate(targetQuality.getTargetAudioBitRate()); + converter.setAllowAudioRemux(allowAudioRemux); if (options != null) { if (options.endTimeUs > 0) { diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/interfaces/Muxer.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/interfaces/Muxer.java index a88f4054b7..918dd3de69 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/interfaces/Muxer.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/interfaces/Muxer.java @@ -24,4 +24,6 @@ public interface Muxer { void writeSampleData(int trackIndex, @NonNull ByteBuffer byteBuf, @NonNull MediaCodec.BufferInfo bufferInfo) throws IOException; void release(); + + boolean supportsAudioRemux(); } diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AndroidMuxer.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AndroidMuxer.java index d44ae864c7..bfc7333784 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AndroidMuxer.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AndroidMuxer.java @@ -51,4 +51,9 @@ public void writeSampleData(final int trackIndex, final @NonNull ByteBuffer byte public void release() { muxer.release(); } + + @Override + public boolean supportsAudioRemux() { + return false; + } } diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AudioTrackConverter.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AudioTrackConverter.java index 8d938ae906..a597702d83 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AudioTrackConverter.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/AudioTrackConverter.java @@ -1,5 +1,6 @@ package org.thoughtcrime.securesms.video.videoconverter; +import android.annotation.SuppressLint; import android.media.MediaCodec; import android.media.MediaCodecInfo; import android.media.MediaExtractor; @@ -27,7 +28,8 @@ final class AudioTrackConverter { private static final String OUTPUT_AUDIO_MIME_TYPE = VideoConstants.AUDIO_MIME_TYPE; // Advanced Audio Coding private static final int OUTPUT_AUDIO_AAC_PROFILE = MediaCodecInfo.CodecProfileLevel.AACObjectLC; //MediaCodecInfo.CodecProfileLevel.AACObjectHE; - private static final int TIMEOUT_USEC = 10000; + private static final int SAMPLE_BUFFER_SIZE = 16 * 1024; + private static final int TIMEOUT_USEC = 10000; private final long mTimeFrom; private final long mTimeTo; @@ -39,6 +41,9 @@ final class AudioTrackConverter { private final MediaCodec mAudioDecoder; private final MediaCodec mAudioEncoder; + private final ByteBuffer instanceSampleBuffer = ByteBuffer.allocateDirect(SAMPLE_BUFFER_SIZE); + private final MediaCodec.BufferInfo instanceBufferInfo = new MediaCodec.BufferInfo(); + private final ByteBuffer[] mAudioDecoderInputBuffers; private ByteBuffer[] mAudioDecoderOutputBuffers; private final ByteBuffer[] mAudioEncoderInputBuffers; @@ -51,8 +56,9 @@ final class AudioTrackConverter { boolean mAudioExtractorDone; private boolean mAudioDecoderDone; boolean mAudioEncoderDone; + private boolean skipTrancode; - private int mOutputAudioTrack = -1; + private int mOutputAudioTrack = -1; private int mPendingAudioDecoderOutputBufferIndex = -1; long mMuxingAudioPresentationTime; @@ -68,7 +74,8 @@ AudioTrackConverter create( final @NonNull MediaInput input, final long timeFrom, final long timeTo, - final int audioBitrate) throws IOException { + final int audioBitrate, + final boolean allowSkipTranscode) throws IOException { final MediaExtractor audioExtractor = input.createExtractor(); final int audioInputTrack = getAndSelectAudioTrackIndex(audioExtractor); @@ -76,7 +83,7 @@ AudioTrackConverter create( audioExtractor.release(); return null; } - return new AudioTrackConverter(audioExtractor, audioInputTrack, timeFrom, timeTo, audioBitrate); + return new AudioTrackConverter(audioExtractor, audioInputTrack, timeFrom, timeTo, audioBitrate, allowSkipTranscode); } private AudioTrackConverter( @@ -84,7 +91,8 @@ private AudioTrackConverter( final int audioInputTrack, long timeFrom, long timeTo, - int audioBitrate) throws IOException { + int audioBitrate, + final boolean allowSkipTranscode) throws IOException { mTimeFrom = timeFrom; mTimeTo = timeTo; @@ -102,6 +110,13 @@ private AudioTrackConverter( final MediaFormat inputAudioFormat = mAudioExtractor.getTrackFormat(audioInputTrack); mInputDuration = inputAudioFormat.containsKey(MediaFormat.KEY_DURATION) ? inputAudioFormat.getLong(MediaFormat.KEY_DURATION) : 0; + skipTrancode = allowSkipTranscode && formatCanSkipTranscode(inputAudioFormat, audioBitrate); + if (skipTrancode) { + mEncoderOutputAudioFormat = inputAudioFormat; + } + + if (VERBOSE) Log.d(TAG, "audio skipping transcoding: " + skipTrancode); + final MediaFormat outputAudioFormat = MediaFormat.createAudioFormat( OUTPUT_AUDIO_MIME_TYPE, @@ -109,7 +124,7 @@ private AudioTrackConverter( inputAudioFormat.getInteger(MediaFormat.KEY_CHANNEL_COUNT)); outputAudioFormat.setInteger(MediaFormat.KEY_BIT_RATE, audioBitrate); outputAudioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, OUTPUT_AUDIO_AAC_PROFILE); - outputAudioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, 16 * 1024); + outputAudioFormat.setInteger(MediaFormat.KEY_MAX_INPUT_SIZE, SAMPLE_BUFFER_SIZE); // Create a MediaCodec for the desired codec, then configure it as an encoder with // our desired properties. Request a Surface to use for input. @@ -135,9 +150,11 @@ void setMuxer(final @NonNull Muxer muxer) throws IOException { if (mEncoderOutputAudioFormat != null) { Log.d(TAG, "muxer: adding audio track."); if (!mEncoderOutputAudioFormat.containsKey(MediaFormat.KEY_BIT_RATE)) { + Log.d(TAG, "muxer: fixed MediaFormat to add bitrate."); mEncoderOutputAudioFormat.setInteger(MediaFormat.KEY_BIT_RATE, mAudioBitrate); } if (!mEncoderOutputAudioFormat.containsKey(MediaFormat.KEY_AAC_PROFILE)) { + Log.d(TAG, "muxer: fixed MediaFormat to add AAC profile."); mEncoderOutputAudioFormat.setInteger(MediaFormat.KEY_AAC_PROFILE, OUTPUT_AUDIO_AAC_PROFILE); } mOutputAudioTrack = muxer.addTrack(mEncoderOutputAudioFormat); @@ -145,6 +162,17 @@ void setMuxer(final @NonNull Muxer muxer) throws IOException { } void step() throws IOException { + + if (skipTrancode && mEncoderOutputAudioFormat != null) { + try { + extractAndRemux(); + return; + } catch (IllegalArgumentException e) { + Log.w(TAG, "Remuxer threw an exception! Disabling remux.", e); + skipTrancode = false; + } + } + // Extract audio from file and feed to decoder. // Do not extract audio if we have determined the output format but we are not yet // ready to mux the frames. @@ -164,7 +192,8 @@ void step() throws IOException { Log.d(TAG, "audio extractor: returned buffer of size " + size); Log.d(TAG, "audio extractor: returned buffer for time " + presentationTime); } - mAudioExtractorDone = size < 0 || (mTimeTo > 0 && presentationTime > mTimeTo * 1000); + mAudioExtractorDone = isAudioExtractorDone(size, presentationTime); + if (mAudioExtractorDone) { if (VERBOSE) Log.d(TAG, "audio extractor: EOS"); mAudioDecoder.queueInputBuffer( @@ -388,6 +417,47 @@ void verifyEndState() { Preconditions.checkState("no frame should be pending", -1 == mPendingAudioDecoderOutputBufferIndex); } + @SuppressLint("WrongConstant") // flags extracted from sample by MediaExtractor should be safe for MediaCodec.BufferInfo + private void extractAndRemux() throws IOException { + if (mMuxer == null) { + Log.d(TAG, "audio remuxer: tried to execute before muxer was ready"); + return; + } + int size = mAudioExtractor.readSampleData(instanceSampleBuffer, 0); + long presentationTime = mAudioExtractor.getSampleTime(); + int sampleFlags = mAudioExtractor.getSampleFlags(); + if (VERBOSE) { + Log.d(TAG, "audio extractor: returned buffer of size " + size); + Log.d(TAG, "audio extractor: returned buffer for time " + presentationTime); + Log.d(TAG, "audio extractor: returned buffer with flags " + Integer.toBinaryString(sampleFlags)); + } + mAudioExtractorDone = isAudioExtractorDone(size, presentationTime); + + if (mAudioExtractorDone) { + if (VERBOSE) Log.d(TAG, "audio encoder: EOS"); + instanceBufferInfo.set(0, 0, presentationTime, MediaCodec.BUFFER_FLAG_END_OF_STREAM); + mAudioEncoderDone = true; + } else { + instanceBufferInfo.set(0, size, presentationTime, sampleFlags); + } + + mMuxer.writeSampleData(mOutputAudioTrack, instanceSampleBuffer, instanceBufferInfo); + + if (VERBOSE) { + Log.d(TAG, "audio extractor: wrote sample at " + presentationTime); + } + + mAudioExtractor.advance(); + + mAudioExtractedFrameCount++; + mAudioEncodedFrameCount++; + mMuxingAudioPresentationTime = Math.max(mMuxingAudioPresentationTime, presentationTime); + } + + private boolean isAudioExtractorDone(int size, long presentationTime) { + return presentationTime == -1 || size < 0 || (mTimeTo > 0 && presentationTime > mTimeTo * 1000); + } + private static @NonNull MediaCodec createAudioDecoder(final @NonNull MediaFormat inputFormat) throws IOException { final MediaCodec decoder = MediaCodec.createDecoderByType(MediaConverter.getMimeTypeFor(inputFormat)); @@ -420,4 +490,23 @@ private static int getAndSelectAudioTrackIndex(MediaExtractor extractor) { private static boolean isAudioFormat(final @NonNull MediaFormat format) { return MediaConverter.getMimeTypeFor(format).startsWith("audio/"); } + + /** + * HE-AAC input bitstreams exhibit bad decoder behavior: the decoder's output buffer's presentation timestamp is way larger than the input sample's. + * This mismatch propagates throughout the transcoding pipeline and results in slowed, distorted audio in the output file. + * To sidestep this: AAC and its variants are a supported output codec, and HE-AAC bitrates are almost always lower than our target bitrate, + * so we can pass through the input bitstream unaltered, relying on consumers of the output file to render HE-AAC correctly. + */ + private static boolean formatCanSkipTranscode(MediaFormat audioFormat, int desiredBitrate) { + try { + int inputBitrate = audioFormat.getInteger(MediaFormat.KEY_BIT_RATE); + String inputMimeType = audioFormat.getString(MediaFormat.KEY_MIME); + return OUTPUT_AUDIO_MIME_TYPE.equals(inputMimeType) && inputBitrate <= desiredBitrate; + } catch (NullPointerException exception) { + if (VERBOSE) { + Log.d(TAG, "could not find bitrate in mediaFormat, can't skip transcoding."); + } + return false; + } + } } diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/MediaConverter.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/MediaConverter.java index 628d946fed..7d780d50ea 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/MediaConverter.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/MediaConverter.java @@ -63,6 +63,7 @@ public final class MediaConverter { private int mVideoBitrate = 2000000; // 2Mbps private @VideoCodec String mVideoCodec = VIDEO_CODEC_H264; private int mAudioBitrate = 128000; // 128Kbps + private boolean mAllowAudioRemux = false; private Listener mListener; private boolean mCancelled; @@ -131,6 +132,10 @@ public void setListener(final Listener listener) { mListener = listener; } + public void setAllowAudioRemux(boolean allow) { + mAllowAudioRemux = allow; + } + @WorkerThread @RequiresApi(23) public void convert() throws EncodingException, IOException { @@ -141,15 +146,15 @@ public void convert() throws EncodingException, IOException { AudioTrackConverter audioTrackConverter = null; try { + muxer = mOutput.createMuxer(); + videoTrackConverter = VideoTrackConverter.create(mInput, mTimeFrom, mTimeTo, mVideoResolution, mVideoBitrate, mVideoCodec); - audioTrackConverter = AudioTrackConverter.create(mInput, mTimeFrom, mTimeTo, mAudioBitrate); + audioTrackConverter = AudioTrackConverter.create(mInput, mTimeFrom, mTimeTo, mAudioBitrate, mAllowAudioRemux && muxer.supportsAudioRemux()); if (videoTrackConverter == null && audioTrackConverter == null) { throw new EncodingException("No video and audio tracks"); } - muxer = mOutput.createMuxer(); - doExtractDecodeEditEncodeMux( videoTrackConverter, audioTrackConverter, diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/AacTrack.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/AacTrack.java index 5cefe5db51..a37a454bf9 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/AacTrack.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/AacTrack.java @@ -4,6 +4,7 @@ import org.mp4parser.boxes.iso14496.part1.objectdescriptors.AudioSpecificConfig; import org.mp4parser.boxes.iso14496.part1.objectdescriptors.DecoderConfigDescriptor; +import org.mp4parser.boxes.iso14496.part1.objectdescriptors.DecoderSpecificInfo; import org.mp4parser.boxes.iso14496.part1.objectdescriptors.ESDescriptor; import org.mp4parser.boxes.iso14496.part1.objectdescriptors.SLConfigDescriptor; import org.mp4parser.boxes.iso14496.part12.SampleDescriptionBox; @@ -16,6 +17,8 @@ import java.io.IOException; import java.nio.ByteBuffer; +import androidx.annotation.Nullable; + abstract class AacTrack extends AbstractStreamingTrack { private static final SparseIntArray SAMPLING_FREQUENCY_INDEX_MAP = new SparseIntArray(); @@ -39,7 +42,7 @@ abstract class AacTrack extends AbstractStreamingTrack { private int sampleRate; - AacTrack(long avgBitrate, long maxBitrate, int sampleRate, int channelCount, int aacProfile) { + AacTrack(long avgBitrate, long maxBitrate, int sampleRate, int channelCount, int aacProfile, @Nullable DecoderSpecificInfo decoderSpecificInfo) { this.sampleRate = sampleRate; final DefaultSampleFlagsTrackExtension defaultSampleFlagsTrackExtension = new DefaultSampleFlagsTrackExtension(); @@ -83,6 +86,10 @@ abstract class AacTrack extends AbstractStreamingTrack { audioSpecificConfig.setChannelConfiguration(channelCount); decoderConfigDescriptor.setAudioSpecificInfo(audioSpecificConfig); + if (decoderSpecificInfo != null) { + decoderConfigDescriptor.setDecoderSpecificInfo(decoderSpecificInfo); + } + descriptor.setDecoderConfigDescriptor(decoderConfigDescriptor); esds.setEsDescriptor(descriptor); diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/StreamingMuxer.java b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/StreamingMuxer.java index 3ad40595d2..bb6c9d7f10 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/StreamingMuxer.java +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/muxer/StreamingMuxer.java @@ -4,9 +4,13 @@ import android.media.MediaFormat; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import org.mp4parser.boxes.iso14496.part1.objectdescriptors.DecoderSpecificInfo; import org.mp4parser.streaming.StreamingTrack; +import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.video.interfaces.Muxer; +import org.thoughtcrime.securesms.video.videoconverter.utils.MediaCodecCompat; import java.io.IOException; import java.io.OutputStream; @@ -16,7 +20,7 @@ import java.util.List; public final class StreamingMuxer implements Muxer { - + private static final String TAG = Log.tag(StreamingMuxer.class); private final OutputStream outputStream; private final List tracks = new ArrayList<>(); private Mp4Writer mp4Writer; @@ -55,7 +59,7 @@ public int addTrack(@NonNull MediaFormat format) throws IOException { tracks.add(new MediaCodecAvcTrack(format)); break; case "audio/mp4a-latm": - tracks.add(new MediaCodecAacTrack(format)); + tracks.add(MediaCodecAacTrack.create(format)); break; case "video/hevc": tracks.add(new MediaCodecHevcTrack(format)); @@ -75,6 +79,11 @@ public void writeSampleData(int trackIndex, @NonNull ByteBuffer byteBuf, @NonNul public void release() { } + @Override + public boolean supportsAudioRemux() { + return true; + } + interface MediaCodecTrack { void writeSampleData(@NonNull ByteBuffer byteBuf, @NonNull MediaCodec.BufferInfo bufferInfo) throws IOException; @@ -123,10 +132,43 @@ public void finish() throws IOException { static class MediaCodecAacTrack extends AacTrack implements MediaCodecTrack { - MediaCodecAacTrack(@NonNull MediaFormat format) { - super(format.getInteger(MediaFormat.KEY_BIT_RATE), format.getInteger(MediaFormat.KEY_BIT_RATE), - format.getInteger(MediaFormat.KEY_SAMPLE_RATE), format.getInteger(MediaFormat.KEY_CHANNEL_COUNT), - format.getInteger(MediaFormat.KEY_AAC_PROFILE)); + private MediaCodecAacTrack(long avgBitrate, long maxBitrate, int sampleRate, int channelCount, int aacProfile, @Nullable DecoderSpecificInfo decoderSpecificInfo) { + super(avgBitrate, maxBitrate, sampleRate, channelCount, aacProfile, decoderSpecificInfo); + } + + public static MediaCodecAacTrack create(@NonNull MediaFormat format) { + final int bitrate = format.getInteger(MediaFormat.KEY_BIT_RATE); + final int maxBitrate; + if (format.containsKey(MediaCodecCompat.MEDIA_FORMAT_KEY_MAX_BIT_RATE)) { + maxBitrate = format.getInteger(MediaCodecCompat.MEDIA_FORMAT_KEY_MAX_BIT_RATE); + } else { + maxBitrate = bitrate; + } + + final DecoderSpecificInfo filledDecoderSpecificInfo; + if (format.containsKey(MediaCodecCompat.MEDIA_FORMAT_KEY_MAX_BIT_RATE)) { + final ByteBuffer csd = format.getByteBuffer(MediaCodecCompat.MEDIA_FORMAT_KEY_CODEC_SPECIFIC_DATA_0); + + DecoderSpecificInfo decoderSpecificInfo = new DecoderSpecificInfo(); + boolean parseSuccess = false; + try { + decoderSpecificInfo.parseDetail(csd); + parseSuccess = true; + } catch (IOException e) { + Log.w(TAG, "Could not parse AAC codec-specific data!", e); + } + if (parseSuccess) { + filledDecoderSpecificInfo = decoderSpecificInfo; + } else { + filledDecoderSpecificInfo = null; + } + } else { + filledDecoderSpecificInfo = null; + } + + return new MediaCodecAacTrack(bitrate, maxBitrate, + format.getInteger(MediaFormat.KEY_SAMPLE_RATE), format.getInteger(MediaFormat.KEY_CHANNEL_COUNT), + format.getInteger(MediaFormat.KEY_AAC_PROFILE), filledDecoderSpecificInfo); } @Override diff --git a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/utils/MediaCodecCompat.kt b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/utils/MediaCodecCompat.kt index d41c678ebd..931c2784bc 100644 --- a/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/utils/MediaCodecCompat.kt +++ b/video/lib/src/main/java/org/thoughtcrime/securesms/video/videoconverter/utils/MediaCodecCompat.kt @@ -17,6 +17,13 @@ import java.io.IOException object MediaCodecCompat { private const val TAG = "MediaDataSourceCompat" + const val MEDIA_FORMAT_KEY_MAX_BIT_RATE = "max-bitrate" + + // https://developer.android.com/reference/android/media/MediaCodec#CSD + const val MEDIA_FORMAT_KEY_CODEC_SPECIFIC_DATA_0 = "csd-0" + const val MEDIA_FORMAT_KEY_CODEC_SPECIFIC_DATA_1 = "csd-1" + const val MEDIA_FORMAT_KEY_CODEC_SPECIFIC_DATA_2 = "csd-2" + @JvmStatic fun findDecoder(inputFormat: MediaFormat): Pair { val codecs = MediaCodecList(MediaCodecList.REGULAR_CODECS)