From e92c76434e04810816d8a5e22989a6ed8dcb4f26 Mon Sep 17 00:00:00 2001
From: moiseev-signal <122060238+moiseev-signal@users.noreply.github.com>
Date: Thu, 4 Apr 2024 08:24:09 -0700
Subject: [PATCH 01/33] Upgrade to libsignal-client 0.44.0
---
dependencies.gradle.kts | 2 +-
gradle/verification-metadata.xml | 20 +++++++++----------
.../api/services/CdsiV2Service.java | 4 +---
3 files changed, 12 insertions(+), 14 deletions(-)
diff --git a/dependencies.gradle.kts b/dependencies.gradle.kts
index 6ec379cc7a..7425b277c4 100644
--- a/dependencies.gradle.kts
+++ b/dependencies.gradle.kts
@@ -15,7 +15,7 @@ dependencyResolutionManagement {
version("exoplayer", "2.19.0")
version("glide", "4.15.1")
version("kotlin", "1.8.10")
- version("libsignal-client", "0.42.0")
+ version("libsignal-client", "0.44.0")
version("mp4parser", "1.9.39")
version("android-gradle-plugin", "8.0.2")
version("accompanist", "0.28.0")
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index b643178019..ac7b8f07b8 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -5703,20 +5703,20 @@ https://docs.gradle.org/current/userguide/dependency_verification.html
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java
index e16519a202..3d12006215 100644
--- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java
+++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java
@@ -49,8 +49,6 @@ public final class CdsiV2Service {
private static final UUID EMPTY_UUID = new UUID(0, 0);
private static final int RESPONSE_ITEM_SIZE = 8 + 16 + 16; // 1 uint64 + 2 UUIDs
- private static final Duration LIBSIGNAL_CDSI_TIMEOUT = Duration.ofSeconds(10);
-
private final CdsiRequestHandler cdsiRequestHandler;
public CdsiV2Service(SignalServiceConfiguration configuration, String mrEnclave, @Nullable Network network) {
@@ -59,7 +57,7 @@ public CdsiV2Service(SignalServiceConfiguration configuration, String mrEnclave,
this.cdsiRequestHandler = (username, password, request, tokenSaver) -> {
try {
Log.i(TAG, "Starting CDSI lookup via libsignal-net");
- Future cdsiRequest = network.cdsiLookup(username, password, buildLibsignalRequest(request), LIBSIGNAL_CDSI_TIMEOUT, tokenSaver);
+ Future cdsiRequest = network.cdsiLookup(username, password, buildLibsignalRequest(request), tokenSaver);
return Single.fromFuture(cdsiRequest).map(CdsiV2Service::parseLibsignalResponse).toObservable();
} catch (Exception exception) {
return Observable.error(exception);
From dbf8a7ca875f3036de17bad55ab637d9f7a6e9eb Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Thu, 4 Apr 2024 11:41:24 -0400
Subject: [PATCH 02/33] Rotate libsignal-net flag.
---
.../main/java/org/thoughtcrime/securesms/util/FeatureFlags.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 0d35fd06ff..98f1d76ca2 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
@@ -123,7 +123,7 @@ public final class FeatureFlags {
private static final String RETRY_RECEIPT_MAX_COUNT = "android.retryReceipt.maxCount";
private static final String RETRY_RECEIPT_MAX_COUNT_RESET_AGE = "android.retryReceipt.maxCountResetAge";
private static final String PREKEY_FORCE_REFRESH_INTERVAL = "android.prekeyForceRefreshInterval";
- private static final String CDSI_LIBSIGNAL_NET = "android.cds.libsignal.2";
+ private static final String CDSI_LIBSIGNAL_NET = "android.cds.libsignal.3";
private static final String RX_MESSAGE_SEND = "android.rxMessageSend";
private static final String LINKED_DEVICE_LIFESPAN_SECONDS = "android.linkedDeviceLifespanSeconds";
private static final String MESSAGE_BACKUPS = "android.messageBackups";
From 16588c401ed77fb69aeaf8ca8c1622c2a96c3a1b Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Thu, 4 Apr 2024 11:53:05 -0400
Subject: [PATCH 03/33] Reduce verbosity of WebRtcViewModel event logging
during calls.
---
.../securesms/WebRtcCallActivity.java | 4 ++-
.../securesms/events/CallParticipant.kt | 4 +++
.../securesms/events/CallParticipantId.java | 5 +++
.../securesms/events/WebRtcViewModel.kt | 36 +++++++++++++++++++
4 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java
index e5c34a8f92..8ede110fbb 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/WebRtcCallActivity.java
@@ -162,6 +162,7 @@ public class WebRtcCallActivity extends BaseActivity implements SafetyNumberChan
private ControlsAndInfoController controlsAndInfo;
private boolean enterPipOnResume;
private long lastProcessedIntentTimestamp;
+ private WebRtcViewModel previousEvent = null;
private Disposable ephemeralStateDisposable = Disposable.empty();
@@ -885,7 +886,8 @@ private void delayedFinish(int delayMillis) {
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventMainThread(@NonNull WebRtcViewModel event) {
- Log.i(TAG, "Got message from service: " + event);
+ Log.i(TAG, "Got message from service: " + event.describeDifference(previousEvent));
+ previousEvent = event;
viewModel.setRecipient(event.getRecipient());
callScreen.setRecipient(event.getRecipient());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt b/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt
index 5dbdf43971..456697e703 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipant.kt
@@ -79,6 +79,10 @@ data class CallParticipant(
return copy(handRaisedTimestamp = timestamp)
}
+ override fun toString(): String {
+ return "CallParticipant(callParticipantId=$callParticipantId, isForwardingVideo=$isForwardingVideo, isVideoEnabled=$isVideoEnabled, isMicrophoneEnabled=$isMicrophoneEnabled, handRaisedTimestamp=$handRaisedTimestamp, isMediaKeysReceived=$isMediaKeysReceived, isScreenSharing=$isScreenSharing)"
+ }
+
enum class DeviceOrdinal {
PRIMARY, SECONDARY
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipantId.java b/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipantId.java
index 6f38886f1e..3ee98e5049 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipantId.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/events/CallParticipantId.java
@@ -64,6 +64,11 @@ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeParcelable(recipientId, flags);
}
+ @Override
+ public @NonNull String toString() {
+ return "CallParticipantId(demuxId=" + demuxId + ", recipientId=" + recipientId + ')';
+ }
+
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
@Override
public CallParticipantId createFromParcel(Parcel in) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt
index 058714ee55..433bc66663 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt
@@ -124,6 +124,7 @@ class WebRtcViewModel(state: WebRtcServiceState) {
PeerConnection.AdapterType.VPN,
PeerConnection.AdapterType.LOOPBACK,
PeerConnection.AdapterType.ADAPTER_TYPE_ANY -> false
+
PeerConnection.AdapterType.CELLULAR,
PeerConnection.AdapterType.CELLULAR_2G,
PeerConnection.AdapterType.CELLULAR_3G,
@@ -157,4 +158,39 @@ class WebRtcViewModel(state: WebRtcServiceState) {
}
""".trimIndent()
}
+
+ fun describeDifference(previousEvent: WebRtcViewModel?): String {
+ return if (previousEvent == null) {
+ this.toString()
+ } else if (previousEvent == this) {
+ ""
+ } else {
+ val builder = StringBuilder()
+ if (state != previousEvent.state) builder.append(" state=$state\n")
+ if (recipient.id != previousEvent.recipient.id) builder.append(" recipient=${recipient.id}\n")
+ if (isRemoteVideoOffer != previousEvent.isRemoteVideoOffer) builder.append(" isRemoteVideoOffer=$isRemoteVideoOffer\n")
+ if (callConnectedTime != previousEvent.callConnectedTime) builder.append(" callConnectedTime=$callConnectedTime\n")
+ if (localParticipant != previousEvent.localParticipant) builder.append(" localParticipant=$localParticipant\n")
+ if (remoteParticipants != previousEvent.remoteParticipants) {
+ if (remoteParticipants.size <= 8) {
+ builder.append(" remoteParticipants=$remoteParticipants\n")
+ } else {
+ builder.append(" remoteParticipants=\n")
+ }
+ }
+ if (identityChangedParticipants != previousEvent.identityChangedParticipants) builder.append(" identityChangedParticipants=$identityChangedParticipants\n")
+ if (remoteDevicesCount != previousEvent.remoteDevicesCount) builder.append(" remoteDevicesCount=$remoteDevicesCount\n")
+ if (participantLimit != previousEvent.participantLimit) builder.append(" participantLimit=$participantLimit\n")
+ if (activeDevice != previousEvent.activeDevice) builder.append(" activeDevice=$activeDevice\n")
+ if (availableDevices != previousEvent.availableDevices) builder.append(" availableDevices=$availableDevices\n")
+ if (bluetoothPermissionDenied != previousEvent.bluetoothPermissionDenied) builder.append(" bluetoothPermissionDenied=$bluetoothPermissionDenied\n")
+ if (ringGroup != previousEvent.ringGroup) builder.append(" ringGroup=$ringGroup\n")
+
+ if (builder.isEmpty()) {
+ ""
+ } else {
+ "WebRtcViewModel {\n$builder}"
+ }
+ }
+ }
}
From dd28523b0523dbaee2499690ea58aee08b287fa1 Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Thu, 4 Apr 2024 11:53:29 -0400
Subject: [PATCH 04/33] Transition full screen call UX to terminal state when
call handled by linked device.
---
.../webrtc/CallParticipantsLayout.java | 8 ++++----
.../components/webrtc/CallParticipantsState.kt | 2 +-
.../webrtc/WebRtcCallParticipantsPage.java | 18 +++++++++---------
.../WebRtcCallParticipantsPagerAdapter.java | 2 +-
.../components/webrtc/WebRtcCallView.java | 2 +-
.../components/webrtc/WebRtcCallViewModel.java | 2 ++
.../components/webrtc/WebRtcControls.java | 7 ++++++-
.../securesms/events/WebRtcViewModel.kt | 3 +++
8 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsLayout.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsLayout.java
index dfeb82d538..ff8086d5d3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsLayout.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsLayout.java
@@ -34,7 +34,7 @@ public class CallParticipantsLayout extends FlexboxLayout {
private CallParticipant focusedParticipant = null;
private boolean shouldRenderInPip;
private boolean isPortrait;
- private boolean isIncomingRing;
+ private boolean hideAvatar;
private int navBarBottomInset;
private LayoutStrategy layoutStrategy;
@@ -54,7 +54,7 @@ void update(@NonNull List callParticipants,
@NonNull CallParticipant focusedParticipant,
boolean shouldRenderInPip,
boolean isPortrait,
- boolean isIncomingRing,
+ boolean hideAvatar,
int navBarBottomInset,
@NonNull LayoutStrategy layoutStrategy)
{
@@ -62,7 +62,7 @@ void update(@NonNull List callParticipants,
this.focusedParticipant = focusedParticipant;
this.shouldRenderInPip = shouldRenderInPip;
this.isPortrait = isPortrait;
- this.isIncomingRing = isIncomingRing;
+ this.hideAvatar = hideAvatar;
this.navBarBottomInset = navBarBottomInset;
this.layoutStrategy = layoutStrategy;
@@ -134,7 +134,7 @@ private void update(int index, int count, @NonNull CallParticipant participant)
callParticipantView.setBottomInset(navBarBottomInset);
}
- if (isIncomingRing) {
+ if (hideAvatar) {
callParticipantView.hideAvatar();
} else {
callParticipantView.showAvatar();
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsState.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsState.kt
index 8f2544dd40..a516d63534 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsState.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/CallParticipantsState.kt
@@ -49,7 +49,7 @@ data class CallParticipantsState(
val allRemoteParticipants: List = remoteParticipants.allParticipants
val isFolded: Boolean = foldableState.isFolded
val isLargeVideoGroup: Boolean = allRemoteParticipants.size > SMALL_GROUP_MAX && !isInPipMode && !isFolded
- val isIncomingRing: Boolean = callState == WebRtcViewModel.State.CALL_INCOMING
+ val hideAvatar: Boolean = callState.isIncomingOrHandledElsewhere
val raisedHands: List
get() {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPage.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPage.java
index eba951c4b9..af82bfd15d 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPage.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPage.java
@@ -16,7 +16,7 @@ class WebRtcCallParticipantsPage {
private final boolean isRenderInPip;
private final boolean isPortrait;
private final boolean isLandscapeEnabled;
- private final boolean isIncomingRing;
+ private final boolean hideAvatar;
private final int navBarBottomInset;
static WebRtcCallParticipantsPage forMultipleParticipants(@NonNull List callParticipants,
@@ -24,10 +24,10 @@ static WebRtcCallParticipantsPage forMultipleParticipants(@NonNull List callParticipan
boolean isRenderInPip,
boolean isPortrait,
boolean isLandscapeEnabled,
- boolean isIncomingRing,
+ boolean hideAvatar,
int navBarBottomInset)
{
this.callParticipants = callParticipants;
@@ -53,7 +53,7 @@ private WebRtcCallParticipantsPage(@NonNull List callParticipan
this.isRenderInPip = isRenderInPip;
this.isPortrait = isPortrait;
this.isLandscapeEnabled = isLandscapeEnabled;
- this.isIncomingRing = isIncomingRing;
+ this.hideAvatar = hideAvatar;
this.navBarBottomInset = navBarBottomInset;
}
@@ -77,8 +77,8 @@ public boolean isPortrait() {
return isPortrait;
}
- public boolean isIncomingRing() {
- return isIncomingRing;
+ public boolean shouldHideAvatar() {
+ return hideAvatar;
}
public int getNavBarBottomInset() {
@@ -98,7 +98,7 @@ public boolean equals(Object o) {
isRenderInPip == that.isRenderInPip &&
isPortrait == that.isPortrait &&
isLandscapeEnabled == that.isLandscapeEnabled &&
- isIncomingRing == that.isIncomingRing &&
+ hideAvatar == that.hideAvatar &&
callParticipants.equals(that.callParticipants) &&
focusedParticipant.equals(that.focusedParticipant) &&
navBarBottomInset == that.navBarBottomInset;
@@ -106,6 +106,6 @@ public boolean equals(Object o) {
@Override
public int hashCode() {
- return Objects.hash(callParticipants, focusedParticipant, isSpeaker, isRenderInPip, isPortrait, isLandscapeEnabled, isIncomingRing, navBarBottomInset);
+ return Objects.hash(callParticipants, focusedParticipant, isSpeaker, isRenderInPip, isPortrait, isLandscapeEnabled, hideAvatar, navBarBottomInset);
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPagerAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPagerAdapter.java
index 7412511261..05bf93bdfc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPagerAdapter.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsPagerAdapter.java
@@ -86,7 +86,7 @@ private MultipleParticipantViewHolder(@NonNull CallParticipantsLayout callPartic
@Override
void bind(WebRtcCallParticipantsPage page) {
- callParticipantsLayout.update(page.getCallParticipants(), page.getFocusedParticipant(), page.isRenderInPip(), page.isPortrait(), page.isIncomingRing(), page.getNavBarBottomInset(), page.getLayoutStrategy());
+ callParticipantsLayout.update(page.getCallParticipants(), page.getFocusedParticipant(), page.isRenderInPip(), page.isPortrait(), page.shouldHideAvatar(), page.getNavBarBottomInset(), page.getLayoutStrategy());
}
}
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 e6f6f2b07c..01565857a6 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
@@ -429,7 +429,7 @@ public void updateCallParticipants(@NonNull CallParticipantsViewState callPartic
List pages = new ArrayList<>(2);
if (!state.getGridParticipants().isEmpty()) {
- pages.add(WebRtcCallParticipantsPage.forMultipleParticipants(state.getGridParticipants(), state.getFocusedParticipant(), state.isInPipMode(), isPortrait, isLandscapeEnabled, state.isIncomingRing(), navBarBottomInset));
+ pages.add(WebRtcCallParticipantsPage.forMultipleParticipants(state.getGridParticipants(), state.getFocusedParticipant(), state.isInPipMode(), isPortrait, isLandscapeEnabled, state.getHideAvatar(), navBarBottomInset));
}
if (state.getFocusedParticipant() != CallParticipant.EMPTY && state.getAllRemoteParticipants().size() > 1) {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java
index 3170e6824e..a180777503 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java
@@ -416,6 +416,8 @@ private void updateWebRtcControls(@NonNull WebRtcViewModel.State state,
case CALL_ACCEPTED_ELSEWHERE:
case CALL_DECLINED_ELSEWHERE:
case CALL_ONGOING_ELSEWHERE:
+ callState = WebRtcControls.CallState.HANDLED_ELSEWHERE;
+ break;
case CALL_NEEDS_PERMISSION:
case CALL_BUSY:
case CALL_DISCONNECTED:
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java
index 518b66b520..7559176cb0 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java
@@ -105,7 +105,7 @@ private WebRtcControls() {
* This is only true at the very start of a call and will then never be true again
*/
public boolean hideControlsSheetInitially() {
- return displayIncomingCallButtons() || callState == CallState.NONE;
+ return displayIncomingCallButtons() || callState == CallState.NONE || isHandledElsewhere();
}
public boolean displayErrorControls() {
@@ -263,6 +263,10 @@ private boolean isIncoming() {
return callState == CallState.INCOMING;
}
+ private boolean isHandledElsewhere() {
+ return callState == CallState.HANDLED_ELSEWHERE;
+ }
+
private boolean isAtLeastOutgoing() {
return callState.isAtLeast(CallState.OUTGOING);
}
@@ -284,6 +288,7 @@ private int displayedButtonCount() {
public enum CallState {
NONE,
ERROR,
+ HANDLED_ELSEWHERE,
PRE_JOIN,
RECONNECTING,
INCOMING,
diff --git a/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt
index 433bc66663..58e5559b6f 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/events/WebRtcViewModel.kt
@@ -51,6 +51,9 @@ class WebRtcViewModel(state: WebRtcServiceState) {
val inOngoingCall: Boolean
get() = this == CALL_INCOMING || this == CALL_OUTGOING || this == CALL_CONNECTED || this == CALL_RINGING || this == CALL_RECONNECTING
+
+ val isIncomingOrHandledElsewhere
+ get() = this == CALL_INCOMING || this == CALL_ACCEPTED_ELSEWHERE || this == CALL_DECLINED_ELSEWHERE || this == CALL_ONGOING_ELSEWHERE
}
enum class GroupCallState {
From 76665c1f0db4a64311f83b3e15dd6c2fff4da834 Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Thu, 4 Apr 2024 12:13:16 -0400
Subject: [PATCH 05/33] Prevent excessive video toggling in group calls due to
server instability.
---
.../securesms/components/webrtc/CallParticipantView.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
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 55b4e04343..b650e586c6 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
@@ -164,7 +164,8 @@ void setCallParticipant(@NonNull CallParticipant participant) {
} else {
infoOverlay.setVisibility(View.GONE);
- boolean hasContentToRender = (participant.isVideoEnabled() || participant.isScreenSharing()) && participant.isForwardingVideo();
+ //TODO: [calling] SFU instability causes the forwarding video flag to alternate quickly, should restore after calling server update
+ boolean hasContentToRender = (participant.isVideoEnabled() || participant.isScreenSharing()); // && participant.isForwardingVideo();
rendererFrame.setVisibility(hasContentToRender ? View.VISIBLE : View.INVISIBLE);
renderer.setVisibility(hasContentToRender ? View.VISIBLE : View.INVISIBLE);
From d5bf16b91a50be2337b25fc3385005f5777d9862 Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Thu, 4 Apr 2024 16:16:28 -0400
Subject: [PATCH 06/33] Fix incorrect thread body adjustments containing media,
mentions, and styling.
---
.../securesms/database/ThreadBodyUtil.java | 51 +++++++++++++------
1 file changed, 35 insertions(+), 16 deletions(-)
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 530042c6a2..577e5a98b3 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadBodyUtil.java
@@ -21,6 +21,7 @@
import org.thoughtcrime.securesms.util.MessageRecordUtil;
import org.thoughtcrime.securesms.util.Util;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
@@ -57,15 +58,15 @@ private ThreadBodyUtil() {
String emoji = getStickerEmoji(record);
return format(context, record, emoji, R.string.ThreadRecord_sticker, bodyOverride);
} else if (MessageRecordUtil.hasGiftBadge(record)) {
- return format(EmojiStrings.GIFT, getGiftSummary(context, record));
+ return format(EmojiStrings.GIFT, getGiftSummary(context, record), null);
} else if (MessageRecordUtil.isStoryReaction(record)) {
return new ThreadBody(getStoryReactionSummary(context, record));
} else if (record.isPaymentNotification()) {
- return format(EmojiStrings.CARD, context.getString(R.string.ThreadRecord_payment));
+ return format(EmojiStrings.CARD, context.getString(R.string.ThreadRecord_payment), null);
} else if (record.isPaymentsRequestToActivate()) {
- return format(EmojiStrings.CARD, getPaymentActivationRequestSummary(context, record));
+ return format(EmojiStrings.CARD, getPaymentActivationRequestSummary(context, record), null);
} else if (record.isPaymentsActivated()) {
- return format(EmojiStrings.CARD, getPaymentActivatedSummary(context, record));
+ return format(EmojiStrings.CARD, getPaymentActivatedSummary(context, record), null);
} else if (record.isCallLog() && !record.isGroupCall()) {
return new ThreadBody(getCallLogSummary(context, record));
} else if (MessageRecordUtil.isScheduled(record)) {
@@ -166,18 +167,28 @@ private ThreadBodyUtil() {
@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);
+ CharSequence body;
+ List adjustments = null;
+
+ if (!TextUtils.isEmpty(bodyOverride)) {
+ body = bodyOverride;
+ } else if (TextUtils.isEmpty(record.getBody())) {
+ body = context.getString(defaultStringRes);
+ } else {
+ ThreadBody threadBody = getBody(context, record);
+ body = threadBody.getBody();
+ adjustments = threadBody.getBodyAdjustments();
+ }
+
+ return format(emoji, body, adjustments);
}
- private static @NonNull ThreadBody format(@NonNull CharSequence prefix, @NonNull CharSequence body) {
+ private static @NonNull ThreadBody format(@NonNull CharSequence prefix, @NonNull CharSequence body, @Nullable List adjustments) {
SpannableStringBuilder builder = new SpannableStringBuilder();
builder.append(prefix)
.append(" ")
.append(body);
- return new ThreadBody(builder, prefix.length() + 1);
+ return new ThreadBody(builder, prefix.length() + 1, adjustments != null ? adjustments : Collections.emptyList());
}
private static @NonNull ThreadBody getBody(@NonNull Context context, @NonNull MessageRecord record) {
@@ -198,16 +209,24 @@ public static class ThreadBody {
private final List bodyAdjustments;
public ThreadBody(@NonNull CharSequence body) {
- this(body, 0);
+ this(body, 0, Collections.emptyList());
}
- public ThreadBody(@NonNull CharSequence body, int startOffset) {
- this(body, startOffset == 0 ? Collections.emptyList() : Collections.singletonList(new BodyAdjustment(0, 0, startOffset)));
+ public ThreadBody(@NonNull CharSequence body, @NonNull List bodyAdjustments) {
+ this(body, 0, bodyAdjustments);
}
- public ThreadBody(@NonNull CharSequence body, @NonNull List bodyAdjustments) {
- this.body = body;
- this.bodyAdjustments = bodyAdjustments;
+ public ThreadBody(@NonNull CharSequence body, int startOffset, @NonNull List bodyAdjustments) {
+ this.body = body;
+ if (startOffset == 0) {
+ this.bodyAdjustments = bodyAdjustments;
+ } else {
+ ArrayList updatedAdjustments = new ArrayList<>(bodyAdjustments.size() + 1);
+ updatedAdjustments.add(new BodyAdjustment(0, 0, startOffset));
+ updatedAdjustments.addAll(bodyAdjustments);
+
+ this.bodyAdjustments = updatedAdjustments;
+ }
}
public @NonNull CharSequence getBody() {
From 7447ed2eac45ff2371cd5f6a154e86aa82409d05 Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Thu, 4 Apr 2024 16:43:59 -0400
Subject: [PATCH 07/33] Add the ability to jump to a specific date in search.
---
.../ConversationSearchBottomBar.java | 9 ++
.../conversation/v2/ConversationFragment.kt | 68 ++++++++--
.../conversation/v2/ConversationRepository.kt | 11 +-
.../conversation/v2/ConversationViewModel.kt | 20 ++-
.../conversation/v2/JumpToDateValidator.kt | 126 ++++++++++++++++++
.../securesms/database/MessageTable.kt | 35 +++--
.../drawable/symbol_calendar_search_24.xml | 12 ++
.../res/layout/conversation_search_nav.xml | 13 ++
.../java/org/signal/core/util/Stopwatch.kt | 12 ++
9 files changed, 283 insertions(+), 23 deletions(-)
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/JumpToDateValidator.kt
create mode 100644 app/src/main/res/drawable/symbol_calendar_search_24.xml
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java
index 843dcd9312..0749791429 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationSearchBottomBar.java
@@ -22,6 +22,7 @@ public class ConversationSearchBottomBar extends ConstraintLayout {
private View searchUp;
private TextView searchPositionText;
private View progressWheel;
+ private View jumpToDateButton;
private EventListener eventListener;
@@ -42,6 +43,7 @@ protected void onFinishInflate() {
this.searchDown = findViewById(R.id.conversation_search_down);
this.searchPositionText = findViewById(R.id.conversation_search_position);
this.progressWheel = findViewById(R.id.conversation_search_progress_wheel);
+ this.jumpToDateButton = findViewById(R.id.conversation_jump_to_date_button);
}
public void setData(int position, int count) {
@@ -65,6 +67,12 @@ public void setData(int position, int count) {
searchPositionText.setText(R.string.ConversationActivity_no_results);
}
+ jumpToDateButton.setOnClickListener(v -> {
+ if (eventListener != null) {
+ eventListener.onDatePickerSelected();
+ }
+ });
+
setViewEnabled(searchUp, position < (count - 1));
setViewEnabled(searchDown, position > 0);
}
@@ -85,5 +93,6 @@ public void setEventListener(@Nullable EventListener eventListener) {
public interface EventListener {
void onSearchMoveUpPressed();
void onSearchMoveDownPressed();
+ void onDatePickerSelected();
}
}
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 1b29b4fefe..416dd94718 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
@@ -67,6 +67,8 @@ 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.datepicker.CalendarConstraints
+import com.google.android.material.datepicker.MaterialDatePicker
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.BaseTransientBottomBar.Duration
import com.google.android.material.snackbar.Snackbar
@@ -305,6 +307,8 @@ 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.atMidnight
+import org.thoughtcrime.securesms.util.atUTC
import org.thoughtcrime.securesms.util.createActivityViewModel
import org.thoughtcrime.securesms.util.doAfterNextLayout
import org.thoughtcrime.securesms.util.fragments.requireListener
@@ -314,12 +318,14 @@ import org.thoughtcrime.securesms.util.hasGiftBadge
import org.thoughtcrime.securesms.util.hasNonTextSlide
import org.thoughtcrime.securesms.util.isValidReactionTarget
import org.thoughtcrime.securesms.util.savedStateViewModel
+import org.thoughtcrime.securesms.util.toMillis
import org.thoughtcrime.securesms.util.viewModel
import org.thoughtcrime.securesms.util.views.Stub
import org.thoughtcrime.securesms.util.visible
import org.thoughtcrime.securesms.verify.VerifyIdentityActivity
import org.thoughtcrime.securesms.wallpaper.ChatWallpaper
import org.thoughtcrime.securesms.wallpaper.ChatWallpaperDimLevelUtil
+import java.time.LocalDateTime
import java.util.Locale
import java.util.Optional
import java.util.concurrent.ExecutionException
@@ -1616,7 +1622,7 @@ class ConversationFragment :
if (result.results.isNotEmpty()) {
val messageResult = result.results[result.position]
disposables += viewModel
- .moveToSearchResult(messageResult)
+ .moveToDate(messageResult.receivedTimestampMs)
.observeOn(AndroidSchedulers.mainThread())
.subscribeBy {
moveToPosition(it)
@@ -2457,6 +2463,16 @@ class ConversationFragment :
return isScrolledToBottom() || layoutManager.findFirstVisibleItemPosition() <= 0
}
+ private fun closeChatSearch() {
+ isSearchRequested = false
+ searchViewModel.onSearchClosed()
+ searchNav.visible = false
+ inputPanel.setHideForSearch(false)
+ viewModel.setSearchQuery(null)
+ binding.conversationDisabledInput.visible = true
+ invalidateOptionsMenu()
+ }
+
/**
* Controls animation and visibility of the scrollDateHeader.
*/
@@ -3199,6 +3215,7 @@ class ConversationFragment :
searchNav.visible = true
searchNav.setData(0, 0)
inputPanel.setHideForSearch(true)
+ viewModel.onChatSearchOpened()
binding.conversationDisabledInput.visible = false
(0 until menu.size()).forEach {
@@ -3212,13 +3229,7 @@ class ConversationFragment :
override fun onMenuItemActionCollapse(item: MenuItem): Boolean {
searchView.setOnQueryTextListener(null)
- isSearchRequested = false
- searchViewModel.onSearchClosed()
- searchNav.visible = false
- inputPanel.setHideForSearch(false)
- binding.conversationDisabledInput.visible = true
- viewModel.setSearchQuery(null)
- invalidateOptionsMenu()
+ closeChatSearch()
return true
}
})
@@ -4153,6 +4164,47 @@ class ConversationFragment :
override fun onSearchMoveDownPressed() {
searchViewModel.onMoveDown()
}
+
+ override fun onDatePickerSelected() {
+ disposables += viewModel.getEarliestMessageDate().subscribe { earliestDate ->
+ val local = LocalDateTime.now()
+ .atMidnight()
+ .atUTC()
+ .toMillis()
+ val datePicker =
+ MaterialDatePicker.Builder
+ .datePicker()
+ .setTitleText(getString(R.string.ScheduleMessageTimePickerBottomSheet__select_date_title))
+ .setSelection(local)
+ .setCalendarConstraints(
+ CalendarConstraints.Builder()
+ .setValidator(viewModel.jumpToDateValidator)
+ .setStart(earliestDate)
+ .setEnd(local)
+ .build()
+ )
+ .build()
+
+ datePicker.addOnDismissListener {
+ datePicker.clearOnDismissListeners()
+ datePicker.clearOnPositiveButtonClickListeners()
+ }
+
+ datePicker.addOnPositiveButtonClickListener { selectedDate ->
+ if (selectedDate != null) {
+ disposables += viewModel
+ .moveToDate(selectedDate)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribeBy { position ->
+ moveToPosition(position - 1)
+ closeChatSearch()
+ }
+ }
+ }
+
+ datePicker.show(childFragmentManager, "DATE_PICKER")
+ }
+ }
}
private inner class ToolbarDependentMarginListener(private val toolbar: Toolbar) : ViewTreeObserver.OnGlobalLayoutListener {
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 896be87bbc..b0ee8e6ec1 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
@@ -86,7 +86,6 @@ import org.thoughtcrime.securesms.profiles.spoofing.ReviewUtil
import org.thoughtcrime.securesms.providers.BlobProvider
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
-import org.thoughtcrime.securesms.search.MessageResult
import org.thoughtcrime.securesms.sms.MessageSender
import org.thoughtcrime.securesms.sms.MessageSender.PreUploadResult
import org.thoughtcrime.securesms.util.BitmapUtil
@@ -265,9 +264,9 @@ class ConversationRepository(
}.subscribeOn(Schedulers.io())
}
- fun getMessageResultPosition(threadId: Long, messageResult: MessageResult): Single {
+ fun getMessageResultPosition(threadId: Long, receivedTimestamp: Long): Single {
return Single.fromCallable {
- SignalDatabase.messages.getMessagePositionInConversation(threadId, messageResult.receivedTimestampMs)
+ SignalDatabase.messages.getMessagePositionInConversation(threadId, receivedTimestamp)
}.subscribeOn(Schedulers.io())
}
@@ -580,6 +579,12 @@ class ConversationRepository(
}
}
+ fun getEarliestMessageDate(threadId: Long): Single {
+ return Single
+ .fromCallable { SignalDatabase.messages.getEarliestMessageDate(threadId) }
+ .subscribeOn(Schedulers.io())
+ }
+
/**
* Glide target for a contact photo which expects an error drawable, and publishes
* the result to the given emitter.
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 0814eba5ae..695744c056 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
@@ -64,7 +64,6 @@ import org.thoughtcrime.securesms.mms.Slide
import org.thoughtcrime.securesms.mms.SlideDeck
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.recipients.RecipientId
-import org.thoughtcrime.securesms.search.MessageResult
import org.thoughtcrime.securesms.sms.MessageSender
import org.thoughtcrime.securesms.util.BubbleUtil
import org.thoughtcrime.securesms.util.ConversationUtil
@@ -158,6 +157,10 @@ class ConversationViewModel(
private val startExpiration = BehaviorSubject.create()
+ private val _jumpToDateValidator: JumpToDateValidator by lazy { JumpToDateValidator(threadId) }
+ val jumpToDateValidator: JumpToDateValidator
+ get() = _jumpToDateValidator
+
init {
disposables += recipient
.subscribeBy {
@@ -312,8 +315,8 @@ class ConversationViewModel(
return repository.getQuotedMessagePosition(threadId, quote)
}
- fun moveToSearchResult(messageResult: MessageResult): Single {
- return repository.getMessageResultPosition(threadId, messageResult)
+ fun moveToDate(receivedTimestamp: Long): Single {
+ return repository.getMessageResultPosition(threadId, receivedTimestamp)
}
fun getNextMentionPosition(): Single {
@@ -507,4 +510,15 @@ class ConversationViewModel(
fun markLastSeen() {
repository.markLastSeen(threadId)
}
+
+ fun onChatSearchOpened() {
+ // Trigger the lazy load, so we can race initialization of the validator
+ _jumpToDateValidator
+ }
+
+ fun getEarliestMessageDate(): Single {
+ return repository
+ .getEarliestMessageDate(threadId)
+ .observeOn(AndroidSchedulers.mainThread())
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/JumpToDateValidator.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/JumpToDateValidator.kt
new file mode 100644
index 0000000000..78c3c9aa81
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/JumpToDateValidator.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2024 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.thoughtcrime.securesms.conversation.v2
+
+import com.google.android.material.datepicker.CalendarConstraints.DateValidator
+import kotlinx.parcelize.IgnoredOnParcel
+import kotlinx.parcelize.Parcelize
+import org.signal.core.util.concurrent.SignalExecutors
+import org.signal.core.util.logTime
+import org.signal.core.util.logging.Log
+import org.thoughtcrime.securesms.database.SignalDatabase
+import org.thoughtcrime.securesms.util.LRUCache
+import java.time.Instant
+import java.time.LocalDateTime
+import java.time.ZoneOffset
+import java.time.temporal.TemporalAdjusters
+import java.util.concurrent.locks.Condition
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+import kotlin.time.Duration.Companion.days
+
+/**
+ * A calendar validator for jumping to a specific date in a conversation.
+ * This is used to prevent the user from jumping to a date where there are no messages.
+ *
+ * [isValid] is called on the main thread, so we try to race it and fetch the data ahead of time, fetching data in bulk and caching it.
+ */
+@Parcelize
+class JumpToDateValidator(val threadId: Long) : DateValidator {
+
+ companion object {
+ private val TAG = Log.tag(JumpToDateValidator::class.java)
+ }
+
+ @IgnoredOnParcel
+ private val lock = ReentrantLock()
+
+ @IgnoredOnParcel
+ private val condition: Condition = lock.newCondition()
+
+ @IgnoredOnParcel
+ private val cachedDates: MutableMap = LRUCache(500)
+
+ init {
+ val startOfDay = LocalDateTime.now(ZoneOffset.UTC).withHour(0).withMinute(0).withSecond(0).withNano(0).toInstant(ZoneOffset.UTC).toEpochMilli()
+ loadAround(startOfDay, allowPrefetch = true)
+ }
+
+ override fun isValid(dateStart: Long): Boolean {
+ return lock.withLock {
+ var value = cachedDates[dateStart]
+
+ while (value == null || value == LookupState.PENDING) {
+ loadAround(dateStart, allowPrefetch = true)
+ condition.await()
+ value = cachedDates[dateStart]
+ }
+
+ cachedDates[dateStart] == LookupState.FOUND
+ }
+ }
+
+ /**
+ * Given a date, this will load all of the dates for entire month the date is in.
+ */
+ private fun loadAround(dateStart: Long, allowPrefetch: Boolean) {
+ SignalExecutors.BOUNDED.execute {
+ val startOfDay = LocalDateTime.ofInstant(Instant.ofEpochMilli(dateStart), ZoneOffset.UTC)
+
+ val startOfMonth = startOfDay
+ .with(TemporalAdjusters.firstDayOfMonth())
+ .withHour(0).withMinute(0).withSecond(0).withNano(0)
+ .toInstant(ZoneOffset.UTC)
+ .toEpochMilli()
+
+ val endOfMonth = startOfDay
+ .with(TemporalAdjusters.lastDayOfMonth())
+ .withHour(0).withMinute(0).withSecond(0).withNano(0)
+ .toInstant(ZoneOffset.UTC)
+ .toEpochMilli()
+
+ val daysOfMonth = (startOfMonth..endOfMonth step 1.days.inWholeMilliseconds).toSet() + dateStart
+
+ val lookupsNeeded = lock.withLock {
+ daysOfMonth
+ .filter { !cachedDates.containsKey(it) }
+ .onEach { cachedDates[it] = LookupState.PENDING }
+ }
+
+ if (lookupsNeeded.isEmpty()) {
+ return@execute
+ }
+
+ val existence = logTime(TAG, "query(${lookupsNeeded.size})", decimalPlaces = 2) {
+ SignalDatabase.messages.messageExistsOnDays(threadId, lookupsNeeded)
+ }
+
+ lock.withLock {
+ cachedDates.putAll(existence.mapValues { if (it.value) LookupState.FOUND else LookupState.NOT_FOUND })
+
+ if (allowPrefetch) {
+ val dayInPreviousMonth = startOfMonth - 1.days.inWholeMilliseconds
+ if (!cachedDates.containsKey(dayInPreviousMonth)) {
+ loadAround(dayInPreviousMonth, allowPrefetch = false)
+ }
+
+ val dayInNextMonth = endOfMonth + 1.days.inWholeMilliseconds
+ if (!cachedDates.containsKey(dayInNextMonth)) {
+ loadAround(dayInNextMonth, allowPrefetch = false)
+ }
+ }
+
+ condition.signalAll()
+ }
+ }
+ }
+
+ private enum class LookupState {
+ FOUND,
+ NOT_FOUND,
+ PENDING
+ }
+}
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 c90c9c671f..d78cbefbfc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt
@@ -3959,6 +3959,29 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
return getMessagePositionInConversation(threadId, 0, receivedTimestamp)
}
+ fun messageExistsOnDays(threadId: Long, dayStarts: Collection): Map {
+ if (dayStarts.isEmpty()) {
+ return emptyMap()
+ }
+ return dayStarts.associateWith { startOfDay ->
+ readableDatabase
+ .exists(TABLE_NAME)
+ .where("$THREAD_ID = $threadId AND $DATE_RECEIVED >= $startOfDay AND $DATE_RECEIVED < $startOfDay + 86400000 AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0")
+ .run()
+ }
+ }
+
+ fun getEarliestMessageDate(threadId: Long): Long {
+ return readableDatabase
+ .select(DATE_RECEIVED)
+ .from(TABLE_NAME)
+ .where("$THREAD_ID = $threadId AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0")
+ .orderBy("$DATE_RECEIVED ASC")
+ .limit(1)
+ .run()
+ .readToSingleLong(0)
+ }
+
/**
* Retrieves the position of the message with the provided timestamp in the query results you'd
* get from calling [.getConversation].
@@ -3970,22 +3993,16 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
* @param groupStoryId Ignored if passed value is <= 0
*/
fun getMessagePositionInConversation(threadId: Long, groupStoryId: Long, receivedTimestamp: Long): Int {
- val order: String
- val selection: String
-
- if (groupStoryId > 0) {
- order = "$DATE_RECEIVED ASC"
- selection = "$THREAD_ID = $threadId AND $DATE_RECEIVED < $receivedTimestamp AND $STORY_TYPE = 0 AND $PARENT_STORY_ID = $groupStoryId AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL"
+ val selection = if (groupStoryId > 0) {
+ "$THREAD_ID = $threadId AND $DATE_RECEIVED < $receivedTimestamp AND $STORY_TYPE = 0 AND $PARENT_STORY_ID = $groupStoryId AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL"
} else {
- order = "$DATE_RECEIVED DESC"
- selection = "$THREAD_ID = $threadId AND $DATE_RECEIVED > $receivedTimestamp AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL"
+ "$THREAD_ID = $threadId AND $DATE_RECEIVED > $receivedTimestamp AND $STORY_TYPE = 0 AND $PARENT_STORY_ID <= 0 AND $SCHEDULED_DATE = -1 AND $LATEST_REVISION_ID IS NULL"
}
return readableDatabase
.select("COUNT(*)")
.from(TABLE_NAME)
.where(selection)
- .orderBy(order)
.run()
.readToSingleInt(-1)
}
diff --git a/app/src/main/res/drawable/symbol_calendar_search_24.xml b/app/src/main/res/drawable/symbol_calendar_search_24.xml
new file mode 100644
index 0000000000..696eec47ab
--- /dev/null
+++ b/app/src/main/res/drawable/symbol_calendar_search_24.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/layout/conversation_search_nav.xml b/app/src/main/res/layout/conversation_search_nav.xml
index f85aa49931..c75a84744b 100644
--- a/app/src/main/res/layout/conversation_search_nav.xml
+++ b/app/src/main/res/layout/conversation_search_nav.xml
@@ -11,6 +11,19 @@
tools:visibility="visible"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
+
+
logTime(tag: String, label: String, decimalPlaces: Int = 0, block: () -> T): T {
+ val result = measureTimedValue(block)
+ Log.d(tag, "$label: ${result.duration.toDouble(DurationUnit.MILLISECONDS).roundedString(decimalPlaces)}")
+ return result.value
+}
From 295c9310e96d021180a7d025f4bf679e91ee6a2e Mon Sep 17 00:00:00 2001
From: Alex Konradi
Date: Thu, 4 Apr 2024 16:47:06 -0400
Subject: [PATCH 08/33] Map libsignal CDSI errors to existing exceptions.
---
.../api/services/CdsiV2Service.java | 23 +++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java
index 3d12006215..2549af2157 100644
--- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java
+++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java
@@ -12,6 +12,9 @@
import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.push.ServiceId.PNI;
+import org.whispersystems.signalservice.api.push.exceptions.CdsiInvalidArgumentException;
+import org.whispersystems.signalservice.api.push.exceptions.CdsiInvalidTokenException;
+import org.whispersystems.signalservice.api.push.exceptions.CdsiResourceExhaustedException;
import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException;
import org.whispersystems.signalservice.api.util.UuidUtil;
import org.whispersystems.signalservice.internal.ServiceResponse;
@@ -19,6 +22,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.lang.IllegalArgumentException;
import java.nio.ByteBuffer;
import java.time.Duration;
import java.util.Collection;
@@ -58,9 +62,12 @@ public CdsiV2Service(SignalServiceConfiguration configuration, String mrEnclave,
try {
Log.i(TAG, "Starting CDSI lookup via libsignal-net");
Future cdsiRequest = network.cdsiLookup(username, password, buildLibsignalRequest(request), tokenSaver);
- return Single.fromFuture(cdsiRequest).map(CdsiV2Service::parseLibsignalResponse).toObservable();
+ return Single.fromFuture(cdsiRequest)
+ .onErrorResumeNext((Throwable err) -> Single.error(mapLibsignalError(err)))
+ .map(CdsiV2Service::parseLibsignalResponse)
+ .toObservable();
} catch (Exception exception) {
- return Observable.error(exception);
+ return Observable.error(mapLibsignalError(exception));
}
};
} else {
@@ -176,6 +183,18 @@ private static Response parseLibsignalResponse(CdsiLookupResponse response) {
return new Response(responses, response.debugPermitsUsed);
}
+ private static Throwable mapLibsignalError(Throwable lookupError) {
+ if (lookupError instanceof org.signal.libsignal.net.CdsiInvalidTokenException) {
+ return new CdsiInvalidTokenException();
+ } else if (lookupError instanceof org.signal.libsignal.net.RetryLaterException) {
+ org.signal.libsignal.net.RetryLaterException e = (org.signal.libsignal.net.RetryLaterException) lookupError;
+ return new CdsiResourceExhaustedException((int) e.duration.getSeconds());
+ } else if (lookupError instanceof IllegalArgumentException) {
+ return new CdsiInvalidArgumentException();
+ }
+ return lookupError;
+ }
+
private static List parseAndSortE164Strings(Collection e164s) {
return e164s.stream()
.map(Long::parseLong)
From 2ce6ea9a2a2955e469e88f918ee4700b40524a57 Mon Sep 17 00:00:00 2001
From: Alex Konradi
Date: Thu, 4 Apr 2024 16:47:26 -0400
Subject: [PATCH 09/33] Use existing libsignal proguard rules.
---
app/proguard/proguard.cfg | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/proguard/proguard.cfg b/app/proguard/proguard.cfg
index bef85c4817..0c9346c789 100644
--- a/app/proguard/proguard.cfg
+++ b/app/proguard/proguard.cfg
@@ -2,9 +2,6 @@
-dontobfuscate
-keepattributes SourceFile,LineNumberTable
-keep class org.whispersystems.** { *; }
--keep class org.signal.libsignal.net.** { *; }
--keep class org.signal.libsignal.protocol.** { *; }
--keep class org.signal.libsignal.usernames.** { *; }
-keep class org.thoughtcrime.securesms.** { *; }
-keep class org.signal.donations.json.** { *; }
-keepclassmembers class ** {
From ea081e981f7e978b01e5eb07a54ccfdb5bef15f1 Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Thu, 4 Apr 2024 16:50:25 -0400
Subject: [PATCH 10/33] Treat unregistered user during send as general failure.
---
.../thoughtcrime/securesms/components/AlertView.java | 6 ------
.../securesms/components/ConversationItemFooter.java | 4 +---
.../securesms/conversation/ConversationItem.java | 5 +----
.../v2/items/V2ConversationItemTextOnlyViewHolder.kt | 5 +----
.../conversationlist/ConversationListItem.java | 3 ---
.../thoughtcrime/securesms/database/MessageTable.kt | 6 ------
.../securesms/database/model/DisplayRecord.java | 5 +----
.../securesms/database/model/StatusUtil.java | 1 +
.../securesms/database/model/ThreadRecord.java | 4 ----
.../securesms/jobs/IndividualSendJob.java | 12 ++++--------
.../transport/InsecureFallbackApprovalException.java | 11 -----------
app/src/main/res/values/strings.xml | 1 -
12 files changed, 9 insertions(+), 54 deletions(-)
delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java
index e0a7b2886c..4c4fca4c24 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/AlertView.java
@@ -35,12 +35,6 @@ public void setNone() {
setVisibility(View.GONE);
}
- public void setPendingApproval() {
- setVisibility(View.VISIBLE);
- setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_colorOnSurfaceVariant));
- setContentDescription(getContext().getString(R.string.conversation_item_sent__pending_approval_description));
- }
-
public void setFailed() {
setVisibility(View.VISIBLE);
setColorFilter(ContextCompat.getColor(getContext(), R.color.signal_colorError));
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java
index 1c2dc80c43..6ba9ac0757 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationItemFooter.java
@@ -315,8 +315,6 @@ private void presentDate(@NonNull MessageRecord messageRecord, @NonNull Locale l
}
dateView.setText(errorMsg);
- } else if (messageRecord.isPendingInsecureSmsFallback()) {
- dateView.setText(R.string.ConversationItem_click_to_approve_unencrypted);
} else if (messageRecord.isRateLimited()) {
dateView.setText(R.string.ConversationItem_send_paused);
} else if (MessageRecordUtil.isScheduled(messageRecord)) {
@@ -410,7 +408,7 @@ private void presentDeliveryStatus(@NonNull MessageRecord messageRecord) {
previousMessageId = newMessageId;
- if (messageRecord.isFailed() || messageRecord.isPendingInsecureSmsFallback() || MessageRecordUtil.isScheduled(messageRecord)) {
+ if (messageRecord.isFailed() || MessageRecordUtil.isScheduled(messageRecord)) {
deliveryStatusView.setNone();
return;
}
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 1d6e0cce65..5138e6699c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationItem.java
@@ -1573,8 +1573,6 @@ private void setStatusIcons(MessageRecord messageRecord, boolean hasWallpaper) {
if (!messageRecord.isMediaPending() && messageRecord.isFailed()) {
alertView.setFailed();
- } else if (messageRecord.isPendingInsecureSmsFallback()) {
- alertView.setPendingApproval();
} else if (messageRecord.isRateLimited()) {
alertView.setRateLimited();
} else {
@@ -1826,7 +1824,6 @@ private boolean shouldInterceptClicks(MessageRecord messageRecord) {
return batchSelected.isEmpty() &&
((messageRecord.isFailed() && !messageRecord.isMmsNotification()) ||
(messageRecord.isRateLimited() && SignalStore.rateLimit().needsRecaptcha()) ||
- messageRecord.isPendingInsecureSmsFallback() ||
messageRecord.isBundleKeyExchange());
}
@@ -1990,7 +1987,7 @@ private boolean isSingularMessage(@NonNull MessageRecord current, @NonNull Optio
private boolean isFooterVisible(@NonNull MessageRecord current, @NonNull Optional next, boolean isGroupThread) {
boolean differentTimestamps = next.isPresent() && !DateUtils.isSameExtendedRelativeTimestamp(next.get().getTimestamp(), current.getTimestamp());
- return forceFooter(messageRecord) || current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() || current.isPendingInsecureSmsFallback() ||
+ return forceFooter(messageRecord) || current.getExpiresIn() > 0 || !current.isSecure() || current.isPending() ||
current.isFailed() || current.isRateLimited() || differentTimestamps || isEndOfMessageCluster(current, next, isGroupThread);
}
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 7ca9ff389f..5ec98f4424 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
@@ -578,7 +578,6 @@ open class V2ConversationItemTextOnlyViewHolder>(
when {
record.isFailed -> alert.setFailed()
- record.isPendingInsecureSmsFallback -> alert.setPendingApproval()
record.isRateLimited -> alert.setRateLimited()
else -> alert.setNone()
}
@@ -645,8 +644,6 @@ open class V2ConversationItemTextOnlyViewHolder>(
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) {
binding.footerDate.setText(R.string.ConversationItem_send_paused)
} else if (record.isScheduled()) {
@@ -694,7 +691,7 @@ open class V2ConversationItemTextOnlyViewHolder>(
messageId = newMessageId
- if (!record.isOutgoing || record.isFailed || record.isPendingInsecureSmsFallback || record.isScheduled()) {
+ if (!record.isOutgoing || record.isFailed || record.isScheduled()) {
deliveryStatus.setNone()
return
}
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 db5df964bd..5f937e78fd 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListItem.java
@@ -508,9 +508,6 @@ private void setStatusIcons(ThreadRecord thread) {
} else if (thread.isFailed()) {
deliveryStatusIndicator.setNone();
alertView.setFailed();
- } else if (thread.isPendingInsecureSmsFallback()) {
- deliveryStatusIndicator.setNone();
- alertView.setPendingApproval();
} else {
alertView.setNone();
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 d78cbefbfc..86bf3b612b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MessageTable.kt
@@ -1915,12 +1915,6 @@ open class MessageTable(context: Context?, databaseHelper: SignalDatabase) : Dat
}
}
- fun markAsPendingInsecureSmsFallback(messageId: Long) {
- val threadId = getThreadIdForMessage(messageId)
- updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_PENDING_INSECURE_SMS_FALLBACK, Optional.of(threadId))
- ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(MessageId(messageId))
- }
-
fun markAsSending(messageId: Long) {
val threadId = getThreadIdForMessage(messageId)
updateMailboxBitmask(messageId, MessageTypes.BASE_TYPE_MASK, MessageTypes.BASE_SENDING_TYPE, Optional.of(threadId))
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 a8a7fc1e41..58d2acbcd0 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
@@ -75,6 +75,7 @@ public boolean isFailed() {
return
MessageTypes.isFailedMessageType(type) ||
MessageTypes.isPendingSecureSmsFallbackType(type) ||
+ MessageTypes.isPendingInsecureSmsFallbackType(type) ||
deliveryStatus >= MessageTable.Status.STATUS_FAILED;
}
@@ -224,10 +225,6 @@ public boolean hasReadReceipt() {
return hasReadReceipt;
}
- public boolean isPendingInsecureSmsFallback() {
- return MessageTypes.isPendingInsecureSmsFallbackType(type);
- }
-
public boolean isPaymentNotification() {
return MessageTypes.isPaymentsNotification(type);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java
index a9230188f2..ca92394add 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/StatusUtil.java
@@ -20,6 +20,7 @@ static boolean isPending(long type) {
static boolean isFailed(long type, long deliveryStatus) {
return MessageTypes.isFailedMessageType(type) ||
MessageTypes.isPendingSecureSmsFallbackType(type) ||
+ MessageTypes.isPendingInsecureSmsFallbackType(type) ||
deliveryStatus >= MessageTable.Status.STATUS_FAILED;
}
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 fcbc5ba24e..ec164f9c26 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
@@ -180,10 +180,6 @@ public boolean hasReadReceipt() {
return hasReadReceipt;
}
- public boolean isPendingInsecureSmsFallback() {
- return MessageTypes.isPendingInsecureSmsFallbackType(type);
- }
-
public boolean isDelivered() {
return StatusUtil.isDelivered(deliveryStatus, hasDeliveryReceipt);
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java
index 0c3e09ea47..5cf445bdba 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java
@@ -30,7 +30,6 @@
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
import org.thoughtcrime.securesms.service.ExpiringMessageManager;
-import org.thoughtcrime.securesms.transport.InsecureFallbackApprovalException;
import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.transport.UndeliverableMessageException;
import org.thoughtcrime.securesms.util.SignalLocalMetrics;
@@ -205,9 +204,9 @@ public void onPushSend()
log(TAG, String.valueOf(message.getSentTimeMillis()), "Sent message: " + messageId);
- } catch (InsecureFallbackApprovalException ifae) {
- warn(TAG, "Failure", ifae);
- database.markAsPendingInsecureSmsFallback(messageId);
+ } catch (UnregisteredUserException uue) {
+ warn(TAG, "Failure", uue);
+ database.markAsSentFailed(messageId);
notifyMediaMessageDeliveryFailed(context, messageId);
ApplicationDependencies.getJobManager().add(new DirectoryRefreshJob(false));
} catch (UntrustedIdentityException uie) {
@@ -237,7 +236,7 @@ public void onFailure() {
}
private boolean deliver(OutgoingMessage message, MessageRecord originalEditedMessage)
- throws IOException, InsecureFallbackApprovalException, UntrustedIdentityException, UndeliverableMessageException
+ throws IOException, UnregisteredUserException, UntrustedIdentityException, UndeliverableMessageException
{
if (message.getThreadRecipient() == null) {
throw new UndeliverableMessageException("No destination address.");
@@ -335,9 +334,6 @@ private boolean deliver(OutgoingMessage message, MessageRecord originalEditedMes
return result.getSuccess().isUnidentified();
}
- } catch (UnregisteredUserException e) {
- warn(TAG, String.valueOf(message.getSentTimeMillis()), e);
- throw new InsecureFallbackApprovalException(e);
} catch (FileNotFoundException e) {
warn(TAG, String.valueOf(message.getSentTimeMillis()), e);
throw new UndeliverableMessageException(e);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java b/app/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java
deleted file mode 100644
index 15651696f9..0000000000
--- a/app/src/main/java/org/thoughtcrime/securesms/transport/InsecureFallbackApprovalException.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.thoughtcrime.securesms.transport;
-
-public class InsecureFallbackApprovalException extends Exception {
- public InsecureFallbackApprovalException(String detailMessage) {
- super(detailMessage);
- }
-
- public InsecureFallbackApprovalException(Throwable e) {
- super(e);
- }
-}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c46ac424a2..4a7e933bb8 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -307,7 +307,6 @@
Send failed
%1$s has left the group.
Send paused
- Send failed, tap for unsecured fallback
Fallback to unencrypted SMS?
Fallback to unencrypted MMS?
This message will not be encrypted because the recipient is no longer a Signal user.\n\nSend unsecured message?
From 3ea194255d67c8a87d3628e2e750cb3a319cdb43 Mon Sep 17 00:00:00 2001
From: moiseev-signal <122060238+moiseev-signal@users.noreply.github.com>
Date: Fri, 5 Apr 2024 09:47:33 -0700
Subject: [PATCH 11/33] Add getUsername default method to CredentialsProvider
---
.../api/util/CredentialsProvider.java | 11 ++++
.../websocket/WebSocketConnection.java | 6 +-
.../api/util/CredentialsProviderTest.kt | 58 +++++++++++++++++++
3 files changed, 70 insertions(+), 5 deletions(-)
create mode 100644 libsignal-service/src/test/java/org/whispersystems/signalservice/api/util/CredentialsProviderTest.kt
diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/util/CredentialsProvider.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/util/CredentialsProvider.java
index 5ffae1bef5..c7b95bb9c6 100644
--- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/util/CredentialsProvider.java
+++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/util/CredentialsProvider.java
@@ -8,6 +8,7 @@
import org.whispersystems.signalservice.api.push.ServiceId.ACI;
import org.whispersystems.signalservice.api.push.ServiceId.PNI;
+import org.whispersystems.signalservice.api.push.SignalServiceAddress;
public interface CredentialsProvider {
ACI getAci();
@@ -15,4 +16,14 @@ public interface CredentialsProvider {
String getE164();
int getDeviceId();
String getPassword();
+
+ default String getUsername() {
+ StringBuilder sb = new StringBuilder();
+ sb.append(getAci().toString());
+ if (getDeviceId() != SignalServiceAddress.DEFAULT_DEVICE_ID) {
+ sb.append(".");
+ sb.append(getDeviceId());
+ }
+ return sb.toString();
+ }
}
diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java
index 0069653017..243da0afef 100644
--- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java
+++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/WebSocketConnection.java
@@ -133,11 +133,7 @@ public synchronized Observable connect() {
String filledUri;
if (credentialsProvider.isPresent()) {
- String identifier = Objects.requireNonNull(credentialsProvider.get().getAci()).toString();
- if (credentialsProvider.get().getDeviceId() != SignalServiceAddress.DEFAULT_DEVICE_ID) {
- identifier += "." + credentialsProvider.get().getDeviceId();
- }
- filledUri = String.format(wsUri, identifier, credentialsProvider.get().getPassword());
+ filledUri = String.format(wsUri, credentialsProvider.get().getUsername(), credentialsProvider.get().getPassword());
} else {
filledUri = wsUri;
}
diff --git a/libsignal-service/src/test/java/org/whispersystems/signalservice/api/util/CredentialsProviderTest.kt b/libsignal-service/src/test/java/org/whispersystems/signalservice/api/util/CredentialsProviderTest.kt
new file mode 100644
index 0000000000..936292cffe
--- /dev/null
+++ b/libsignal-service/src/test/java/org/whispersystems/signalservice/api/util/CredentialsProviderTest.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2024 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+package org.whispersystems.signalservice.api.util
+
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertThrows
+import org.junit.Test
+import org.whispersystems.signalservice.api.push.ServiceId
+import org.whispersystems.signalservice.api.push.SignalServiceAddress
+import java.util.UUID
+
+class CredentialsProviderTest {
+ private fun makeProvider(aci: UUID?, deviceId: Int = SignalServiceAddress.DEFAULT_DEVICE_ID): CredentialsProvider {
+ return object : CredentialsProvider {
+ override fun getAci(): ServiceId.ACI? {
+ if (aci == null) {
+ return null
+ }
+ return ServiceId.ACI.from(aci)
+ }
+
+ override fun getPni(): ServiceId.PNI {
+ TODO("Not used")
+ }
+
+ override fun getE164(): String {
+ TODO("Not used")
+ }
+
+ override fun getDeviceId(): Int {
+ return deviceId
+ }
+
+ override fun getPassword(): String {
+ TODO("Not used")
+ }
+ }
+ }
+
+ @Test
+ fun usernameWithDefaultDeviceId() {
+ val uuid = UUID.randomUUID()
+ assertEquals(uuid.toString(), makeProvider(uuid).username)
+ }
+
+ @Test
+ fun usernameWithDeviceId() {
+ val uuid = UUID.randomUUID()
+ assertEquals("$uuid.42", makeProvider(uuid, 42).username)
+ }
+
+ @Test
+ fun usernameWithNullAci() {
+ assertThrows(NullPointerException::class.java) { makeProvider(aci = null).username }
+ }
+}
From ba3473c61aed0845d11e1fd18cda68cdb2be1d44 Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Fri, 5 Apr 2024 13:10:58 -0400
Subject: [PATCH 12/33] Fix scroll to message when bubble is under toolbar.
---
.../securesms/components/ScrollToPositionDelegate.kt | 4 ++--
.../securesms/conversation/v2/ConversationFragment.kt | 5 +++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ScrollToPositionDelegate.kt b/app/src/main/java/org/thoughtcrime/securesms/components/ScrollToPositionDelegate.kt
index c342d10ed8..107dec2f09 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/components/ScrollToPositionDelegate.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/components/ScrollToPositionDelegate.kt
@@ -191,10 +191,10 @@ class ScrollToPositionDelegate private constructor(
if (abs(layoutManager.findFirstVisibleItemPosition() - position) < SCROLL_ANIMATION_THRESHOLD) {
val child: View? = layoutManager.findViewByPosition(position)
if (child == null || !layoutManager.isViewPartiallyVisible(child, true, false)) {
- layoutManager.scrollToPositionWithOffset(position, recyclerView.height / 4)
+ layoutManager.scrollToPositionWithOffset(position, recyclerView.height / 3)
}
} else {
- layoutManager.scrollToPositionWithOffset(position, recyclerView.height / 4)
+ layoutManager.scrollToPositionWithOffset(position, recyclerView.height / 3)
}
}
}
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 416dd94718..81a2c43750 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
@@ -317,6 +317,7 @@ import org.thoughtcrime.securesms.util.hasAudio
import org.thoughtcrime.securesms.util.hasGiftBadge
import org.thoughtcrime.securesms.util.hasNonTextSlide
import org.thoughtcrime.securesms.util.isValidReactionTarget
+import org.thoughtcrime.securesms.util.padding
import org.thoughtcrime.securesms.util.savedStateViewModel
import org.thoughtcrime.securesms.util.toMillis
import org.thoughtcrime.securesms.util.viewModel
@@ -602,6 +603,10 @@ class ConversationFragment :
viewModel.onChatBoundsChanged(Rect(left, top, right, bottom))
}
+ binding.toolbar.addOnLayoutChangeListener { _, _, _, _, bottom, _, _, _, _ ->
+ binding.conversationItemRecycler.padding(top = bottom)
+ }
+
binding.conversationItemRecycler.addItemDecoration(ChatColorsDrawable.ChatColorsItemDecoration)
}
From 791dc2724fe4951e9803499f87a3b11b14f67335 Mon Sep 17 00:00:00 2001
From: Cody Henthorne
Date: Fri, 5 Apr 2024 14:49:50 -0400
Subject: [PATCH 13/33] Attempt to fix bad notification for call service
shutdown.
---
app/src/main/AndroidManifest.xml | 6 +++++-
.../securesms/service/SafeForegroundService.kt | 16 +++++++++++++++-
.../service/webrtc/ActiveCallManager.kt | 11 +++++++++++
3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f1ece04bba..e30c8c7137 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1352,7 +1352,11 @@
-
+
+
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/SafeForegroundService.kt b/app/src/main/java/org/thoughtcrime/securesms/service/SafeForegroundService.kt
index 004beadc25..0f4c624ffc 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/service/SafeForegroundService.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/SafeForegroundService.kt
@@ -9,8 +9,10 @@ import android.app.Notification
import android.app.Service
import android.content.Context
import android.content.Intent
+import android.os.Build
import android.os.Bundle
import android.os.IBinder
+import androidx.annotation.RequiresApi
import androidx.core.app.ServiceCompat
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.jobs.ForegroundServiceUtil
@@ -122,6 +124,10 @@ abstract class SafeForegroundService : Service() {
}
}
+ fun isStopping(intent: Intent): Boolean {
+ return intent.action == ACTION_STOP
+ }
+
private fun currentState(clazz: Class): State {
return states.getOrPut(clazz) { State.STOPPED }
}
@@ -137,7 +143,11 @@ abstract class SafeForegroundService : Service() {
Log.d(tag, "[onStartCommand] action: ${intent.action}")
- startForeground(notificationId, getForegroundNotification(intent))
+ if (Build.VERSION.SDK_INT >= 30 && serviceType != 0) {
+ startForeground(notificationId, getForegroundNotification(intent), serviceType)
+ } else {
+ startForeground(notificationId, getForegroundNotification(intent))
+ }
when (val action = intent.action) {
ACTION_START -> {
@@ -187,6 +197,10 @@ abstract class SafeForegroundService : Service() {
/** Notification ID to use when posting the foreground notification */
abstract val notificationId: Int
+ /** Special service type to use when calling start service if needed */
+ @RequiresApi(30)
+ open val serviceType: Int = 0
+
/** Notification to post as our foreground notification. */
abstract fun getForegroundNotification(intent: Intent): Notification
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 7e7eecfbdf..7f5301b44f 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
@@ -10,11 +10,13 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
+import android.content.pm.ServiceInfo
import android.net.ConnectivityManager
import android.os.Build
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import androidx.annotation.MainThread
+import androidx.annotation.RequiresApi
import androidx.core.app.NotificationManagerCompat
import androidx.core.os.bundleOf
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
@@ -194,6 +196,10 @@ class ActiveCallManager(
override val notificationId: Int
get() = CallNotificationBuilder.WEBRTC_NOTIFICATION
+ @get:RequiresApi(30)
+ override val serviceType: Int
+ get() = ServiceInfo.FOREGROUND_SERVICE_TYPE_CAMERA or ServiceInfo.FOREGROUND_SERVICE_TYPE_MICROPHONE
+
private var hangUpRtcOnDeviceCallAnswered: PhoneStateListener? = null
private var notification: Notification? = null
private var notificationDisposable: Disposable = Disposable.disposed()
@@ -222,6 +228,11 @@ class ActiveCallManager(
}
override fun getForegroundNotification(intent: Intent): Notification {
+ if (SafeForegroundService.isStopping(intent)) {
+ Log.v(TAG, "Service is stopping, using generic stopping notification")
+ return CallNotificationBuilder.getStoppingNotification(this)
+ }
+
if (notification != null) {
return notification!!
} else if (!intent.hasExtra(EXTRA_RECIPIENT_ID)) {
From 9bd4e9524c88332adba196f51586a4b3bad64dde Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Fri, 5 Apr 2024 15:57:24 -0400
Subject: [PATCH 14/33] Convert MentionTable to kotlin.
---
.../securesms/database/MentionTable.java | 176 ------------------
.../securesms/database/MentionTable.kt | 174 +++++++++++++++++
2 files changed, 174 insertions(+), 176 deletions(-)
delete mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.java
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.java b/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.java
deleted file mode 100644
index a33425e6b8..0000000000
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.java
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.thoughtcrime.securesms.database;
-
-import android.content.ContentValues;
-import android.content.Context;
-import android.database.Cursor;
-import android.text.TextUtils;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.annimon.stream.Stream;
-
-import org.thoughtcrime.securesms.database.model.Mention;
-import org.thoughtcrime.securesms.recipients.RecipientId;
-import org.signal.core.util.CursorUtil;
-import org.signal.core.util.SqlUtil;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-public class MentionTable extends DatabaseTable implements RecipientIdDatabaseReference, ThreadIdDatabaseReference {
-
- public static final String TABLE_NAME = "mention";
-
- private static final String ID = "_id";
- static final String THREAD_ID = "thread_id";
- public static final String MESSAGE_ID = "message_id";
- static final String RECIPIENT_ID = "recipient_id";
- private static final String RANGE_START = "range_start";
- private static final String RANGE_LENGTH = "range_length";
-
- public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
- THREAD_ID + " INTEGER, " +
- MESSAGE_ID + " INTEGER, " +
- RECIPIENT_ID + " INTEGER, " +
- RANGE_START + " INTEGER, " +
- RANGE_LENGTH + " INTEGER)";
-
- public static final String[] CREATE_INDEXES = new String[] {
- "CREATE INDEX IF NOT EXISTS mention_message_id_index ON " + TABLE_NAME + " (" + MESSAGE_ID + ");",
- "CREATE INDEX IF NOT EXISTS mention_recipient_id_thread_id_index ON " + TABLE_NAME + " (" + RECIPIENT_ID + ", " + THREAD_ID + ");"
- };
-
- public MentionTable(@NonNull Context context, @NonNull SignalDatabase databaseHelper) {
- super(context, databaseHelper);
- }
-
- public void insert(long threadId, long messageId, @NonNull Collection mentions) {
- SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
-
- db.beginTransaction();
- try {
- for (Mention mention : mentions) {
- ContentValues values = new ContentValues();
- values.put(THREAD_ID, threadId);
- values.put(MESSAGE_ID, messageId);
- values.put(RECIPIENT_ID, mention.getRecipientId().toLong());
- values.put(RANGE_START, mention.getStart());
- values.put(RANGE_LENGTH, mention.getLength());
- db.insert(TABLE_NAME, null, values);
- }
-
- db.setTransactionSuccessful();
- } finally {
- db.endTransaction();
- }
- }
-
- public @NonNull List getMentionsForMessage(long messageId) {
- SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
- List mentions = new LinkedList<>();
-
- try (Cursor cursor = db.query(TABLE_NAME, null, MESSAGE_ID + " = ?", SqlUtil.buildArgs(messageId), null, null, null)) {
- while (cursor != null && cursor.moveToNext()) {
- mentions.add(new Mention(RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID)),
- CursorUtil.requireInt(cursor, RANGE_START),
- CursorUtil.requireInt(cursor, RANGE_LENGTH)));
- }
- }
-
- return mentions;
- }
-
- public @NonNull Map> getMentionsForMessages(@NonNull Collection messageIds) {
- SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
- String ids = TextUtils.join(",", messageIds);
-
- try (Cursor cursor = db.query(TABLE_NAME, null, MESSAGE_ID + " IN (" + ids + ")", null, null, null, null)) {
- return readMentions(cursor);
- }
- }
-
- public @NonNull Map> getMentionsContainingRecipients(@NonNull Collection recipientIds, long limit) {
- return getMentionsContainingRecipients(recipientIds, -1, limit);
- }
-
- public @NonNull Map> getMentionsContainingRecipients(@NonNull Collection recipientIds, long threadId, long limit) {
- SQLiteDatabase db = databaseHelper.getSignalReadableDatabase();
- String ids = TextUtils.join(",", Stream.of(recipientIds).map(RecipientId::serialize).toList());
-
- String where = " WHERE " + RECIPIENT_ID + " IN (" + ids + ")";
- if (threadId != -1) {
- where += " AND " + THREAD_ID + " = " + threadId;
- }
-
- String subSelect = "SELECT DISTINCT " + MESSAGE_ID +
- " FROM " + TABLE_NAME +
- where +
- " ORDER BY " + ID + " DESC" +
- " LIMIT " + limit;
-
- String query = "SELECT *" +
- " FROM " + TABLE_NAME +
- " WHERE " + MESSAGE_ID +
- " IN (" + subSelect + ")";
-
- try (Cursor cursor = db.rawQuery(query, null)) {
- return readMentions(cursor);
- }
- }
-
- void deleteMentionsForMessage(long messageId) {
- SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
- String where = MESSAGE_ID + " = ?";
-
- db.delete(TABLE_NAME, where, SqlUtil.buildArgs(messageId));
- }
-
- void deleteAbandonedMentions() {
- SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
- String where = MESSAGE_ID + " NOT IN (SELECT " + MessageTable.ID + " FROM " + MessageTable.TABLE_NAME + ") OR " + THREAD_ID + " NOT IN (SELECT " + ThreadTable.ID + " FROM " + ThreadTable.TABLE_NAME + " WHERE " + ThreadTable.ACTIVE + " = 1)";
-
- db.delete(TABLE_NAME, where, null);
- }
-
- void deleteAllMentions() {
- SQLiteDatabase db = databaseHelper.getSignalWritableDatabase();
- db.delete(TABLE_NAME, null, null);
- }
-
- private @NonNull Map> readMentions(@Nullable Cursor cursor) {
- Map> mentions = new HashMap<>();
- while (cursor != null && cursor.moveToNext()) {
- long messageId = CursorUtil.requireLong(cursor, MESSAGE_ID);
- List messageMentions = mentions.get(messageId);
-
- if (messageMentions == null) {
- messageMentions = new LinkedList<>();
- mentions.put(messageId, messageMentions);
- }
-
- messageMentions.add(new Mention(RecipientId.from(CursorUtil.requireLong(cursor, RECIPIENT_ID)),
- CursorUtil.requireInt(cursor, RANGE_START),
- CursorUtil.requireInt(cursor, RANGE_LENGTH)));
- }
- return mentions;
- }
-
- @Override
- public void remapRecipient(@NonNull RecipientId fromId, @NonNull RecipientId toId) {
- ContentValues values = new ContentValues();
- values.put(RECIPIENT_ID, toId.serialize());
- getWritableDatabase().update(TABLE_NAME, values, RECIPIENT_ID + " = ?", SqlUtil.buildArgs(fromId));
- }
-
- @Override
- public void remapThread(long fromId, long toId) {
- ContentValues values = new ContentValues();
- values.put(MentionTable.THREAD_ID, toId);
-
- getWritableDatabase().update(TABLE_NAME, values, THREAD_ID + " = ?", SqlUtil.buildArgs(fromId));
- }
-}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt
new file mode 100644
index 0000000000..a8353e9455
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt
@@ -0,0 +1,174 @@
+package org.thoughtcrime.securesms.database
+
+import android.content.Context
+import android.database.Cursor
+import org.signal.core.util.delete
+import org.signal.core.util.deleteAll
+import org.signal.core.util.insertInto
+import org.signal.core.util.readToList
+import org.signal.core.util.requireInt
+import org.signal.core.util.requireLong
+import org.signal.core.util.select
+import org.signal.core.util.update
+import org.signal.core.util.withinTransaction
+import org.thoughtcrime.securesms.database.model.Mention
+import org.thoughtcrime.securesms.recipients.RecipientId
+
+class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseTable(context, databaseHelper), RecipientIdDatabaseReference, ThreadIdDatabaseReference {
+
+ companion object {
+ const val TABLE_NAME = "mention"
+ const val ID = "_id"
+ const val THREAD_ID = "thread_id"
+ const val MESSAGE_ID = "message_id"
+ const val RECIPIENT_ID = "recipient_id"
+ const val RANGE_START = "range_start"
+ const val RANGE_LENGTH = "range_length"
+
+ const val CREATE_TABLE = """
+ CREATE TABLE $TABLE_NAME(
+ $ID INTEGER PRIMARY KEY AUTOINCREMENT,
+ $THREAD_ID INTEGER,
+ $MESSAGE_ID INTEGER,
+ $RECIPIENT_ID INTEGER,
+ $RANGE_START INTEGER,
+ $RANGE_LENGTH INTEGER
+ )
+ """
+
+ val CREATE_INDEXES = arrayOf(
+ "CREATE INDEX IF NOT EXISTS mention_message_id_index ON $TABLE_NAME ($MESSAGE_ID);",
+ "CREATE INDEX IF NOT EXISTS mention_recipient_id_thread_id_index ON $TABLE_NAME ($RECIPIENT_ID, $THREAD_ID);"
+ )
+ }
+
+ fun insert(threadId: Long, messageId: Long, mentions: Collection) {
+ writableDatabase.withinTransaction { db ->
+ for (mention in mentions) {
+ db.insertInto(TABLE_NAME)
+ .values(
+ THREAD_ID to threadId,
+ MESSAGE_ID to messageId,
+ RECIPIENT_ID to mention.recipientId.toLong(),
+ RANGE_START to mention.start,
+ RANGE_LENGTH to mention.length
+ )
+ .run()
+ }
+ }
+ }
+
+ fun getMentionsForMessage(messageId: Long): List {
+ return readableDatabase
+ .select()
+ .from(TABLE_NAME)
+ .where("$MESSAGE_ID = $messageId")
+ .run()
+ .readToList { cursor ->
+ Mention(
+ RecipientId.from(cursor.requireLong(RECIPIENT_ID)),
+ cursor.requireInt(RANGE_START),
+ cursor.requireInt(RANGE_LENGTH)
+ )
+ }
+ }
+
+ fun getMentionsForMessages(messageIds: Collection): Map> {
+ val ids = messageIds.joinToString(separator = ",") { it.toString() }
+
+ return readableDatabase
+ .select()
+ .from(TABLE_NAME)
+ .where("$MESSAGE_ID IN ($ids)")
+ .run()
+ .use { cursor -> readMentions(cursor) }
+ }
+
+ fun getMentionsContainingRecipients(recipientIds: Collection, limit: Long): Map> {
+ return getMentionsContainingRecipients(recipientIds, -1, limit)
+ }
+
+ fun getMentionsContainingRecipients(recipientIds: Collection, threadId: Long, limit: Long): Map> {
+ val ids = recipientIds.joinToString(separator = ",") { it.serialize() }
+
+ var where = "$RECIPIENT_ID IN ($ids)"
+ if (threadId != -1L) {
+ where += " AND $THREAD_ID = $threadId"
+ }
+
+ return readableDatabase
+ .select()
+ .from(TABLE_NAME)
+ .where(
+ """
+ $MESSAGE_ID IN (
+ SELECT DISTINCT $MESSAGE_ID
+ FROM $TABLE_NAME
+ WHERE $where
+ ORDER BY $ID DESC LIMIT $limit
+ )
+ """
+ )
+ .run()
+ .use { cursor -> readMentions(cursor) }
+ }
+
+ fun deleteMentionsForMessage(messageId: Long) {
+ writableDatabase
+ .delete(TABLE_NAME)
+ .where("$MESSAGE_ID = $messageId")
+ .run()
+ }
+
+ fun deleteAbandonedMentions() {
+ writableDatabase
+ .delete(TABLE_NAME)
+ .where(
+ """
+ $MESSAGE_ID NOT IN (
+ SELECT $MessageTable.ID
+ FROM ${MessageTable.TABLE_NAME}
+ )
+ OR $THREAD_ID NOT IN (
+ SELECT ${ThreadTable.ID}
+ FROM ${ThreadTable.TABLE_NAME}
+ WHERE ${ThreadTable.ACTIVE} = 1
+ )
+ """
+ )
+ .run()
+ }
+
+ fun deleteAllMentions() {
+ writableDatabase.deleteAll(TABLE_NAME)
+ }
+
+ private fun readMentions(cursor: Cursor): Map> {
+ return cursor.readToList {
+ val messageId = it.requireLong(MESSAGE_ID)
+ val mention = Mention(
+ RecipientId.from(it.requireLong(RECIPIENT_ID)),
+ it.requireInt(RANGE_START),
+ it.requireInt(RANGE_LENGTH)
+ )
+
+ messageId to mention
+ }.groupBy({ it.first }, { it.second })
+ }
+
+ override fun remapRecipient(fromId: RecipientId, toId: RecipientId) {
+ writableDatabase
+ .update(TABLE_NAME)
+ .values(RECIPIENT_ID to toId.serialize())
+ .where("$RECIPIENT_ID = ?", fromId)
+ .run()
+ }
+
+ override fun remapThread(fromId: Long, toId: Long) {
+ writableDatabase
+ .update(TABLE_NAME)
+ .values(THREAD_ID to toId)
+ .where("$THREAD_ID = $fromId")
+ .run()
+ }
+}
From 87939818049254c61c04684a061f52a72e3a557e Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Fri, 5 Apr 2024 16:43:09 -0400
Subject: [PATCH 15/33] Add a log section for the database schema.
---
.../logsubmit/LogSectionDatabaseSchema.kt | 44 +++++++++++++++++++
.../logsubmit/SubmitDebugLogRepository.java | 1 +
.../core/util/SQLiteDatabaseExtensions.kt | 38 ++++++++++++++++
3 files changed, 83 insertions(+)
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionDatabaseSchema.kt
diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionDatabaseSchema.kt b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionDatabaseSchema.kt
new file mode 100644
index 0000000000..04214830c3
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionDatabaseSchema.kt
@@ -0,0 +1,44 @@
+package org.thoughtcrime.securesms.logsubmit
+
+import android.content.Context
+import org.signal.core.util.getAllIndexDefinitions
+import org.signal.core.util.getAllTableDefinitions
+import org.signal.core.util.getForeignKeys
+import org.thoughtcrime.securesms.database.SignalDatabase
+import org.thoughtcrime.securesms.database.helpers.SignalDatabaseMigrations
+
+/**
+ * Renders data pertaining to sender key. While all private info is obfuscated, this is still only intended to be printed for internal users.
+ */
+class LogSectionDatabaseSchema : LogSection {
+ override fun getTitle(): String {
+ return "DATABASE SCHEMA"
+ }
+
+ override fun getContent(context: Context): CharSequence {
+ val builder = StringBuilder()
+ builder.append("--- Metadata").append("\n")
+ builder.append("Version: ${SignalDatabaseMigrations.DATABASE_VERSION}\n")
+ builder.append("\n\n")
+
+ builder.append("--- Tables").append("\n")
+ SignalDatabase.rawDatabase.getAllTableDefinitions().forEach {
+ builder.append(it.statement).append("\n")
+ }
+ builder.append("\n\n")
+
+ builder.append("--- Indexes").append("\n")
+ SignalDatabase.rawDatabase.getAllIndexDefinitions().forEach {
+ builder.append(it.statement).append("\n")
+ }
+ builder.append("\n\n")
+
+ builder.append("--- Foreign Keys").append("\n")
+ SignalDatabase.rawDatabase.getForeignKeys().forEach {
+ builder.append("${it.table}.${it.column} DEPENDS ON ${it.dependsOnTable}.${it.dependsOnColumn}, ON DELETE ${it.onDelete}").append("\n")
+ }
+ builder.append("\n\n")
+
+ return builder
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java
index c7aa37808b..9c7c9ea99c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/SubmitDebugLogRepository.java
@@ -95,6 +95,7 @@ public class SubmitDebugLogRepository {
if (FeatureFlags.internalUser()) {
add(new LogSectionSenderKey());
}
+ add(new LogSectionDatabaseSchema());
add(new LogSectionRemappedRecords());
add(new LogSectionAnr());
add(new LogSectionLogcat());
diff --git a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt
index ff2cf42032..dc67a323f4 100644
--- a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt
+++ b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt
@@ -35,6 +35,39 @@ fun SupportSQLiteDatabase.getTableRowCount(table: String): Int {
}
}
+fun SupportSQLiteDatabase.getAllTables(): List {
+ return SqlUtil.getAllTables(this)
+}
+
+/**
+ * Returns a list of objects that represent the table definitions in the database. Basically the table name and then the SQL that was used to create it.
+ */
+fun SupportSQLiteDatabase.getAllTableDefinitions(): List {
+ return this.query("SELECT name, sql FROM sqlite_schema WHERE type = 'table' AND sql NOT NULL AND name != 'sqlite_sequence'")
+ .readToList { cursor ->
+ CreateStatement(
+ name = cursor.requireNonNullString("name"),
+ statement = cursor.requireNonNullString("sql").replace(" ", "")
+ )
+ }
+ .filterNot { it.name.startsWith("sqlite_stat") }
+ .sortedBy { it.name }
+}
+
+/**
+ * Returns a list of objects that represent the index definitions in the database. Basically the index name and then the SQL that was used to create it.
+ */
+fun SupportSQLiteDatabase.getAllIndexDefinitions(): List {
+ return this.query("SELECT name, sql FROM sqlite_schema WHERE type = 'index' AND sql NOT NULL")
+ .readToList { cursor ->
+ CreateStatement(
+ name = cursor.requireNonNullString("name"),
+ statement = cursor.requireNonNullString("sql")
+ )
+ }
+ .sortedBy { it.name }
+}
+
fun SupportSQLiteDatabase.getForeignKeys(): List {
return SqlUtil.getAllTables(this)
.map { table ->
@@ -426,3 +459,8 @@ data class Index(
val table: String,
val columns: List
)
+
+data class CreateStatement(
+ val name: String,
+ val statement: String
+)
From 713298109a1901a3d6ca49879114742f40d90c52 Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Fri, 5 Apr 2024 16:54:48 -0400
Subject: [PATCH 16/33] Specify indexes for mention table queries.
---
.../securesms/database/MentionTable.kt | 23 +++++++++++--------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt
index a8353e9455..754550dd3c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/MentionTable.kt
@@ -36,9 +36,12 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
)
"""
+ private const val MESSAGE_ID_INDEX = "mention_message_id_index"
+ private const val RECIPIENT_ID_INDEX = "mention_recipient_id_thread_id_index "
+
val CREATE_INDEXES = arrayOf(
- "CREATE INDEX IF NOT EXISTS mention_message_id_index ON $TABLE_NAME ($MESSAGE_ID);",
- "CREATE INDEX IF NOT EXISTS mention_recipient_id_thread_id_index ON $TABLE_NAME ($RECIPIENT_ID, $THREAD_ID);"
+ "CREATE INDEX IF NOT EXISTS $MESSAGE_ID_INDEX ON $TABLE_NAME ($MESSAGE_ID);",
+ "CREATE INDEX IF NOT EXISTS $RECIPIENT_ID_INDEX ON $TABLE_NAME ($RECIPIENT_ID, $THREAD_ID);"
)
}
@@ -61,7 +64,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
fun getMentionsForMessage(messageId: Long): List {
return readableDatabase
.select()
- .from(TABLE_NAME)
+ .from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID = $messageId")
.run()
.readToList { cursor ->
@@ -78,7 +81,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
return readableDatabase
.select()
- .from(TABLE_NAME)
+ .from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID IN ($ids)")
.run()
.use { cursor -> readMentions(cursor) }
@@ -98,7 +101,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
return readableDatabase
.select()
- .from(TABLE_NAME)
+ .from("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where(
"""
$MESSAGE_ID IN (
@@ -115,18 +118,18 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
fun deleteMentionsForMessage(messageId: Long) {
writableDatabase
- .delete(TABLE_NAME)
+ .delete("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where("$MESSAGE_ID = $messageId")
.run()
}
fun deleteAbandonedMentions() {
writableDatabase
- .delete(TABLE_NAME)
+ .delete("$TABLE_NAME INDEXED BY $MESSAGE_ID_INDEX")
.where(
"""
$MESSAGE_ID NOT IN (
- SELECT $MessageTable.ID
+ SELECT ${MessageTable.ID}
FROM ${MessageTable.TABLE_NAME}
)
OR $THREAD_ID NOT IN (
@@ -158,7 +161,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
override fun remapRecipient(fromId: RecipientId, toId: RecipientId) {
writableDatabase
- .update(TABLE_NAME)
+ .update("$TABLE_NAME INDEXED BY $RECIPIENT_ID_INDEX")
.values(RECIPIENT_ID to toId.serialize())
.where("$RECIPIENT_ID = ?", fromId)
.run()
@@ -166,7 +169,7 @@ class MentionTable(context: Context, databaseHelper: SignalDatabase) : DatabaseT
override fun remapThread(fromId: Long, toId: Long) {
writableDatabase
- .update(TABLE_NAME)
+ .update("$TABLE_NAME INDEXED BY $RECIPIENT_ID_INDEX")
.values(THREAD_ID to toId)
.where("$THREAD_ID = $fromId")
.run()
From 982f602178c3c63814811c153a0aabb463e138b7 Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Tue, 9 Apr 2024 16:55:25 -0400
Subject: [PATCH 17/33] Regularly analyze database tables to improve index
usage.
---
app/src/main/AndroidManifest.xml | 6 ++
.../securesms/ApplicationContext.java | 2 +
.../securesms/jobs/AnalyzeDatabaseJob.kt | 100 ++++++++++++++++++
.../securesms/jobs/JobManagerFactories.java | 1 +
.../securesms/keyvalue/MiscellaneousValues.kt | 6 ++
.../service/AnalyzeDatabaseAlarmListener.kt | 54 ++++++++++
6 files changed, 169 insertions(+)
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/jobs/AnalyzeDatabaseJob.kt
create mode 100644 app/src/main/java/org/thoughtcrime/securesms/service/AnalyzeDatabaseAlarmListener.kt
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index e30c8c7137..2fc587e570 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1288,6 +1288,12 @@
+
+
+
+
+
+
diff --git a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
index ff9a15f1a3..e4645b9a13 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/ApplicationContext.java
@@ -83,6 +83,7 @@
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.registration.RegistrationUtil;
import org.thoughtcrime.securesms.ringrtc.RingRtcLogger;
+import org.thoughtcrime.securesms.service.AnalyzeDatabaseAlarmListener;
import org.thoughtcrime.securesms.service.DirectoryRefreshListener;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.service.LocalBackupListener;
@@ -419,6 +420,7 @@ private void initializePeriodicTasks() {
LocalBackupListener.schedule(this);
RotateSenderCertificateListener.schedule(this);
RoutineMessageFetchReceiver.startOrUpdateAlarm(this);
+ AnalyzeDatabaseAlarmListener.schedule(this);
if (BuildConfig.MANAGES_APP_UPDATES) {
ApkUpdateRefreshListener.schedule(this);
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/AnalyzeDatabaseJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/AnalyzeDatabaseJob.kt
new file mode 100644
index 0000000000..9feac49dea
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/AnalyzeDatabaseJob.kt
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2024 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.thoughtcrime.securesms.jobs
+
+import org.signal.core.util.getAllTables
+import org.signal.core.util.logTime
+import org.signal.core.util.logging.Log
+import org.thoughtcrime.securesms.database.SignalDatabase
+import org.thoughtcrime.securesms.jobmanager.Job
+import org.thoughtcrime.securesms.jobmanager.JsonJobData
+import kotlin.time.Duration.Companion.days
+import kotlin.time.Duration.Companion.seconds
+
+/**
+ * Analyzes the database, updating statistics to ensure that sqlite is using the best indices possible for different queries.
+ *
+ * Given that analysis can be slow, this job will only analyze one table at a time, retrying itself so long as there are more tables to analyze.
+ * This should help protect it against getting canceled by the system for running for too long, while also giving it the ability to save it's place.
+ */
+class AnalyzeDatabaseJob private constructor(
+ parameters: Parameters,
+ private var lastCompletedTable: String?
+) : Job(parameters) {
+
+ companion object {
+ val TAG = Log.tag(AnalyzeDatabaseJob::class.java)
+
+ const val KEY = "AnalyzeDatabaseJob"
+
+ private const val KEY_LAST_COMPLETED_TABLE = "last_completed_table"
+ }
+
+ constructor() : this(
+ Parameters.Builder()
+ .setMaxInstancesForFactory(1)
+ .setLifespan(1.days.inWholeMilliseconds)
+ .setMaxAttempts(Parameters.UNLIMITED)
+ .build(),
+ null
+ )
+
+ override fun serialize(): ByteArray? {
+ return JsonJobData.Builder()
+ .putString(KEY_LAST_COMPLETED_TABLE, lastCompletedTable)
+ .build()
+ .serialize()
+ }
+
+ override fun getFactoryKey(): String = KEY
+
+ override fun run(): Result {
+ val tables = SignalDatabase.rawDatabase.getAllTables()
+ .sorted()
+ .filterNot { it.startsWith("sqlite_") || it.contains("fts_") }
+
+ if (tables.isEmpty()) {
+ Log.w(TAG, "Table list is empty!")
+ return Result.success()
+ }
+
+ val startingIndex = if (lastCompletedTable != null) {
+ tables.indexOf(lastCompletedTable) + 1
+ } else {
+ 0
+ }
+
+ if (startingIndex >= tables.size) {
+ Log.i(TAG, "Already finished all of the tables!")
+ return Result.success()
+ }
+
+ val table = tables[startingIndex]
+
+ logTime(TAG, "analyze-$table", decimalPlaces = 2) {
+ SignalDatabase.rawDatabase.execSQL("PRAGMA analysis_limit=1000")
+ SignalDatabase.rawDatabase.execSQL("ANALYZE $table")
+ }
+
+ if (startingIndex >= tables.size - 1) {
+ Log.i(TAG, "Finished all of the tables!")
+ return Result.success()
+ }
+
+ lastCompletedTable = table
+ return Result.retry(1.seconds.inWholeMilliseconds)
+ }
+
+ override fun onFailure() = Unit
+
+ class Factory : Job.Factory {
+ override fun create(parameters: Parameters, data: ByteArray?): AnalyzeDatabaseJob {
+ val builder = JsonJobData.deserialize(data)
+
+ return AnalyzeDatabaseJob(parameters, builder.getStringOrDefault(KEY_LAST_COMPLETED_TABLE, null))
+ }
+ }
+}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
index 98df8e82bf..cb14eba729 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java
@@ -99,6 +99,7 @@ public final class JobManagerFactories {
public static Map getJobFactories(@NonNull Application application) {
return new HashMap() {{
put(AccountConsistencyWorkerJob.KEY, new AccountConsistencyWorkerJob.Factory());
+ put(AnalyzeDatabaseJob.KEY, new AnalyzeDatabaseJob.Factory());
put(AttachmentCompressionJob.KEY, new AttachmentCompressionJob.Factory());
put(AttachmentCopyJob.KEY, new AttachmentCopyJob.Factory());
put(AttachmentDownloadJob.KEY, new AttachmentDownloadJob.Factory());
diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.kt b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.kt
index d1aeeec4aa..9a2aaecfaa 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/MiscellaneousValues.kt
@@ -35,6 +35,7 @@ internal class MiscellaneousValues internal constructor(store: KeyValueStore) :
private const val LAST_CDS_FOREGROUND_SYNC = "misc.last_cds_foreground_sync"
private const val LINKED_DEVICE_LAST_ACTIVE_CHECK_TIME = "misc.linked_device.last_active_check_time"
private const val LEAST_ACTIVE_LINKED_DEVICE = "misc.linked_device.least_active"
+ private const val NEXT_DATABASE_ANALYSIS_TIME = "misc.next_database_analysis_time"
}
public override fun onFirstEverAppLaunch() {
@@ -236,4 +237,9 @@ internal class MiscellaneousValues internal constructor(store: KeyValueStore) :
* Details about the least-active linked device.
*/
var leastActiveLinkedDevice: LeastActiveLinkedDevice? by protoValue(LEAST_ACTIVE_LINKED_DEVICE, LeastActiveLinkedDevice.ADAPTER)
+
+ /**
+ * When the next scheduled database analysis is.
+ */
+ var nextDatabaseAnalysisTime: Long by longValue(NEXT_DATABASE_ANALYSIS_TIME, 0)
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/AnalyzeDatabaseAlarmListener.kt b/app/src/main/java/org/thoughtcrime/securesms/service/AnalyzeDatabaseAlarmListener.kt
new file mode 100644
index 0000000000..9414b40726
--- /dev/null
+++ b/app/src/main/java/org/thoughtcrime/securesms/service/AnalyzeDatabaseAlarmListener.kt
@@ -0,0 +1,54 @@
+package org.thoughtcrime.securesms.service
+
+import android.content.Context
+import org.thoughtcrime.securesms.dependencies.ApplicationDependencies
+import org.thoughtcrime.securesms.jobs.AnalyzeDatabaseJob
+import org.thoughtcrime.securesms.keyvalue.SignalStore
+import org.thoughtcrime.securesms.util.toMillis
+import java.time.LocalDateTime
+
+/**
+ * Schedules database analysis to happen everyday at 3am.
+ */
+class AnalyzeDatabaseAlarmListener : PersistentAlarmManagerListener() {
+ companion object {
+ @JvmStatic
+ fun schedule(context: Context?) {
+ AnalyzeDatabaseAlarmListener().onReceive(context, getScheduleIntent())
+ }
+ }
+
+ override fun shouldScheduleExact(): Boolean {
+ return true
+ }
+
+ override fun getNextScheduledExecutionTime(context: Context): Long {
+ var nextTime = SignalStore.misc().nextDatabaseAnalysisTime
+
+ if (nextTime == 0L) {
+ nextTime = getNextTime()
+ SignalStore.misc().nextDatabaseAnalysisTime = nextTime
+ }
+
+ return nextTime
+ }
+
+ override fun onAlarm(context: Context, scheduledTime: Long): Long {
+ ApplicationDependencies.getJobManager().add(AnalyzeDatabaseJob())
+
+ val nextTime = getNextTime()
+ SignalStore.misc().nextDatabaseAnalysisTime = nextTime
+
+ return nextTime
+ }
+
+ private fun getNextTime(): Long {
+ return LocalDateTime
+ .now()
+ .plusDays(1)
+ .withHour(3)
+ .withMinute(0)
+ .withSecond(0)
+ .toMillis()
+ }
+}
From fa23e4ca70c56d85ea5bb9be75ec1f6a0f862ead Mon Sep 17 00:00:00 2001
From: Alex Hart
Date: Wed, 10 Apr 2024 13:45:46 -0300
Subject: [PATCH 18/33] Convert members collection to set to avoid duplicate
entries.
---
.../main/java/org/thoughtcrime/securesms/database/GroupTable.kt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 a9b7bb417e..884d0e207c 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/GroupTable.kt
@@ -1005,7 +1005,7 @@ class GroupTable(context: Context?, databaseHelper: SignalDatabase?) : DatabaseT
val inserts = SqlUtil.buildBulkInsert(
MembershipTable.TABLE_NAME,
arrayOf(MembershipTable.GROUP_ID, MembershipTable.RECIPIENT_ID),
- members.toContentValues(groupId)
+ members.toSet().toContentValues(groupId)
)
inserts.forEach {
From 831d099503363b0eb2115140cd75c29ba63bb1f3 Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Wed, 10 Apr 2024 13:11:19 -0400
Subject: [PATCH 19/33] Inline the nicknames feature flag.
---
.../conversation/ConversationSettingsFragment.kt | 3 +--
.../RecipientBottomSheetDialogFragment.java | 16 +++++++---------
.../securesms/util/FeatureFlags.java | 10 +---------
3 files changed, 9 insertions(+), 20 deletions(-)
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 a8c3128181..d79f32aa29 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
@@ -94,7 +94,6 @@ import org.thoughtcrime.securesms.util.CommunicationActions
import org.thoughtcrime.securesms.util.ContextUtil
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.ExpirationUtil
-import org.thoughtcrime.securesms.util.FeatureFlags
import org.thoughtcrime.securesms.util.Material3OnScrollHelper
import org.thoughtcrime.securesms.util.ViewUtil
import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter
@@ -503,7 +502,7 @@ class ConversationSettingsFragment : DSLSettingsFragment(
)
}
- if (FeatureFlags.nicknames() && state.recipient.isIndividual && !state.recipient.isSelf) {
+ if (state.recipient.isIndividual && !state.recipient.isSelf) {
clickPref(
title = DSLSettingsText.from(R.string.NicknameActivity__nickname),
icon = DSLSettingsIcon.from(R.drawable.symbol_edit_24),
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 8b25166042..7ba47e1395 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
@@ -219,15 +219,13 @@ public void onViewCreated(@NonNull View fragmentView, @Nullable Bundle savedInst
AboutSheet.create(recipient).show(getParentFragmentManager(), null);
});
- if (FeatureFlags.nicknames()) {
- nickname.setVisibility(View.VISIBLE);
- nickname.setOnClickListener(v -> {
- nicknameLauncher.launch(new NicknameActivity.Args(
- recipientId,
- false
- ));
- });
- }
+ nickname.setVisibility(View.VISIBLE);
+ nickname.setOnClickListener(v -> {
+ nicknameLauncher.launch(new NicknameActivity.Args(
+ recipientId,
+ false
+ ));
+ });
}
String aboutText = recipient.getCombinedAboutAndEmoji();
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 98f1d76ca2..c1ca2b5acf 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
@@ -127,7 +127,6 @@ public final class FeatureFlags {
private static final String RX_MESSAGE_SEND = "android.rxMessageSend";
private static final String LINKED_DEVICE_LIFESPAN_SECONDS = "android.linkedDeviceLifespanSeconds";
private static final String MESSAGE_BACKUPS = "android.messageBackups";
- private static final String NICKNAMES = "android.nicknames";
private static final String CAMERAX_CUSTOM_CONTROLLER = "android.cameraXCustomController";
/**
@@ -208,7 +207,6 @@ public final class FeatureFlags {
CDSI_LIBSIGNAL_NET,
RX_MESSAGE_SEND,
LINKED_DEVICE_LIFESPAN_SECONDS,
- NICKNAMES,
CAMERAX_CUSTOM_CONTROLLER
);
@@ -286,8 +284,7 @@ public final class FeatureFlags {
CDSI_LIBSIGNAL_NET,
RX_MESSAGE_SEND,
LINKED_DEVICE_LIFESPAN_SECONDS,
- CAMERAX_CUSTOM_CONTROLLER,
- NICKNAMES
+ CAMERAX_CUSTOM_CONTROLLER
);
/**
@@ -746,11 +743,6 @@ public static boolean messageBackups() {
return getBoolean(MESSAGE_BACKUPS, false);
}
- /** Whether or not the nicknames feature is available */
- public static boolean nicknames() {
- return getBoolean(NICKNAMES, true);
- }
-
/** Whether or not to use the custom CameraX controller class */
public static boolean customCameraXController() {
return getBoolean(CAMERAX_CUSTOM_CONTROLLER, false);
From 0eda714755dfdaf5f269159a86874a7c6b8d05f8 Mon Sep 17 00:00:00 2001
From: Alex Hart
Date: Wed, 10 Apr 2024 14:21:34 -0300
Subject: [PATCH 20/33] Send recipients when sending group story sync.
---
.../securesms/messages/GroupSendUtil.java | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java
index b54c7a92bf..591470b648 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/GroupSendUtil.java
@@ -65,6 +65,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
public final class GroupSendUtil {
@@ -212,7 +213,15 @@ public static List sendGroupStoryMessage(@NonNull Context con
allTargets,
isRecipientUpdate,
true,
- new StorySendOperation(messageId, groupId, sentTimestamp, message, Collections.emptySet()),
+ new StorySendOperation(messageId,
+ groupId,
+ sentTimestamp,
+ message,
+ allTargets.stream()
+ .map(target -> new SignalServiceStoryMessageRecipient(new SignalServiceAddress(target.requireServiceId()),
+ Collections.emptyList(),
+ true))
+ .collect(Collectors.toSet())),
null);
}
From 6ece776382c4a7e955c85f0d938065a13f3e6849 Mon Sep 17 00:00:00 2001
From: tedgravlin
Date: Fri, 9 Feb 2024 16:16:56 -0500
Subject: [PATCH 21/33] Fix navbar color in multiple instances.
---
app/src/main/res/values-v21/themes.xml | 6 +++---
app/src/main/res/values-v23/themes.xml | 4 ++--
app/src/main/res/values-v27/themes.xml | 6 +++---
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/app/src/main/res/values-v21/themes.xml b/app/src/main/res/values-v21/themes.xml
index 4cda35b7cb..5bcaf06234 100644
--- a/app/src/main/res/values-v21/themes.xml
+++ b/app/src/main/res/values-v21/themes.xml
@@ -32,13 +32,13 @@
@@ -47,7 +47,7 @@
- false
- @color/transparent
- false
- - @color/core_black
+ - @color/signal_colorBackground
- false
From db4442939d373fec05274e2df5a98f0f037d2946 Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Wed, 10 Apr 2024 14:52:46 -0400
Subject: [PATCH 22/33] Remove Environment.IS_PNP
---
.../main/java/org/thoughtcrime/securesms/util/Environment.kt | 1 -
.../main/java/org/thoughtcrime/securesms/util/FeatureFlags.java | 2 +-
2 files changed, 1 insertion(+), 2 deletions(-)
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt b/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt
index 203a115bc5..088eda5961 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/Environment.kt
@@ -7,7 +7,6 @@ import org.thoughtcrime.securesms.BuildConfig
object Environment {
const val IS_STAGING: Boolean = BuildConfig.BUILD_ENVIRONMENT_TYPE == "Staging" || BuildConfig.BUILD_ENVIRONMENT_TYPE == "Pnp"
- const val IS_PNP: Boolean = BuildConfig.BUILD_ENVIRONMENT_TYPE == "Pnp"
const val IS_NIGHTLY: Boolean = BuildConfig.BUILD_DISTRIBUTION_TYPE == "nightly"
const val IS_WEBSITE: Boolean = BuildConfig.BUILD_DISTRIBUTION_TYPE == "website"
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 c1ca2b5acf..8d01e87009 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
@@ -378,7 +378,7 @@ public static boolean payments() {
/** Internal testing extensions. */
public static boolean internalUser() {
- return getBoolean(INTERNAL_USER, false) || Environment.IS_PNP || Environment.IS_STAGING;
+ return getBoolean(INTERNAL_USER, false) || Environment.IS_STAGING;
}
/** Whether or not to use the UUID in verification codes. */
From c1d29b5c39cc5398e88c9b52dd73bf6f46b2c64d Mon Sep 17 00:00:00 2001
From: Greyson Parrelli
Date: Wed, 10 Apr 2024 14:54:35 -0400
Subject: [PATCH 23/33] Set internalUser=true for nightly builds.
---
.../main/java/org/thoughtcrime/securesms/util/FeatureFlags.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
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 8d01e87009..b9e9355886 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java
@@ -378,7 +378,7 @@ public static boolean payments() {
/** Internal testing extensions. */
public static boolean internalUser() {
- return getBoolean(INTERNAL_USER, false) || Environment.IS_STAGING;
+ return getBoolean(INTERNAL_USER, false) || Environment.IS_NIGHTLY || Environment.IS_STAGING;
}
/** Whether or not to use the UUID in verification codes. */
From 02eed02cb8076d9fb9e7185b34eb046e53fcfeb7 Mon Sep 17 00:00:00 2001
From: Alex Hart
Date: Wed, 10 Apr 2024 16:29:24 -0300
Subject: [PATCH 24/33] Update translations and other static files.
---
app/src/main/res/values-af/strings.xml | 1 -
app/src/main/res/values-ar/strings.xml | 1 -
app/src/main/res/values-az/strings.xml | 1 -
app/src/main/res/values-bg/strings.xml | 1 -
app/src/main/res/values-bn/strings.xml | 1 -
app/src/main/res/values-bs/strings.xml | 1 -
app/src/main/res/values-ca/strings.xml | 1 -
app/src/main/res/values-cs/strings.xml | 1 -
app/src/main/res/values-da/strings.xml | 1 -
app/src/main/res/values-de/strings.xml | 1 -
app/src/main/res/values-el/strings.xml | 1 -
app/src/main/res/values-es/strings.xml | 1 -
app/src/main/res/values-et/strings.xml | 1 -
app/src/main/res/values-eu/strings.xml | 1 -
app/src/main/res/values-fa/strings.xml | 1 -
app/src/main/res/values-fi/strings.xml | 1 -
app/src/main/res/values-fr/strings.xml | 3 +-
app/src/main/res/values-ga/strings.xml | 1 -
app/src/main/res/values-gl/strings.xml | 1 -
app/src/main/res/values-gu/strings.xml | 1 -
app/src/main/res/values-hi/strings.xml | 1 -
app/src/main/res/values-hr/strings.xml | 1 -
app/src/main/res/values-hu/strings.xml | 1 -
app/src/main/res/values-in/strings.xml | 1 -
app/src/main/res/values-it/strings.xml | 1 -
app/src/main/res/values-iw/strings.xml | 1 -
app/src/main/res/values-ja/strings.xml | 1 -
app/src/main/res/values-ka/strings.xml | 1 -
app/src/main/res/values-kk/strings.xml | 1 -
app/src/main/res/values-km/strings.xml | 1 -
app/src/main/res/values-kn/strings.xml | 1 -
app/src/main/res/values-ko/strings.xml | 1 -
app/src/main/res/values-ky/strings.xml | 1 -
app/src/main/res/values-lt/strings.xml | 1 -
app/src/main/res/values-lv/strings.xml | 1 -
app/src/main/res/values-mk/strings.xml | 1 -
app/src/main/res/values-ml/strings.xml | 1 -
app/src/main/res/values-mr/strings.xml | 1 -
app/src/main/res/values-ms/strings.xml | 1 -
app/src/main/res/values-my/strings.xml | 1 -
app/src/main/res/values-nb/strings.xml | 1 -
app/src/main/res/values-nl/strings.xml | 1 -
app/src/main/res/values-pa/strings.xml | 1 -
app/src/main/res/values-pl/strings.xml | 1 -
app/src/main/res/values-pt-rBR/strings.xml | 1 -
app/src/main/res/values-pt/strings.xml | 1 -
app/src/main/res/values-ro/strings.xml | 1 -
app/src/main/res/values-ru/strings.xml | 1 -
app/src/main/res/values-sk/strings.xml | 1 -
app/src/main/res/values-sl/strings.xml | 1 -
app/src/main/res/values-sq/strings.xml | 1 -
app/src/main/res/values-sr/strings.xml | 1 -
app/src/main/res/values-sv/strings.xml | 1 -
app/src/main/res/values-sw/strings.xml | 1 -
app/src/main/res/values-ta/strings.xml | 1 -
app/src/main/res/values-te/strings.xml | 1 -
app/src/main/res/values-th/strings.xml | 1 -
app/src/main/res/values-tl/strings.xml | 1 -
app/src/main/res/values-tr/strings.xml | 1 -
app/src/main/res/values-ug/strings.xml | 1 -
app/src/main/res/values-uk/strings.xml | 37 +++++++++++-----------
app/src/main/res/values-ur/strings.xml | 1 -
app/src/main/res/values-vi/strings.xml | 1 -
app/src/main/res/values-yue/strings.xml | 1 -
app/src/main/res/values-zh-rCN/strings.xml | 1 -
app/src/main/res/values-zh-rHK/strings.xml | 1 -
app/src/main/res/values-zh-rTW/strings.xml | 1 -
app/static-ips.gradle.kts | 4 +--
68 files changed, 21 insertions(+), 88 deletions(-)
diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml
index 4a8652e9fc..130cc556b9 100644
--- a/app/src/main/res/values-af/strings.xml
+++ b/app/src/main/res/values-af/strings.xml
@@ -307,7 +307,6 @@
Kon nie stuur nie
%1$s het die groep verlaat.
Stuur onderbreek
- Stuur misluk. Tik vir onbeveiligde terugval
Terugval na ongeënkripteerde SMS?
Terugval na ongeënkripteerde MMS?
Hierdie boodskap sal nie geënkripteer word nie omdat die ontvanger nie meer \'n Signal-verbruiker is nie.\n\nStuur \'n onbeveiligde boodskap?
diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml
index 29b00b0786..7de97181f7 100644
--- a/app/src/main/res/values-ar/strings.xml
+++ b/app/src/main/res/values-ar/strings.xml
@@ -311,7 +311,6 @@
فشل الإرسال
لقد غادر المستخدم %1$s المجموعة.
إن الإرسال متوقف مؤقتا
- فشل الإرسال، المس للاستعاضة بإرسال غير آمن
الاستعاضة برسالة SMS غير مُعمَّاة؟
الاستعاضة برسالة وسائط متعددة غير مُعمَّاة؟
هذه الرسالة ستكون غير مٌعمَّاة لأن المستلم لم يعد مستخدما لسيجنالl .\n\nهل لديك الرغبة في إرسالها غير آمنة ؟
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
index 9923aa4552..39203a744d 100644
--- a/app/src/main/res/values-az/strings.xml
+++ b/app/src/main/res/values-az/strings.xml
@@ -307,7 +307,6 @@
Göndərilmədi
%1$s qrupu tərk etdi.
Göndərişə fasilə verildi
- Göndərilmədi, şifrəsiz göndərmək üçün toxunun
Şifrələnməmiş SMS-ə geri qayıdılsın?
Şifrələnməmiş MMS-ə geri qayıdılsın?
Bu mesaj şifrələnməyəcək, çünki alıcı artıq Signal istifadəçisi deyil.\n\nGüvənli olmayan mesaj göndərilsin?
diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml
index e608d3294b..d051b12a3d 100644
--- a/app/src/main/res/values-bg/strings.xml
+++ b/app/src/main/res/values-bg/strings.xml
@@ -307,7 +307,6 @@
Изпращането неуспешно
%1$s напусна групата.
Изпращането задържано
- Неуспешно изпращане, натиснете за изпращане по несигурен начин
Разреши преминавене към нешифровани SMS-и?
Разреши преминавене към нешифровани MMS-и?
Това съобщение НЯМА да бъде криптирано, защото получателят вече не е потребител на Signal.\n\nИзпращане на незащитено съобщение?
diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml
index 160f5f33e2..6bc99e7d5b 100644
--- a/app/src/main/res/values-bn/strings.xml
+++ b/app/src/main/res/values-bn/strings.xml
@@ -307,7 +307,6 @@
পাঠাতে ব্যর্থ
%1$s গ্রুপ ত্যাগ করেছে।
সাময়িকভাবে পাঠানো বদ্ধ
- পাঠাতে ব্যর্থ, অসুরক্ষিত পন্থা অবলম্বনের জন্য চাপুন
অনাবৃত SMS অবলম্বন করবেন?
অনাবৃত MMS অবলম্বন করবেন?
এই বার্তাটি গোপনীয় হবে না কারণ গ্রাহক আর Signal এর ব্যবহারকারী নয়। অসুরক্ষিত বার্তা পাঠাবেন?
diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml
index 4539cd31ca..b7bf374051 100644
--- a/app/src/main/res/values-bs/strings.xml
+++ b/app/src/main/res/values-bs/strings.xml
@@ -309,7 +309,6 @@
Neuspjelo slanje
%1$s je napustio/la grupu.
Slanje pauzirano
- Slanje nije uspjelo. Dodirnite za nešifriranu alternativu.
Koristiti nešifrirani SMS?
Koristiti nešifrirani MMS?
Poruka neće biti šifrirana jer primalac više ne koristi Signal.\n\nPoslati nezaštićenu poruku?
diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml
index 64d64a9848..692f5971a0 100644
--- a/app/src/main/res/values-ca/strings.xml
+++ b/app/src/main/res/values-ca/strings.xml
@@ -307,7 +307,6 @@
L\'enviament ha fallat
%1$s ha abandonat el grup.
Enviament interromput
- Ha fallat l\'enviament. Toqueu per al mode no segur.
Voleu canviar a SMS sense encriptar?
Voleu canviar a MMS sense encriptar?
Aquest missatge no s\'encriptarà perquè el destinatari ja no és usuari del Signal.\n\nVoleu enviar un missatge no segur?
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
index 0b8a5294f1..aa1fa13177 100644
--- a/app/src/main/res/values-cs/strings.xml
+++ b/app/src/main/res/values-cs/strings.xml
@@ -309,7 +309,6 @@
Odeslání selhalo
%1$s opustil skupinu.
Odesílání pozastaveno
- Odeslání se nezdařilo, klepněte pro odeslání nešifrovaným způsobem
Použít záložní způsob přes nešifrovanou SMS?
Použít záložní způsob přes nešifrovanou MMS?
Tato zpráva není šifrována, protože příjemce již nepoužívá Signal.\n\nOdeslat nešifrovanou zprávu?
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
index 7c302b3f5a..91223735cc 100644
--- a/app/src/main/res/values-da/strings.xml
+++ b/app/src/main/res/values-da/strings.xml
@@ -307,7 +307,6 @@
Afsendelse mislykkedes
%1$s har forladt gruppen.
Afsendelse sat på pause
- Fejl ved afsendelse. Tryk for at sende usikret SMS
Benyt ukrypteret SMS?
Benyt ukrypteret MMS?
Denne besked vil ikke blive krypteret, da modtageren ikke længere bruger Signal.\n\nSend usikret besked?
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 37baa7aa77..cc700410e1 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -307,7 +307,6 @@
Versand gescheitert
%1$s hat die Gruppe verlassen.
Senden pausiert
- Versand gescheitert. Antippen um auf unverschlüsselten Versand auszuweichen.
Auf unverschlüsselte SMS ausweichen?
Auf unverschlüsselte MMS ausweichen?
Diese Nachricht wird nicht verschlüsselt, da der Empfänger Signal nicht mehr verwendet.\n\nUnverschlüsselte Nachricht senden?
diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml
index 4ec839beb8..7b56823e7d 100644
--- a/app/src/main/res/values-el/strings.xml
+++ b/app/src/main/res/values-el/strings.xml
@@ -307,7 +307,6 @@
Αποτυχία αποστολής
Ο/Η %1$s αποχώρησε απ\' την ομάδα.
Η αποστολή βρίσκεται σε αναμονή
- Η αποστολή απέτυχε, πάτα για εναλλακτική, μη ασφαλή αποστολή
Να σταλεί ΜΗ κρυπτογραφημένο μήνυμα SMS;
Να σταλεί ΜΗ κρυπτογραφημένο μήνυμα MMS;
Αυτό το μήνυμα δεν θα κρυπτογραφηθεί, επειδή ο παραλήπτης δεν είναι πλέον χρήστης του Signal.\n\nΝα σταλεί το μήνυμα μη κρυπτογραφημένο;
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
index 074fe08672..1144a596e7 100644
--- a/app/src/main/res/values-es/strings.xml
+++ b/app/src/main/res/values-es/strings.xml
@@ -307,7 +307,6 @@
Fallo al enviar
%1$s ha abandonado el grupo.
Envío pausado
- Fallo al enviar. Toca para enviar sin cifrar
¿Enviar como SMS no cifrado?
¿Enviar como MMS no cifrado?
Este mensaje no se cifrará porque esta persona ya no usa Signal.\n\n¿Enviar mensaje sin cifrar?
diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml
index af1eaa33ea..a396ec7c4c 100644
--- a/app/src/main/res/values-et/strings.xml
+++ b/app/src/main/res/values-et/strings.xml
@@ -307,7 +307,6 @@
Saatmine ei õnnestunud
%1$s lahkus grupist.
Saatmine peatatud
- Saatmine ebaõnnestus, koputa, et saata turvamata sõnum
Taganed krüptimata SMSile?
Taganed krüptimata MMSile?
Seda sõnumit ei krüptita, kuna saaja ei ole enam Signali kasutaja.\n\nKas saata krüptimata sõnum?
diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml
index f35fcdd021..35729b7983 100644
--- a/app/src/main/res/values-eu/strings.xml
+++ b/app/src/main/res/values-eu/strings.xml
@@ -307,7 +307,6 @@
Bidaltzeak huts egin du
%1$s taldea utzi du
Bidalketa eten egin da
- Ezin izan da bidali; sakatu segurtasunik gabeko alternatibarako
Alternatiba gisa, enkriptatu gabeko SMS mezuak erabili?
Enkriptatu gabeko MMSaz baliatu?
Mezu hau ez da enkriptatuko: hartzailea ez da jada Signal aplikazioaren erabiltzailea.\n\nSegurtasunik gabeko mezua bidali?
diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml
index 3ba83e6642..9ab2a94eba 100644
--- a/app/src/main/res/values-fa/strings.xml
+++ b/app/src/main/res/values-fa/strings.xml
@@ -307,7 +307,6 @@
ارسال ناموفق بود
%1$s گروه را ترک کرد.
ارسال متوقف شد
- ارسال ناموفق بود، برای بازگشت به ارتباط ناامن ضربه بزنید
بازگشت به حالت پیامک رمزگذاری نشده؟
بازگشت به حالت پیام چندرسانهای رمزگذاری نشده؟
این پیام رمزگذاری شده نخواهد بود چون گیرنده دیگر یک کاربر سیگنال نیست.\n\n پیام به صورت ناامن ارسال شود؟
diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml
index a95056b797..1dc821eb4e 100644
--- a/app/src/main/res/values-fi/strings.xml
+++ b/app/src/main/res/values-fi/strings.xml
@@ -307,7 +307,6 @@
Lähetys epäonnistui
%1$s on poistunut ryhmästä.
Lähetys keskeytetty
- Lähetys epäonnistui, lähetä suojaamattomana napauttamalla
Käytetäänkö salaamattomia tekstiviestejä?
Käytetäänkö salaamattomia MMS-viestejä?
Tätä viestiä ei voida salata, koska vastaanottaja ei enää käytä Signalia.\n\nLähetetäänkö salaamattomana?
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d9f4d4a2f2..b88496ff31 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -307,7 +307,6 @@
Échec d’envoi
%1$s a quitté le groupe.
L’envoi a été mis en pause
- Échec d’envoi, touchez pour utiliser la solution de rechange non sécurisée
Se replier sur un texto non chiffré ?
Se replier sur un message multimédia non chiffré ?
Ce message ne sera pas chiffré, car le destinataire n’est plus un utilisateur de Signal.\n\nEnvoyer un message non sécurisé ?
@@ -2926,7 +2925,7 @@
Description du groupe
- Passez à la dernière version de Signal
+ Installez la dernière version de Signal
Cette version de Signal est arrivée à expiration. Pour continuer d’utiliser l’application, une mise à jour est nécessaire.
diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml
index 7d39ddadcd..2dacd97971 100644
--- a/app/src/main/res/values-ga/strings.xml
+++ b/app/src/main/res/values-ga/strings.xml
@@ -310,7 +310,6 @@
Theip ar an seoladh
D\'fhág %1$s an bhaicle.
Seoladh curtha ar sos
- Theip ar an seoladh, cnag air i gcomhair rogha nach bhfuil slán
An bhfuil tú sásta le SMS gan chriptiú?
An bhfuil tú sásta le MMS gan chriptiú?
Ní bheidh an teachtaireacht seo criptithe mar níl an faighteoir sa lucht Signal a thuilleadh.\n\nSeol teachtaireacht neamhcriptithe?
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
index a8627dfd14..0a8396aefe 100644
--- a/app/src/main/res/values-gl/strings.xml
+++ b/app/src/main/res/values-gl/strings.xml
@@ -307,7 +307,6 @@
Erro ao enviar
%1$s abandonou o grupo.
Envío en pausa
- Erro ao enviar, toca para volver a un modo non seguro
Volver a SMS sen cifrar?
Volver a MMS sen cifrar?
Esta mensaxe non será cifrada porque o seu destinatario xa non é usuario de Signal.\n\nEnviar mensaxe insegura?
diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml
index d3926b3176..ac8d8fed4d 100644
--- a/app/src/main/res/values-gu/strings.xml
+++ b/app/src/main/res/values-gu/strings.xml
@@ -307,7 +307,6 @@
મોકલવામાં નિષ્ફળ
%1$s એ ગ્રુપ છોડયુ.
મેસેજ મોકવાનુ અટકાવવામાં આવ્યુ છે
- મોકલવામાં નિષ્ફળ, અસુરક્ષિત ફૉલબેક માટે ટેપ કરો
અનઇક્રિપ્ટ થયેલ SMS ફૉલબેક?
અનઇક્રિપ્ટ થયેલ MMS ફૉલબેક?
આ મેસેજ એન્ક્રિપ્ટ કરવામાં આવશે નહીં કારણ કે પ્રાપ્તકર્તા હવે Signal વપરાશકર્તા નથી.\n\nઅસુરક્ષિત મેસેજ મોકલવો છે?
diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml
index ac12777a9a..45fde3ea2f 100644
--- a/app/src/main/res/values-hi/strings.xml
+++ b/app/src/main/res/values-hi/strings.xml
@@ -307,7 +307,6 @@
भेजना असफल रहा
%1$s ने समूह को छोड़ दिया है
भेजें रोका गया
- भेजने में असफल रहा, असुरक्षित फ़ॉलबैक के लिए टैप करें
अनएन्क्रिप्टेड SMS पर फॉलबैक?
अनएन्क्रिप्टेड MMS पर फॉलबैक?
यह मेसेज एन्क्रिप्ट नहीं किया जाएगा क्योंकि प्राप्तकर्ता अब Signal उपयोगकर्ता नहीं है। \n\n असुरक्षित मेसेज भेजें?
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
index 3ea20e6b51..bcd46daa59 100644
--- a/app/src/main/res/values-hr/strings.xml
+++ b/app/src/main/res/values-hr/strings.xml
@@ -309,7 +309,6 @@
Slanje nije uspjelo
%1$s je napustio/la grupu.
Slanje je zaustavljeno
- Slanje nije uspjelo, pritisnite za nezaštićenu alternativu
Nešifrirani SMS kao zamjena?
Nešifrirani MMS kao zamjena?
Ova poruka neće biti šifrirana zato što primatelj nije više Signal korisnik.\n\nPošalji nesigurnu poruku?
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
index fdb037fb5f..c27f05980d 100644
--- a/app/src/main/res/values-hu/strings.xml
+++ b/app/src/main/res/values-hu/strings.xml
@@ -307,7 +307,6 @@
Küldés sikertelen
%1$s kilépett a csoportból.
Küldés felfüggesztve
- Sikertelen küldés, koppints a titkosítatlan üzenetküldéshez
Szeretnél visszaállni titkosítatlan SMS-re?
Szeretnél visszaállni titkosítatlan MMS-re?
Ez az üzenet nem lesz titkosítva, mert a címzett már nem Signal felhasználó.\n\nElküldöd titkosítatlan üzenetként?
diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml
index 51b213f95b..6ee2abbff2 100644
--- a/app/src/main/res/values-in/strings.xml
+++ b/app/src/main/res/values-in/strings.xml
@@ -306,7 +306,6 @@
Pengiriman gagal
%1$s telah meninggalkan grup.
Pengiriman ditunda
- Gagal mengirim, ketuk untuk mengirim kembali tanpa enkripsi
Alihkan ke pengiriman SMS tanpa enkripsi?
Alihkan ke pengiriman MMS tanpa enkripsi?
Pesan ini tidak akan dienkripsi karena penerima tidak lagi menjadi pengguna Signal.\n\nTetap kirim pesan tidak aman?
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
index 69302ace2b..dc847f41c3 100644
--- a/app/src/main/res/values-it/strings.xml
+++ b/app/src/main/res/values-it/strings.xml
@@ -307,7 +307,6 @@
Invio non riuscito
%1$s ha lasciato il gruppo.
Invio in pausa
- Invio fallito, tocca per invio non sicuro
Tornare agli SMS non cifrati?
Tornare agli MMS non cifrati?
Questo messaggio non sarà criptato perché il destinatario non è più un utente Signal.\n\nInviare un messaggio non sicuro?
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
index 5b441879c2..4e26b2d2db 100644
--- a/app/src/main/res/values-iw/strings.xml
+++ b/app/src/main/res/values-iw/strings.xml
@@ -309,7 +309,6 @@
השליחה נכשלה
%1$s עזב את הקבוצה.
שליחה מושהית
- שליחה נכשלה, הקש לנסיגה בלתי מאובטחת
לסגת אל מסרון בלתי מוצפן?
לסגת אל MMS בלתי מוצפן?
הודעה זו לא תוצפן כי הנמען אינו משתמש Signal יותר.\n\nלשלוח הודעה בלתי מאובטחת?
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
index a3ec5a799d..e0f3856d98 100644
--- a/app/src/main/res/values-ja/strings.xml
+++ b/app/src/main/res/values-ja/strings.xml
@@ -306,7 +306,6 @@
送信に失敗しました。
%1$s がグループを抜けました。
送信保留中
- 送信失敗、タップして保護されていない通信に切り替える
暗号化されないSMSに切り替えますか?
暗号化されないMMSに切り替えますか?
相手がSignalを使用していないので、このメッセージは暗号化されません。 \n\n安全でない方法でメッセージを送信しますか?
diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml
index 99d73b5757..f305b87202 100644
--- a/app/src/main/res/values-ka/strings.xml
+++ b/app/src/main/res/values-ka/strings.xml
@@ -307,7 +307,6 @@
გაგზავნა ვერ მოხერხდა
%1$s დატოვა ჯგუფი.
გაგზავნა შეჩერებულია
- გაგზავნა ვერ მოხერხდა, დააჭირე არასაიმედო რეზერვისთვის
დავაბრუნოთ დაუშიფრავ SMS-ზე?
დავაბრუნოთ დაუშიფრავ MMS-ზე?
ეს მესიჯი არ იქნება დაშიფრული, რადგან მიმღები აღარ არის Signalს მომხმარებელი. \n\nგავაგზავნოთ დაუშიფრავი შეტყობინება?
diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml
index 21f63c69d2..41c8cdb7db 100644
--- a/app/src/main/res/values-kk/strings.xml
+++ b/app/src/main/res/values-kk/strings.xml
@@ -307,7 +307,6 @@
Жіберілмеді
%1$s топтан шығып кетті.
Жіберу кідіртілді
- Жіберілмеді, қорғалмаған резервтік көшірме жасау үшін түртіңіз
Шифрланбаған SMS-хатқа резервтік көшірме жасау керек пе?
Шифрланбаған MMS-хатқа резервтік көшірме жасау керек пе?
Бұл хат шифрланбайды, себебі алушы Signal пайдаланушысы емес.\n\nҚорғалмаған хат жіберу керек пе?
diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml
index fd68ec1ac4..2fae57363a 100644
--- a/app/src/main/res/values-km/strings.xml
+++ b/app/src/main/res/values-km/strings.xml
@@ -306,7 +306,6 @@
ផ្ញើបរាជ័យ
%1$s នាក់បានចាកចេញពីក្រុម។
ការផ្ញើបានផ្អាក
- ផ្ញើបរាជ័យ ចុច សម្រាប់ជំនួសគ្មានសុវត្ថិភាព
ជំនួសទៅSMSគ្មានសុវត្ថិភាព?
ជំនួសទៅMMSគ្មានសុវត្ថិភាព?
សារនេះនឹង មិនមែន ត្រូវបានកាណាល់កូដសម្ងាត់ទេ ពីព្រោះអ្នកទទួលឈប់ប្រើ Signal។\n\nផ្ញើសារដែរគ្មានសុវត្ថិភាព?
diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml
index 6c12eebf60..04c7531e40 100644
--- a/app/src/main/res/values-kn/strings.xml
+++ b/app/src/main/res/values-kn/strings.xml
@@ -307,7 +307,6 @@
ಕಳಿಸಲು ವಿಫಲವಾಯಿತು
%1$s ಗುಂಪನ್ನು ಬಿಟ್ಟಿದ್ದಾರೆ
ವಿರಾಮಗೊಳಿಸಿ ಕಳುಹಿಸಿ
- ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ, ಅಸುರಕ್ಷಿತವಾಗಿ ತಗ್ಗಿಸುವುದಕ್ಕೆ ಟ್ಯಾಪ್ ಮಾಡಿ
ಅನ್ಎನ್ಕ್ರಿಪ್ಟೆಡ್ ಎಸ್ಎಂಎಸ್ ತಗ್ಗಿಸುವುದೇ?
ಅನ್ಎನ್ಕ್ರಿಪ್ಟೆಡ್ ಎಂಎಂಎಸ್ ತಗ್ಗಿಸುವುದೇ?
ಸ್ವೀಕರಿಸುವವರು ಇನ್ನು ಮುಂದೆ Signal ಬಳಕೆದಾರರಲ್ಲದ ಕಾರಣ ಈ ಸಂದೇಶವನ್ನು ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಲಾಗುವುದಿಲ್ಲ.\n\nಅಸುರಕ್ಷಿತ ಸಂದೇಶವನ್ನು ಕಳುಹಿಸುವುದೇ?
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
index 896a335473..dd00ace892 100644
--- a/app/src/main/res/values-ko/strings.xml
+++ b/app/src/main/res/values-ko/strings.xml
@@ -306,7 +306,6 @@
보내기 실패
%1$s 님이 그룹에서 탈퇴했습니다.
전송 일시 중지됨
- 전송 실패, 탭하여 비보안 연결 시도
비보안 SMS로 바꾸시겠습니까?
비보안 MMS로 바꾸시겠습니까?
수신자가 이제 Signal 사용자가 아니므로 메시지가 암호화되지 않습니다.\n\n비보안 메시지를 보내시겠습니까?
diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml
index 875c042c20..e65d40dd64 100644
--- a/app/src/main/res/values-ky/strings.xml
+++ b/app/src/main/res/values-ky/strings.xml
@@ -306,7 +306,6 @@
Жөнөтүлбөй калды
%1$s топтон чыгып кетти.
Жөнөтүү бир азга тындырылды
- Жөнөтүлгөн жок. Корголбогон бойдон жөнөтөсүзбү?
Шифрленбеген SMS катары жөнөтөсүзбү?
Шифрленбеген MMS катары жөнөтөсүзбү?
Алуучу Signal\'ды колдонбой калгандыктан, бул билдирүү шифрленбейт.\n\nБилдирүүнү корголбогон бойдон жөнөтө бересизби?
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
index eae9fc9845..8ef77769e8 100644
--- a/app/src/main/res/values-lt/strings.xml
+++ b/app/src/main/res/values-lt/strings.xml
@@ -309,7 +309,6 @@
Išsiuntimas nepavyko
%1$s išėjo iš grupės.
Siuntimas pristabdytas
- Siuntimas nepavyko, bakstelėkite, norėdami sugrįžti nesaugaus surogato
Sugrįžti prie nešifruotų SMS naudojimo?
Sugrįžti prie nešifruotų MMS naudojimo?
Ši žinutė nebus užšifruota, nes gavėjas daugiau nebėra Signal naudotojas.\n\nSiųsti neapsaugotą žinutę?
diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml
index ab61b20492..0f77ee1859 100644
--- a/app/src/main/res/values-lv/strings.xml
+++ b/app/src/main/res/values-lv/strings.xml
@@ -308,7 +308,6 @@
Sūtīšana neizdevās
%1$s ir pametis grupu.
Sūtīšana pauzēta
- Sūtīšana neizdevās, pieskarieties, lai veiktu nedrošu sūtījumu, izmantojot rezerves kanālu
Pāriet uz nedrošu saziņu, lietojot nešifrētu SMS?
Pāriet uz nedrošu saziņu, lietojot nešifrētu MMS?
Šī ziņa netiks šifrēta, jo saņēmējs vairs nav Signal lietotājs.\n\nSūtīt nedrošu ziņu?
diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml
index 134726c12d..f309d9caed 100644
--- a/app/src/main/res/values-mk/strings.xml
+++ b/app/src/main/res/values-mk/strings.xml
@@ -307,7 +307,6 @@
Испраќањето е неуспешно
%1$s ја напушти групата.
Испраќањето е паузирано
- Испраќањето не успеа, допрете за незаштитен одговор
Да се вратам на нешифрирани SMS пораки?
Да се вратам на нешифрирани MMS пораки?
Оваа порака нема да биде шифрирана бидејќи примачот повеќе не е корисник на Signal.\n\nДа се испрати незаштитена порака?
diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml
index 0387f38f5e..1cb85ac12e 100644
--- a/app/src/main/res/values-ml/strings.xml
+++ b/app/src/main/res/values-ml/strings.xml
@@ -307,7 +307,6 @@
അയയ്ക്കുന്നത് പരാജയപ്പെട്ടു
%1$s ഈ ഗ്രൂപ്പില് നിന്നും പോയി.
അയയ്ക്കുന്നത് താൽക്കാലികമായി നിർത്തി
- അയയ്ക്കാൻ പറ്റിയില്ല, സുരക്ഷിതമല്ലാത്ത ഇതരരീതിക്കായി ടാപ്പ് ചെയ്യുക
എൻക്രിപ്റ്റ് ചെയ്യാത്ത SMS പകരം ഉപയോഗിക്കട്ടെ?
എൻക്രിപ്റ്റ് ചെയ്യാത്ത MMS പകരം ഉപയോഗിക്കട്ടെ?
സ്വീകർത്താവ് ഇപ്പോൾ ഒരു Signal ഉപയോക്താവല്ലാത്തതിനാൽ ഈ സന്ദേശം എൻക്രിപ്റ്റ് ചെയ്യില്ല. \n\nസുരക്ഷിതമല്ലാത്ത സന്ദേശം അയയ്ക്കണോ?
diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml
index a5333c0a48..6cb235d1f5 100644
--- a/app/src/main/res/values-mr/strings.xml
+++ b/app/src/main/res/values-mr/strings.xml
@@ -307,7 +307,6 @@
पाठविणे अयशस्वी
%1$s याने गट सोडले आहे.
विराम दिलेले पाठवा
- पाठविणे अयशस्वी, असुरक्षित फॉलबॅक करिता टॅप करा
अनएन्क्रिप्टेड SMS वर फॉलबॅक करायचे?
अनएन्क्रिप्टेड MMS वर फॉलबॅक करायचे?
हा संदेश एन्क्रिप्ट केला जाणार नाही कारण प्राप्तकर्ता आता Signal वापरकर्ता राहिलेला नाही.\n\nअसुरक्षित संदेश पाठवायचा?
diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml
index 14da56146d..86ba6d52d4 100644
--- a/app/src/main/res/values-ms/strings.xml
+++ b/app/src/main/res/values-ms/strings.xml
@@ -306,7 +306,6 @@
Penghantaran gagal
%1$s telah meninggalkan kumpulan.
Penghantaran dijeda
- Gagal menghantar, ketik untuk sandaran tidak selamat
Sandaran ke SMS yang tidak disulitkan?
Sandaran ke MMS yang tidak disulitkan?
Mesej ini tidak akan disulitkan sebab penerima bukan lagi pengguna Signal.n\nHantar mesej yang tidak dilindungi?
diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml
index 5f0e360f93..ce88c91ac0 100644
--- a/app/src/main/res/values-my/strings.xml
+++ b/app/src/main/res/values-my/strings.xml
@@ -306,7 +306,6 @@
ပို့ဆောင်မှု မအောင်မြင်ပါ
%1$s အဖွဲ့မှထွက်သွားသည်။
áá±ááá¯á·áá¾á¯ááᯠáááºááá·áºáá²á·áááº
- ပို့ရန် မအောင်မြင်ပါ၊ လုံခြုံမှုမရှိသော အရန်အတွက် အသာထိပါ။
မလုံခြုံသောဖုန်းစာတိုပို့စနစ်ကိုပြန်သုံးမလား?
မလုံခြုံသော ရုပ်သံပုံပါ စာပို့စနစ်ကို ပြန်သုံးမလား?
သင်ပေးပို့သော သူသည် Signal မသုံးတော့သဖြင့် ဤနည်းလမ်းဖြင့် စာတိုကို ပေးပို့၍မရနိုင်ပါ။ \n\n ရိုးရိုးစာတိုစနစ်ဖြင့်ပေးပို့မလား?
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
index 5fb29b1369..bc82b008f6 100644
--- a/app/src/main/res/values-nb/strings.xml
+++ b/app/src/main/res/values-nb/strings.xml
@@ -307,7 +307,6 @@
Sending feilet
%1$s har forlatt gruppen.
Satt på pause
- Sending mislyktes, trykk for usikret reserveløsning
Vil du bruke ukryptert SMS som reserveløsning?
Vil du bruke ukryptert MMS som reserveløsning?
Denne meldingen blir ikke kryptert, fordi mottakeren ikke lenger er en Signal bruker.\n\nVil du sende den ukryptert?
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
index 1f052c7ccf..d16fb03eb3 100644
--- a/app/src/main/res/values-nl/strings.xml
+++ b/app/src/main/res/values-nl/strings.xml
@@ -307,7 +307,6 @@
Verzenden is mislukt
%1$s heeft de groep verlaten.
Verzenden is gepauzeerd
- Verzenden is mislukt, tik om onbeveiligd te verzenden
Terugvallen naar onversleutelde sms?
Terugvallen naar onversleutelde mms?
Dit bericht zal niet versleuteld worden omdat de ontvanger niet langer Signal gebruikt.\n\nBericht onbeveiligd verzenden?
diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml
index be8a9f54d9..a54600bcc8 100644
--- a/app/src/main/res/values-pa/strings.xml
+++ b/app/src/main/res/values-pa/strings.xml
@@ -307,7 +307,6 @@
ਭੇਜਣ ਵਿੱਚ ਅਸਫ਼ਲ
%1$s ਨੇ ਗਰੁੱਪ ਛੱਡਿਆ।
ਭੇਜਣ ਨੂੰ ਰੋਕਿਆ
- ਭੇਜਣਾ ਅਸਫਲ, ਅਸੁਰੱਖਿਅਤ ਵਾਪਸੀ ਲਈ ਟੈਪ ਕਰੋ
ਇਨਕ੍ਰਿਪਟ ਨਹੀਂ ਕੀਤੇ SMS ਵੱਲ ਵਾਪਸੀ?
ਇਨਕ੍ਰਿਪਟ ਨਹੀਂ ਕੀਤੇ MMS ਵੱਲ ਵਾਪਸੀ?
ਇਹ ਸੁਨੇਹਾ ਇਨਕ੍ਰਿਪਟ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ, ਕਿਉਂਕਿ ਪ੍ਰਾਪਤਕਰਤਾ ਹੁਣ Signal ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਰਿਹਾ।\n\n ਅਸੁਰੱਖਿਅਤ ਸੁਨੇਹਾ ਭੇਜਣਾ ਹੈ?
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
index a98a71daaf..ff20177965 100644
--- a/app/src/main/res/values-pl/strings.xml
+++ b/app/src/main/res/values-pl/strings.xml
@@ -309,7 +309,6 @@
Wysyłanie nie powiodło się
%1$s opuścił(a) grupę.
Wysyłanie wstrzymane
- Wysyłanie nie powiodło się, dotknij w celu użycia niezabezpieczonej alternatywy
Powrócić do nieszyfrowanych wiadomości SMS?
Powrócić do nieszyfrowanych wiadomości MMS?
Ta wiadomość nie będzie zaszyfrowana, ponieważ odbiorca nie jest już użytkownikiem Signal.\n\nWysłać wiadomość nieszyfrowaną?
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
index c947e74f00..9a56df7b0c 100644
--- a/app/src/main/res/values-pt-rBR/strings.xml
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -307,7 +307,6 @@
Falha no envio
%1$s saiu do grupo.
Envio pendente
- Falha no envio, toque para alternativa insegura
Alterar para SMS não criptografado?
Alterar para MMS não criptografado?
Esta mensagem não será criptografada, pois o destinatário não é mais um usuário Signal.\n\nEnviar mensagem não segura?
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
index 6274df41db..8884f945d3 100644
--- a/app/src/main/res/values-pt/strings.xml
+++ b/app/src/main/res/values-pt/strings.xml
@@ -307,7 +307,6 @@
Falha no envio
%1$s abandonou o grupo.
Envio em pausa
- Falha ao enviar, toque para enviar pelo modo inseguro
Recorrer a SMS não encriptado?
Recorrer a MMS não encriptado?
Esta mensagem não será encriptada porque o destinatário já não é um utilizador do Signal.\n\nEnviar mensagem de um modo não seguro?
diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml
index 865fccecb0..0727b6d7ed 100644
--- a/app/src/main/res/values-ro/strings.xml
+++ b/app/src/main/res/values-ro/strings.xml
@@ -308,7 +308,6 @@
Trimitere eșuată
%1$s a părăsit grupul.
Trimiterea a fost întreruptă
- Trimitere eșuată, atinge pentru varianta nesecurizată
Revii la SMS ne-criptat ca soluție de rezervă?
Revii la MMS ne-criptat ca soluție de rezervă?
Acest mesaj nu va fi criptat pentru că destinatarul nu mai este un utilizator Signal.\n\nTrimiți mesaj nesecurizat?
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index a84ae3ca97..c76642c0c9 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -309,7 +309,6 @@
Отправка не удалась
%1$s покинул(-а) группу.
Отправка приостановлена
- Не отправлено. Отправить незащищённым?
Отправить как незашифрованное SMS?
Отправить как незашифрованное MMS?
Данное сообщение не будет зашифровано, поскольку получатель больше не использует Signal.\n\nОтправить незащищённое сообщение?
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
index 71b44feadb..e8d2c6a0c7 100644
--- a/app/src/main/res/values-sk/strings.xml
+++ b/app/src/main/res/values-sk/strings.xml
@@ -309,7 +309,6 @@
Odoslanie zlyhalo
%1$s opustil/a skupinu.
Odoslanie pozastavené
- Odosielanie zlyhalo, ťuknutím pošlete nezabezpečenú správu
Prepnúť na nezabezpečené SMS?
Prepnúť na nezabezpečené MMS?
Táto správa nebude šifrovaná, pretože adresát už nepoužíva Signal.\n\nOdoslať nezabezpečenú SMS správu?
diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml
index b3c5db91d3..6182fd3847 100644
--- a/app/src/main/res/values-sl/strings.xml
+++ b/app/src/main/res/values-sl/strings.xml
@@ -309,7 +309,6 @@
Pošiljanje ni uspelo
%1$s je zapustil_a skupino.
Pošiljanje ustavljeno
- Pošiljanje ni uspelo, tapnite za nezavarovan SMS
Preklopim na nešifriran SMS?
Preklopim na nešifriran MMS?
To sporočilo ne bo šifrirano, ker prejemnik_ca ni več uporabnik_ca aplikacije Signal.\n\nŽelite poslati nešifrirano?
diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml
index d64d92e107..365e05a84d 100644
--- a/app/src/main/res/values-sq/strings.xml
+++ b/app/src/main/res/values-sq/strings.xml
@@ -307,7 +307,6 @@
Dërgimi dështoi
%1$s u largua nga grupi.
Dërgimi në pritje
- Dërgimi dështoi, kliko për rikthim të pasigurt
Dëshironi të riktheheni te mesazhet e pakriptuara?
Dëshironi të riktheheni te MMS-të e pakriptuara?
Kjo mesazh nuk do të kriptohet, sepse marrësi nuk është më përdorues i Signal-it.\n\nTë dërgohet mesazh i pasiguruar?
diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml
index 5dbfc37410..d70b07492c 100644
--- a/app/src/main/res/values-sr/strings.xml
+++ b/app/src/main/res/values-sr/strings.xml
@@ -307,7 +307,6 @@
Слање није успело
%1$s је напустио/ла групу.
Слање је паузирано
- Слање није успело, додирните да се вратите на небезбедно слање
Желите ли да се вратите на нешифровани SMS?
Желите ли да се вратите на нешифровани MMS?
Ова порука неће бити шифрована јер прималац више није пријављен на Signal.\n\nЖелите ли да пошаљете небезбедну поруку?
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
index 43257f21a8..8f86b0feb8 100644
--- a/app/src/main/res/values-sv/strings.xml
+++ b/app/src/main/res/values-sv/strings.xml
@@ -307,7 +307,6 @@
Att skicka meddelandet misslyckades
%1$s har lämnat gruppen.
Sändning pausad
- Sändningen misslyckades, tryck för oskyddad fallback
Använd okrypterat SMS istället?
Använd okrypterat MMS istället?
Detta meddelande kommer inte att krypteras eftersom mottagaren inte längre är en Signal-användare. \n\nSkicka osäkert meddelande?
diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml
index 09a922e9d7..0721189810 100644
--- a/app/src/main/res/values-sw/strings.xml
+++ b/app/src/main/res/values-sw/strings.xml
@@ -307,7 +307,6 @@
Kutuma kumeshindwa
%1$s ameondoka kwenye kundi
Kutuma kumesitishwa
- Imefeli kutuma, gusa kwa isiyo salama ili kurejea nyuma
Rudi nyuma kwa ujumbe usio na msimbo fiche?
Rudi nyuma kwa ujumbe usio na msimbo fiche?
Huu ujumbe hau ta kuwa na msimbo fiche kwa sababu mpokeaji hatumii tena Signal.\n\n Tuma ujumbe usio salama?
diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml
index 02a12d0294..390ce16133 100644
--- a/app/src/main/res/values-ta/strings.xml
+++ b/app/src/main/res/values-ta/strings.xml
@@ -307,7 +307,6 @@
அனுப்புவது தோல்வியுற்றது
%1$s இந்தக் குழுவை விட்டு விலகினார்.
அனுப்பு இடைநிறுத்தப்பட்டது
- அனுப்புதல் தோல்வியுற்றது, பாதுகாப்பற்ற மாற்று செய்ய தட்டவும்
மாற்றாக மறையாக்கப்படாத SMS-ஆக அனுப்பலாமா?
மாற்றாக மறையாக்கப்படாத MMS-ஆக அனுப்பலாமா?
பெறுநர் இனி Signal பயனராக இல்லாததால் இந்த செய்தி மறையாக்கம் செய்யப்படாது. \n\nபாதுகாப்பற்ற செய்தியாக அனுப்பவா?
diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml
index 0115b8def0..276bb03b64 100644
--- a/app/src/main/res/values-te/strings.xml
+++ b/app/src/main/res/values-te/strings.xml
@@ -307,7 +307,6 @@
పంపడం విఫలమైంది
%1$s సమూహం వదిలి వెళ్లారు
పంపండి పాజ్ చేయబడింది
- పంపడం విఫలమైంది, అసురక్షిత తిరిగి పొందడం కోసం నొక్కండి
ఎన్క్రిప్టు కాని ఎస్సెమ్మెస్ తిరిగి అయ్యిందా?
ఎన్క్రిప్టు కాని ఎమ్మెమ్మెస్ తిరిగి అయ్యిందా?
ఈ సందేశం భద్రపరచు విధంగా చేయలేము ఎందుకంటే గ్రహీత ఇకపై Signal వినియోగదారుడు కాదు.\n\nభద్రతలేని సందేశాన్ని పంపవచా?
diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml
index c52d5a04ed..af8b576541 100644
--- a/app/src/main/res/values-th/strings.xml
+++ b/app/src/main/res/values-th/strings.xml
@@ -306,7 +306,6 @@
การส่งล้มเหลว
%1$s ได้ออกจากกลุ่ม
การส่งถูกหยุดชั่วคราว
- การส่งล้มเหลว แตะเพื่อกลับไปใช้วิธีที่ไม่ปลอดภัยแทน
กลับไปใช้ SMS ที่ไม่ได้เข้ารหัสลับหรือไม่?
กลับไปใช้ MMS ที่ไม่ได้เข้ารหัสลับหรือไม่?
ข้อความนี้จะ ไม่ ถูกเข้ารหัสเพราะผู้รับไม่ได้ใช้ Signal แล้ว\n\nต้องการส่งข้อความที่ไม่ปลอดภัยหรือไม่?
diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml
index e9804a5b99..6e62a2b1fd 100644
--- a/app/src/main/res/values-tl/strings.xml
+++ b/app/src/main/res/values-tl/strings.xml
@@ -307,7 +307,6 @@
Failed ang pag-send
Umalis si %1$s sa grupo.
Naka-pause ang pag-send
- Hindi naipadala, pindutin para sa hindi secure na fallback
Fallback sa hindi naka-encrypt na SMS?
Fallback sa hindi naka-encrypt na MMS?
Ang mensaheng ito ay hindi magiging encrypted dahil ang tatanggap ay hindi na gumagamit ng Signal.\n\nMagpadala ng hindi secure na mensahe?
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
index 2bc9c12824..f82441f55b 100644
--- a/app/src/main/res/values-tr/strings.xml
+++ b/app/src/main/res/values-tr/strings.xml
@@ -307,7 +307,6 @@
Gönderme başarısız
%1$s gruptan ayrıldı.
Gönderim duraklatıldı
- Gönderme başarısız oldu, şifresiz göndermek için dokunun
Şifrelenmemiş SMS\'e geri dönülsün mü?
Şifrelenmemiş MMS\'e geri dönülsün mü?
Alıcı artık Signal kullanıcısı olmadığı için bu ileti ŞİFRELENMEYECEKTİR.\n\nŞifresiz olarak gönder?
diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml
index 7e406a487d..fc8e63e105 100644
--- a/app/src/main/res/values-ug/strings.xml
+++ b/app/src/main/res/values-ug/strings.xml
@@ -306,7 +306,6 @@
ئەۋەتەلمىدى
%1$s گۇرۇپپىدىن ئايرىلدى.
يوللاش ۋاقىتلىق توختىتىلدى
- ئەۋەتەلمىدى ، چېكىلسە شىفىرلىماي ئەۋەتىدۇ
شىفىرلانمىغان قىسقا ئۇچۇرغا چېكىنەمسىز؟
شىفىرلانمىغان MMS غا چېكىنەمسىز؟
تاپشۇرۇۋالغۇچى Signal ئىشلەتكۈچىسى ئەمەس بولغاچقا، بۇ ئۇچۇر مەخپىيلەشتۈرۈلمەيدۇ.\n\nقوغدالمىغان ئۇچۇر يوللامسىز؟
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 87d908b946..cecba94a03 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -309,7 +309,6 @@
Не вдалося відправити
%1$s покидає групу.
Відправлення призупинене
- Не відправлено, натисніть для незахищеного відправлення
Скористатися незашифрованим SMS як запасним варіантом?
Скористатися незашифрованим MMS як запасним варіантом?
Це повідомлення не буде зашифровано, оскільки одержувач більше не користується Signal.\n\nНадіслати незахищене повідомлення?
@@ -1162,7 +1161,7 @@
- Із вашим іменем користувача сталася помилка. Ім\'я більше не присвоєно вашому акаунту. Ви можете спробувати встановити це ім\'я повторно або вибрати нове.
+ З вашим іменем користувача сталася помилка. Ім\'я більше не пов\'язане з вашим акаунтом. Ви можете спробувати встановити це ім\'я повторно або створити нове.
Із вашим QR-кодом і посиланням імені користувача сталася помилка. Вони більше не дійсні. Створіть нове посилання, щоби поділитися ним з іншими.
@@ -1829,23 +1828,23 @@
Неправильний PIN-код
Пропустити введення PIN-коду?
Потрібна допомога?
- Ваш PIN-код – це %1$d + цифровий код, який Ви створили та який може бути цифровим або буквено-цифровим. Якщо Ви не пам’ятаєте свій PIN-код, Ви можете створити новий. Ви можете зареєструватись і використовувати свій обліковий запис, але Ви втратите деякі збережені налаштування, як-от інформацію профілю.
- Якщо ви не можете згадати свій PIN-код, ви можете створити новий. Ви зможете зареєструватися та використовувати свій обліковий запис, але втратите деякі збережені настройки, наприклад інформацію вашого профілю.
+ PIN-код – це створений вами пароль, мінімальна довжина якого — %1$d символи. Він може складатися з цифр або з цифр і букв.\n\nЯкщо ви забули свій PIN-код, то можете створити новий. Ви можете зареєструватись і використовувати свій акаунт, але ви втратите частину збережених налаштувань, як-от інформацію профілю.
+ Якщо ви забули свій PIN-код, то можете створити новий. Ви можете зареєструватись і використовувати свій акаунт, але ви втратите частину збережених налаштувань, як-от інформацію профілю.
Створити Новий PIN-код
Звернутися в службу підтримки
Закрити
Пропустити
- - У вас залишилась %1$d спроба. Якщо ви вичерпаєте спроби, ви зможете створити новий PIN-код. Ви зможете зареєструватися та використовувати свій обліковий запис, але втратите деякі збережені настройки, наприклад інформацію вашого профілю.
- - У вас залишилась %1$d спроба. Якщо ви вичерпаєте спроби, ви зможете створити новий PIN-код. Ви зможете зареєструватися та використовувати свій обліковий запис, але втратите деякі збережені настройки, наприклад інформацію вашого профілю.
- - У вас залишилось %1$d спроб. Якщо ви вичерпаєте спроби, ви зможете створити новий PIN-код. Ви зможете зареєструватися та використовувати свій обліковий запис, але втратите деякі збережені настройки, наприклад інформацію вашого профілю.
- - У вас залишилось %1$d спроб. Якщо ви вичерпаєте спроби, ви зможете створити новий PIN-код. Ви зможете зареєструватися та використовувати свій обліковий запис, але втратите деякі збережені настройки, наприклад інформацію вашого профілю.
+ - У вас лишилася %1$d спроба. Якщо ви вичерпаєте спроби, то зможете створити новий PIN-код. Ви зможете зареєструватись і використовувати свій акаунт, але втратите частину збережених налаштувань, як-от інформацію профілю.
+ - У вас лишилося %1$d спроби. Якщо ви вичерпаєте спроби, то зможете створити новий PIN-код. Ви зможете зареєструватись і використовувати свій акаунт, але втратите частину збережених налаштувань, як-от інформацію профілю.
+ - У вас лишилося %1$d спроб. Якщо ви вичерпаєте спроби, то зможете створити новий PIN-код. Ви зможете зареєструватись і використовувати свій акаунт, але втратите частину збережених налаштувань, як-от інформацію профілю.
+ - У вас лишилося %1$d спроби. Якщо ви вичерпаєте спроби, то зможете створити новий PIN-код. Ви зможете зареєструватись і використовувати свій акаунт, але втратите частину збережених налаштувань, як-от інформацію профілю.
Реєстрація в Signal - Потрібна допомога з PIN-кодом для Android
Створити PIN-код
- У вас закінчилися спроби введення PIN-коду, але ви все одно можете отримати доступ до свого облікового запису Signal, створивши новий PIN-код. Для вашої конфіденційності та безпеки ваш обліковий запис буде відновлено без будь-якої збереженої інформації профілю або налаштувань.
+ Ви використали всі спроби введення PIN-коду, але все одно можете отримати доступ до свого акаунту Signal, якщо створите новий PIN-код. З міркувань конфіденційності та безпеки ваш акаунт буде відновлено без збереженої інформації профілю й налаштувань.
Створити новий PIN-код
@@ -1858,7 +1857,7 @@
Якщо ви не пам\'ятаєте свій PIN-код, ви можете створити новий.
- Спроби вгадати PIN-код закінчилися, але ви можете зайти у свій акаунт Signal, створивши новий PIN-код.
+ Ви використали всі спроби введення PIN-коду, але все одно можете отримати доступ до свого акаунту Signal, якщо створите новий PIN-код.
Попередження
@@ -2269,7 +2268,7 @@
Включити блокування реєстрації?
Відключити Блокування Реєстрації?
- Якщо ви забудете свій PIN-код Signal, при повторній реєстрації в Signal, ви втратите доступ до свого облікового запису на 7 днів.
+ Якщо ви забудете свій PIN-код після повторної реєстрації в Signal, то втратите доступ до свого акаунту на 7 днів.
Увімкнути
Відключити
@@ -3922,7 +3921,7 @@
Створити новий PIN-код
Ви можете змінити свій PIN-код, поки цей пристрій зареєстровано.
Створити PIN-код
- PIN-код допоможе відновити акаунт і зберігати вашу інформацію зашифрованою в Signal.
+ PIN-код використовується для відновлення акаунту й забезпечення шифрування інформації в Signal.
Виберіть більш надійний PIN-код
@@ -3957,15 +3956,15 @@
Неправильний PIN-код. Будь ласка спробуйте ще раз.
- Обліковий запис заблоковано
- Ваш акаунт заблоковано для захисту вашої конфіденційності та безпеки. Через %1$d дн. бездіяльності в акаунті ви зможете перереєструвати цей номер телефону без PIN-коду. Весь вміст буде видалено.
+ Акаунт заблоковано
+ Ваш акаунт заблоковано з міркувань конфіденційності та безпеки. Через %1$d днів бездіяльності в акаунті ви зможете заново зареєструвати цей номер телефону без введення PIN-коду. Весь вміст буде видалено.
Далі
Дізнатися більше
Введіть свій PIN-код
- Введіть PIN-код, який ви створили для свого облікового запису. Це не те ж саме. що код перевірки з SMS.
+ Введіть PIN-код, який ви створили для свого акаунту. Це не код перевірки з SMS.
Введіть PIN-код, який ви створили для свого акаунту.
@@ -3978,10 +3977,10 @@
Реєстрація в Signal - Потрібна допомога з PIN-кодом для Android (v2 PIN)
- - Для вашої конфіденційності та безпеки відновлення PIN-коду не передбачається. Якщо ви не зможете згадати свій PIN-код, ви зможете наново зареєструватися через SMS, якщо впродовж %1$d дня не буде активності. При цьому ваш обліковий запис буде видалено, а весь вміст видалено.
- - Для вашої конфіденційності та безпеки відновлення PIN-коду не передбачається. Якщо ви не зможете згадати свій PIN-код, ви зможете наново зареєструватися через SMS, якщо впродовж %1$d днів не буде активності. При цьому ваш обліковий запис буде видалено, а весь вміст видалено.
- - Для вашої конфіденційності та безпеки відновлення PIN-коду не передбачається. Якщо ви не зможете згадати свій PIN-код, ви зможете наново зареєструватися через SMS, якщо впродовж %1$d днів не буде активності. При цьому ваш обліковий запис буде видалено, а весь вміст видалено.
- - Для вашої конфіденційності та безпеки відновлення PIN-коду не передбачається. Якщо ви не зможете згадати свій PIN-код, ви зможете наново зареєструватися через SMS, якщо впродовж %1$d днів не буде активності. При цьому ваш обліковий запис буде видалено, а весь вміст видалено.
+ - З міркувань конфіденційності та безпеки відновлення PIN-коду не передбачено. Якщо ви забули свій PIN-код, то через %1$d день без активності в акаунті зможете зареєструватися заново через SMS. При цьому всю інформацію з вашого акаунту й весь вміст буде видалено.
+ - З міркувань конфіденційності та безпеки відновлення PIN-коду не передбачено. Якщо ви забули свій PIN-код, то через %1$d дні без активності в акаунті зможете зареєструватися заново через SMS. При цьому всю інформацію з вашого акаунту й весь вміст буде видалено.
+ - З міркувань конфіденційності та безпеки відновлення PIN-коду не передбачено. Якщо ви забули свій PIN-код, то через %1$d днів без активності в акаунті зможете зареєструватися заново через SMS. При цьому всю інформацію з вашого акаунту й весь вміст буде видалено.
+ - З міркувань конфіденційності та безпеки відновлення PIN-коду не передбачено. Якщо ви забули свій PIN-код, то через %1$d дня без активності в акаунті зможете зареєструватися заново через SMS. При цьому всю інформацію з вашого акаунту й весь вміст буде видалено.
diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml
index ae6c458bd0..814c451d49 100644
--- a/app/src/main/res/values-ur/strings.xml
+++ b/app/src/main/res/values-ur/strings.xml
@@ -307,7 +307,6 @@
بھیجنے میں ناکام
%1$sنے گروپ چھوڑ دیا ہے
بھیجنا رک گیا ہے
- بھیجنے میں ناکامی، غیر محفوظ متبادل کے لیے کلک کریں
غیر خفیہ کردہ ایس ایم ایس کو متبادل دینا ہے؟
غیر خفیہ کردہ ایم ایم ایس کو متبادل دینا ہے؟
یہ پیغام مرموز نہیںکیونکہ وصول کنندہ Signal کا صارف نہیں رہا۔ n/n/ غیر محفوظ پیغام بھیجنا ہے؟
diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml
index 0156bce019..ad4421c111 100644
--- a/app/src/main/res/values-vi/strings.xml
+++ b/app/src/main/res/values-vi/strings.xml
@@ -306,7 +306,6 @@
Không gửi được
%1$s đã rời nhóm.
Tạm dừng nhắn tin
- Không gửi được, nhấn để thử giao thức không bảo mật
Trở lại SMS không mã hóa?
Trở lại MMS không mã hóa?
Tin nhắn này sẽ không được mã hoá do người nhận không còn sử dụng Signal.\n\nGửi tin nhắn không mã hóa?
diff --git a/app/src/main/res/values-yue/strings.xml b/app/src/main/res/values-yue/strings.xml
index 5b66a37786..21fee8d3c3 100644
--- a/app/src/main/res/values-yue/strings.xml
+++ b/app/src/main/res/values-yue/strings.xml
@@ -306,7 +306,6 @@
傳送失敗
%1$s 已退谷。
傳送已暫停
- 傳送失敗,撳一下轉用唔安全嘅屈就方式
係咪要屈就轉用未經加密嘅短訊?
係咪要屈就轉用未經加密嘅多媒體短訊?
呢個訊息唔會經過加密,因為收件人已經唔係 Signal 使用者喇。\n\n係咪要傳送未經加密嘅訊息?
diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml
index ffb6180590..dd134e885e 100644
--- a/app/src/main/res/values-zh-rCN/strings.xml
+++ b/app/src/main/res/values-zh-rCN/strings.xml
@@ -306,7 +306,6 @@
发送失败
%1$s 已经离开该群组。
发送已暂停
- 发送失败,点击使用不安全的方式发送
使用未加密的短信?
使用未加密的彩信?
由于对方已不再使用 Signal,该消息不是加密的。\n\n是否发送不安全消息?
diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml
index 07518a9f71..c5cd9bcce8 100644
--- a/app/src/main/res/values-zh-rHK/strings.xml
+++ b/app/src/main/res/values-zh-rHK/strings.xml
@@ -306,7 +306,6 @@
傳送失敗
%1$s 已退出群組。
傳送已暫停
- 傳送失敗,輕觸以轉用不安全的次選方法
要退而轉用未經加密的短訊嗎?
要退而轉用未經加密的多媒體短訊嗎?
此訊息將不會被加密,因為收件人已不再是 Signal 使用者。\n\n要傳送不安全的訊息嗎?
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
index 98d71d7ce7..392051a063 100644
--- a/app/src/main/res/values-zh-rTW/strings.xml
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -306,7 +306,6 @@
傳送失敗
%1$s 已經離開群組。
傳送已暫停
- 傳送失敗,輕觸改用不安全的遞補方式
改用未加密的簡訊作為遞補方式?
改用未加密的多媒體訊息作為遞補方式?
由於對方已經不再是 Signal 的使用者,當前訊息不會被加密。\n\n傳送不加密的訊息?
diff --git a/app/static-ips.gradle.kts b/app/static-ips.gradle.kts
index c13e1d2353..13ee39cf26 100644
--- a/app/static-ips.gradle.kts
+++ b/app/static-ips.gradle.kts
@@ -1,6 +1,6 @@
rootProject.extra["service_ips"] = """new String[]{"13.248.212.111","76.223.92.165"}"""
-rootProject.extra["storage_ips"] = """new String[]{"142.250.65.243"}"""
-rootProject.extra["cdn_ips"] = """new String[]{"18.161.21.122","18.161.21.4","18.161.21.66","18.161.21.70"}"""
+rootProject.extra["storage_ips"] = """new String[]{"74.125.129.121"}"""
+rootProject.extra["cdn_ips"] = """new String[]{"18.238.25.116","18.238.25.14","18.238.25.29","18.238.25.79"}"""
rootProject.extra["cdn2_ips"] = """new String[]{"104.18.37.148","172.64.150.108"}"""
rootProject.extra["cdn3_ips"] = """new String[]{"104.18.37.148","172.64.150.108"}"""
rootProject.extra["sfu_ips"] = """new String[]{"34.36.104.134"}"""
From 6f5f299035573b7d612e0e993f2950234fe3ad35 Mon Sep 17 00:00:00 2001
From: Alex Hart
Date: Wed, 10 Apr 2024 16:31:47 -0300
Subject: [PATCH 25/33] Update baseline profile.
---
app/src/main/baseline-prof.txt | 6721 ++++++++++++++++++--------------
1 file changed, 3729 insertions(+), 2992 deletions(-)
diff --git a/app/src/main/baseline-prof.txt b/app/src/main/baseline-prof.txt
index 7accb62c96..cc32ca3d47 100644
--- a/app/src/main/baseline-prof.txt
+++ b/app/src/main/baseline-prof.txt
@@ -1,475 +1,47 @@
-HPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources;
-HPLandroidx/appcompat/view/menu/ActionMenuItemView;->(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;->setTitle(Ljava/lang/CharSequence;)V
-HPLandroidx/appcompat/view/menu/ActionMenuItemView;->shouldAllowTextWithIcon()Z
-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;->showsTextAsAction()Z
-HPLandroidx/appcompat/widget/ActionMenuPresenter;->bindItemView(Landroidx/appcompat/view/menu/MenuItemImpl;Landroidx/appcompat/view/menu/MenuView$ItemView;)V
-HPLandroidx/appcompat/widget/ActionMenuPresenter;->filterLeftoverView(Landroid/view/ViewGroup;I)Z
-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/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(IIII)V
-HPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutVertical(IIII)V
-HPLandroidx/appcompat/widget/LinearLayoutCompat;->measureVertical(II)V
HPLandroidx/appcompat/widget/SearchView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasResolvedTargets(II)Z
-HPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMaxVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V
-HPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMinVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V
-HPLandroidx/constraintlayout/core/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V
-HPLandroidx/constraintlayout/core/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/core/widgets/ConstraintAnchor;
-HPLandroidx/constraintlayout/core/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V
-HPLandroidx/core/view/ViewGroupKt$children$1;->(Landroid/view/ViewGroup;)V
-HPLandroidx/core/view/ViewGroupKt$children$1;->iterator()Ljava/util/Iterator;
+HPLandroidx/constraintlayout/core/ArrayRow;->(Landroidx/constraintlayout/core/Cache;)V
HPLandroidx/core/view/ViewGroupKt$descendants$1;->create(Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Lkotlin/coroutines/Continuation;
HPLandroidx/core/view/ViewGroupKt$descendants$1;->invokeSuspend(Ljava/lang/Object;)Ljava/lang/Object;
-HPLandroidx/core/view/ViewGroupKt$iterator$1;->(Landroid/view/ViewGroup;)V
-HPLandroidx/core/view/ViewGroupKt$iterator$1;->hasNext()Z
-HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Landroid/view/View;
-HPLandroidx/core/view/ViewGroupKt$iterator$1;->next()Ljava/lang/Object;
-HPLandroidx/core/view/ViewGroupKt;->getChildren(Landroid/view/ViewGroup;)Lkotlin/sequences/Sequence;
-HPLandroidx/core/view/ViewGroupKt;->iterator(Landroid/view/ViewGroup;)Ljava/util/Iterator;
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;->onRelease()V
HPLandroidx/fragment/app/FragmentManager;->saveAllStateInternal()Landroid/os/Bundle;
-HPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
+HPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areContentsTheSame(II)Z
HPLandroidx/recyclerview/widget/AsyncListDiffer$1$1;->areItemsTheSame(II)Z
-HPLandroidx/recyclerview/widget/ConcatAdapter;->findRelativeAdapterPositionIn(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I
-HPLandroidx/recyclerview/widget/ConcatAdapter;->getAdapters()Ljava/util/List;
-HPLandroidx/recyclerview/widget/ConcatAdapter;->getItemCount()I
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->countItemsBefore(Landroidx/recyclerview/widget/NestedAdapterWrapper;)I
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->findWrapperAndLocalPosition(I)Landroidx/recyclerview/widget/ConcatAdapterController$WrapperAndLocalPosition;
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->getCopyOfAdapters()Ljava/util/List;
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->getItemViewType(I)I
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->getLocalAdapterPosition(Landroidx/recyclerview/widget/RecyclerView$Adapter;Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)I
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->getTotalCount()I
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->onBindViewHolder(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)V
-HPLandroidx/recyclerview/widget/ConcatAdapterController;->releaseWrapperAndLocalPosition(Landroidx/recyclerview/widget/ConcatAdapterController$WrapperAndLocalPosition;)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/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;
-HPLandroidx/recyclerview/widget/ListAdapter;->getCurrentList()Ljava/util/List;
-HPLandroidx/recyclerview/widget/NestedAdapterWrapper;->getCachedItemCount()I
-HPLandroidx/recyclerview/widget/NestedAdapterWrapper;->getItemViewType(I)I
-HPLandroidx/recyclerview/widget/RecyclerView$ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLandroidx/recyclerview/widget/RecyclerView;->getChildViewHolder(Landroid/view/View;)Landroidx/recyclerview/widget/RecyclerView$ViewHolder;
+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;->isDisappearing(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)Z
HPLandroidx/recyclerview/widget/ViewInfoStore;->popFromLayoutStep(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;I)Landroidx/recyclerview/widget/RecyclerView$ItemAnimator$ItemHolderInfo;
-HPLandroidx/recyclerview/widget/ViewTypeStorage$IsolatedViewTypeStorage$WrapperViewTypeLookup;->localToGlobal(I)I
-HPLandroidx/savedstate/SavedStateRegistry;->performSave(Landroid/os/Bundle;)V
-HPLcom/google/android/material/animation/ArgbEvaluatorCompat;->evaluate(FLjava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
-HPLcom/google/android/material/imageview/ShapeableImageView$OutlineProvider;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V
-HPLcom/google/common/collect/Sets;->intersection(Ljava/util/Set;Ljava/util/Set;)Lcom/google/common/collect/Sets$SetView;
-HPLio/reactivex/rxjava3/core/Maybe;->subscribe(Lio/reactivex/rxjava3/core/MaybeObserver;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$CombinerObserver;->onNext(Ljava/lang/Object;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->drain()V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableCombineLatest$LatestCoordinator;->innerNext(ILjava/lang/Object;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableDoOnEach$DoOnEachObserver;->onNext(Ljava/lang/Object;)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
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->innerSuccess(Lio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver$InnerObserver;Ljava/lang/Object;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableFlatMapSingle$FlatMapSingleObserver;->onNext(Ljava/lang/Object;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableMap$MapObserver;->onNext(Ljava/lang/Object;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableObserveOn$ObserveOnObserver;->drainFused()V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableRefCount;->subscribeActual(Lio/reactivex/rxjava3/core/Observer;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$BoundedReplayBuffer;->replay(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;->isDisposed()Z
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplayObserver;->add(Lio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$InnerDisposable;)Z
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableReplay$ReplaySource;->subscribe(Lio/reactivex/rxjava3/core/Observer;)V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->drain()V
-HPLio/reactivex/rxjava3/internal/operators/observable/ObservableSwitchMap$SwitchMapObserver;->onNext(Ljava/lang/Object;)V
-HPLio/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;
-HPLj$/time/Instant;->atZone(Lj$/time/ZoneId;)Lj$/time/ZonedDateTime;
-HPLj$/time/LocalDate;->toEpochDay()J
-HPLj$/time/LocalDate;->w()Z
-HPLj$/time/LocalDateTime;->v()Lj$/time/LocalDate;
-HPLj$/time/ZonedDateTime;->(Lj$/time/LocalDateTime;Lj$/time/ZoneId;Lj$/time/ZoneOffset;)V
-HPLj$/time/ZonedDateTime;->m(JILj$/time/ZoneId;)Lj$/time/ZonedDateTime;
-HPLj$/time/ZonedDateTime;->n(Lj$/time/Instant;Lj$/time/ZoneId;)Lj$/time/ZonedDateTime;
-HPLj$/time/ZonedDateTime;->toLocalDate()Lj$/time/LocalDate;
-HPLkotlin/sequences/SequenceBuilderIterator;->yieldAll(Ljava/util/Iterator;Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
-HPLkotlin/sequences/SequencesKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence;
-HPLkotlin/sequences/SequencesKt___SequencesJvmKt$filterIsInstance$1;->(Ljava/lang/Class;)V
-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;
-HPLkotlin/sequences/SequencesKt___SequencesJvmKt;->filterIsInstance(Lkotlin/sequences/Sequence;Ljava/lang/Class;)Lkotlin/sequences/Sequence;
-HPLorg/signal/core/util/OptionalExtensionsKt;->orNull(Lj$/util/Optional;)Ljava/lang/Object;
-HPLorg/signal/core/util/OptionalExtensionsKt;->toOptional(Ljava/lang/Object;)Lj$/util/Optional;
-HPLorg/signal/core/util/concurrent/SettableFuture;->(Ljava/lang/Object;)V
-HPLorg/signal/core/util/concurrent/SignalExecutors;->lambda$newCachedBoundedExecutor$1(Ljava/lang/Runnable;Ljava/util/concurrent/ThreadPoolExecutor;)V
+HPLkotlin/collections/CollectionsKt__MutableCollectionsKt;->addAll(Ljava/util/Collection;Ljava/lang/Iterable;)Z
+HPLkotlin/reflect/jvm/internal/impl/protobuf/SmallSortedMap;->(I)V
+HPLorg/signal/core/util/tracing/TracePacket$Builder;->()V
+HPLorg/signal/core/util/tracing/TrackEvent$Builder;->track_uuid(Ljava/lang/Long;)Lorg/signal/core/util/tracing/TrackEvent$Builder;
+HPLorg/signal/core/util/tracing/TrackEvent$Builder;->type(Lorg/signal/core/util/tracing/TrackEvent$Type;)Lorg/signal/core/util/tracing/TrackEvent$Builder;
HPLorg/signal/libsignal/protocol/ecc/ECPublicKey;->equals(Ljava/lang/Object;)Z
HPLorg/signal/paging/FixedSizePagingController;->lambda$onDataItemChanged$2(Ljava/lang/Object;)V
-HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration$onDrawOver$2;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V
-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;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V
-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;->(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)V
-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/badges/gifts/OpenableGiftItemDecoration;->access$getAnimationState$p(Lorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;)Ljava/util/Map;
-HPLorg/thoughtcrime/securesms/badges/gifts/OpenableGiftItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCorners()V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->applyCornersForSizeClass2()V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->getCells()[Lorg/thoughtcrime/securesms/components/ThumbnailView;
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setCellBackgroundColor(I)V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRadii(IIII)V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setRelativeRadii(Lorg/thoughtcrime/securesms/components/ThumbnailView;IIII)V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlide(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;IZ)V
-HPLorg/thoughtcrime/securesms/components/AlbumThumbnailView;->setSlides(Lcom/bumptech/glide/RequestManager;Ljava/util/List;Z)V
-HPLorg/thoughtcrime/securesms/components/AvatarImageView;->disableQuickContact()V
-HPLorg/thoughtcrime/securesms/components/ComposeText;->onDraw(Landroid/graphics/Canvas;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDate(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/util/Locale;Lorg/thoughtcrime/securesms/conversation/ConversationItemDisplayMode;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemFooter;->presentDeliveryStatus(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->dispatchDraw(Landroid/graphics/Canvas;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setClickable(Z)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setConversationColor(I)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setCorners(IIII)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setFocusable(Z)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setImageResource(Lcom/bumptech/glide/RequestManager;Ljava/util/List;ZZ)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMaximumThumbnailHeight(I)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setMinimumThumbnailWidth(I)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setOnLongClickListener(Landroid/view/View$OnLongClickListener;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailBounds([I)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnail;->showThumbnailView()V
-HPLorg/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
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->copy$default(Lorg/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;IIIIIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;->copy(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)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIII)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIIIILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;->copy(FZZLorg/thoughtcrime/securesms/mms/SlideClickListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;Lorg/thoughtcrime/securesms/mms/SlideClickListener;Landroid/view/View$OnLongClickListener;IIIIIIIII)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->applyState(Lorg/thoughtcrime/securesms/util/views/Stub;Lorg/thoughtcrime/securesms/util/views/Stub;)V
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy$default(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;ILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->copy(Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;)Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getAlbumViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$AlbumViewState;
-HPLorg/thoughtcrime/securesms/components/ConversationItemThumbnailState;->getThumbnailViewState()Lorg/thoughtcrime/securesms/components/ConversationItemThumbnailState$ThumbnailViewState;
-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/QuoteView;->applyColorTheme()V
-HPLorg/thoughtcrime/securesms/components/QuoteView;->dismiss()V
HPLorg/thoughtcrime/securesms/components/ScrollToPositionDelegate;->isListCommitted()Z
-HPLorg/thoughtcrime/securesms/components/ThumbnailView$$ExternalSyntheticBackport2;->m([Ljava/lang/Object;)Ljava/util/List;
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->onMeasure(II)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setBounds(IIII)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setCancelTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setClickable(Z)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setFocusable(Z)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setImageResource(Lcom/bumptech/glide/RequestManager;Lorg/thoughtcrime/securesms/mms/Slide;ZZII)Lorg/signal/core/util/concurrent/ListenableFuture;
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setPlayVideoClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setRadii(IIII)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setStartTransferClickListener(Lorg/thoughtcrime/securesms/mms/SlidesClickedListener;)V
-HPLorg/thoughtcrime/securesms/components/ThumbnailView;->setThumbnailClickListener(Lorg/thoughtcrime/securesms/mms/SlideClickListener;)V
-HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->getLongestLineWidth(Ljava/lang/CharSequence;)F
-HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setOverflowText(Ljava/lang/CharSequence;)V
-HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextColor(I)V
-HPLorg/thoughtcrime/securesms/components/emoji/EmojiTextView;->setTextSize(IF)V
-HPLorg/thoughtcrime/securesms/components/spoiler/SpoilerRendererDelegate;->updateFromTextColor()V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Companion;->getTransferState(Ljava/util/List;)I
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Progress;->toString()Ljava/lang/String;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1;->(Z)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setClickable$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1;->(Z)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setFocusable$1;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$setSlides$2;->invoke(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->deriveMode(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView$Mode;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->isUpdateToExistingSet(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;Ljava/util/List;)Z
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setCancelClickListener(Landroid/view/View$OnClickListener;)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setClickable(Z)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setFocusable(Z)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setShowSecondaryText(Z)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setSlides(Ljava/util/List;)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setTransferClickListener(Landroid/view/View$OnClickListener;)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->setVisible(Z)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlView;->updateState(Lkotlin/jvm/functions/Function1;)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->(ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZ)V
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->copy$default(Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZILjava/lang/Object;)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->copy(ZZZLjava/util/List;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;Landroid/view/View$OnClickListener;ZLjava/util/Map;Ljava/util/Map;ZZ)Lorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferControlViewState;->toString()Ljava/lang/String;
-HPLorg/thoughtcrime/securesms/components/transfercontrols/TransferProgressView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->setTitle(Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Runnable;)Ljava/lang/String;
-HPLorg/thoughtcrime/securesms/conversation/ConversationHeaderView;->updateOutlineVisibility()V
-HPLorg/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
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getActiveFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Lorg/thoughtcrime/securesms/components/ConversationItemFooter;
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList;
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->getGiftId()J
-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;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->hasNoBubble(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isEndOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isFooterVisible(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isGiftMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isStartOfMessageCluster(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Z)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->isWithinClusteringTime(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->onMeasure(II)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->readDimen(I)I
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setAuthor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;ZZ)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setBodyText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Ljava/lang/String;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setBubbleState(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lorg/thoughtcrime/securesms/recipients/Recipient;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setContactPhoto(Lorg/thoughtcrime/securesms/recipients/Recipient;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setFooter(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Ljava/util/Locale;ZZ)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGroupAuthorColor(Lorg/thoughtcrime/securesms/database/model/MessageRecord;ZLorg/thoughtcrime/securesms/conversation/colors/Colorizer;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setGutterSizes(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setHasBeenQuoted(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setInteractionState(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMediaAttributes(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;ZZZZ)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMessageShape(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setMessageSpacing(Landroid/content/Context;Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setReactions(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setStatusIcons(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->setThumbnailCorners(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Lj$/util/Optional;Lj$/util/Optional;Z)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->shouldInterceptClicks(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->showProjectionArea()V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItem;->unbind()V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->onDrawForeground(Landroid/graphics/Canvas;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setQuoteViewProjection(Lorg/thoughtcrime/securesms/util/Projection;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationItemBodyBubble;->setVideoPlayerProjection(Lorg/thoughtcrime/securesms/util/Projection;)V
-HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getConversationTimestamp()J
-HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->getMessageRecord()Lorg/thoughtcrime/securesms/database/model/MessageRecord;
-HPLorg/thoughtcrime/securesms/conversation/ConversationMessage;->hashCode()I
-HPLorg/thoughtcrime/securesms/conversation/ConversationOptionsMenu$Provider;->onCreateMenu(Landroid/view/Menu;Landroid/view/MenuInflater;)V
-HPLorg/thoughtcrime/securesms/conversation/MarkReadHelper;->getLatestTimestamp(Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;Landroidx/recyclerview/widget/LinearLayoutManager;)Lj$/util/Optional;
-HPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->asSingleColor()I
-HPLorg/thoughtcrime/securesms/conversation/colors/ChatColors;->isGradient()Z
-HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingBodyTextColor(Landroid/content/Context;Z)I
-HPLorg/thoughtcrime/securesms/conversation/colors/Colorizer;->getIncomingGroupSenderColor(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;)I
-HPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->drawShaderMask(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/conversation/colors/ChatColors;)V
-HPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/colors/RecyclerViewColorizer$itemDecoration$1;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
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;->isRunning()Z
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/ConversationItemAnimator;->onAnimationFinished(Landroidx/recyclerview/widget/RecyclerView$ViewHolder;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectCollection$Single;->toSet()Ljava/util/Set;
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->cleanPulseAnimators()V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->findAdapterBridge(Landroidx/recyclerview/widget/RecyclerView;)Lorg/thoughtcrime/securesms/conversation/ConversationAdapterBridge;
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getDifferenceForPart(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration$Difference;
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->hasRunningPulseRequestAnimators()Z
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->invalidateIfEnterExitAnimatorsAreRunning(Landroidx/recyclerview/widget/RecyclerView;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->resolveMultiselectable(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)Lorg/thoughtcrime/securesms/conversation/mutiselect/Multiselectable;
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateChildOffsets(Landroidx/recyclerview/widget/RecyclerView;Landroid/view/View;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration;->updateMultiselectPartAnimator(Ljava/util/Set;Lorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart;)V
-HPLorg/thoughtcrime/securesms/conversation/mutiselect/MultiselectPart$Attachments;->hashCode()I
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->bindPayloadsIfAvailable()Z
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getBindable()Lorg/thoughtcrime/securesms/BindableConversationItem;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getColorizerProjections(Landroid/view/ViewGroup;)Lorg/thoughtcrime/securesms/util/ProjectionList;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getNextMessage()Lj$/util/Optional;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$ConversationViewHolder;->getPreviousMessage()Lj$/util/Optional;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2$IncomingMediaViewHolder;->bind(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)V
-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/ConversationAdapterV2;->getConversationMessage(I)Lorg/thoughtcrime/securesms/conversation/ConversationMessage;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2;->getSelectedItems()Ljava/util/Set;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ScrollListener;->onScrolled(Landroidx/recyclerview/widget/RecyclerView;II)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$ThreadHeaderMarginDecoration;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment$initializeConversationThreadUi$2;->get()Ljava/lang/Object;
-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()Ljava/lang/Boolean;
HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->doAfterFirstRender()V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getBinding()Lorg/thoughtcrime/securesms/databinding/V2ConversationFragmentBinding;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->getViewModel()Lorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->initializeConversationThreadUi()V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationFragment;->onViewCreated(Landroid/view/View;Landroid/os/Bundle;)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/ConversationItemDecorations;->getItemOffsets(Landroid/graphics/Rect;Landroid/view/View;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->hasHeader(I)Z
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->isFirstUnread(I)Z
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->onDrawOver(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->timestamp(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationItemDecorations;->toEpochDay(Lorg/thoughtcrime/securesms/conversation/v2/data/ConversationMessageElement;)J
-HPLorg/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;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;->getIdentityRecords(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;)Lio/reactivex/rxjava3/core/Single;
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$10;->accept(Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$14;->apply(Lkotlin/Unit;Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lkotlin/Pair;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$15;->apply(Lkotlin/Pair;)Lio/reactivex/rxjava3/core/SingleSource;
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$16;->invoke(Lorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel$9;->apply(Lorg/thoughtcrime/securesms/recipients/Recipient;Lj$/util/Optional;)Lorg/thoughtcrime/securesms/conversation/v2/InputReadyState;
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;->(JILorg/thoughtcrime/securesms/conversation/colors/ChatColors;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRepository;Lorg/thoughtcrime/securesms/conversation/v2/ConversationRecipientRepository;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;Lorg/thoughtcrime/securesms/conversation/ScheduledMessagesRepository;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/ConversationViewModel;->getChatColorsSnapshot()Lorg/thoughtcrime/securesms/conversation/v2/items/ChatColorsDrawable$ChatColorsData;
-HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;Z)V
HPLorg/thoughtcrime/securesms/conversation/v2/IdentityRecordsState;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->(Lorg/thoughtcrime/securesms/recipients/Recipient;Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;Lorg/thoughtcrime/securesms/database/model/GroupRecord;ZZZ)V
HPLorg/thoughtcrime/securesms/conversation/v2/InputReadyState;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/conversation/v2/data/ConversationDataSource;->load(IIILorg/signal/paging/PagedDataSource$CancellationSignal;)Ljava/util/List;
-HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->getConversationMessage()Lorg/thoughtcrime/securesms/conversation/ConversationMessage;
-HPLorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher;->fetch(Ljava/util/List;)Lorg/thoughtcrime/securesms/conversation/v2/data/MessageDataFetcher$ExtraMessageData;
-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;->(Landroidx/recyclerview/widget/RecyclerView;)V
-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$ChatColorsItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-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/ChatColorsDrawable;->setCorners([F)V
-HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemLayout;->onMeasure(II)V
-HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape;->setMessageShape(Lorg/thoughtcrime/securesms/database/model/MessageRecord;ZI)Lorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShape$MessageShape;
-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;->bind(Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;)V
-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;->linkifyMessageBody(Landroid/text/Spannable;)V
-HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentBody()V
-HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTextOnlyViewHolder;->presentSender()V
-HPLorg/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemTheme;->getBodyTextColor(Lorg/thoughtcrime/securesms/conversation/ConversationMessage;)I
-HPLorg/thoughtcrime/securesms/conversation/v2/items/V2FooterPositionDelegate;->onPostMeasure()Z
-HPLorg/thoughtcrime/securesms/conversationlist/model/Conversation;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/crypto/storage/SignalBaseIdentityKeyStore;->getIdentityRecords(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/identity/IdentityRecordList;
-HPLorg/thoughtcrime/securesms/database/DatabaseObserver;->lambda$unregisterObserver$17(Lorg/thoughtcrime/securesms/database/DatabaseObserver$Observer;)V
-HPLorg/thoughtcrime/securesms/database/GroupTable;->getGroupsContainingMember(Lorg/thoughtcrime/securesms/recipients/RecipientId;ZZ)Ljava/util/List;
-HPLorg/thoughtcrime/securesms/database/identity/IdentityRecordList;->(Ljava/util/Collection;)V
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isBoostRequest()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isChangeNumber()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isEndSession()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isExpirationTimerUpdate()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isFailed()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isGroupCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingAudioCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isIncomingVideoCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isJoined()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMessageRequestAccepted()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedAudioCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isMissedVideoCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoing()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoingAudioCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isOutgoingVideoCall()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isPendingInsecureSmsFallback()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isProfileChange()Z
-HPLorg/thoughtcrime/securesms/database/model/DisplayRecord;->isReportedSpam()Z
+HPLorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;->areItemsTheSame(Lorg/thoughtcrime/securesms/conversation/v2/data/IncomingMedia;)Z
+HPLorg/thoughtcrime/securesms/database/SQLiteDatabase;->setTransactionSuccessful()V
HPLorg/thoughtcrime/securesms/database/model/IdentityRecord;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/database/model/IdentityStoreRecord;->toIdentityRecord(Lorg/thoughtcrime/securesms/recipients/RecipientId;)Lorg/thoughtcrime/securesms/database/model/IdentityRecord;
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription;
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isBadDecryptType()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isChatSessionRefresh()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isDisplayBodyEmpty(Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isGroupV1MigrationEvent()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityDefault()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityUpdate()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isIdentityVerified()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isRateLimited()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSecure()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSessionSwitchoverEventType()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isSmsExportType()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isThreadMergeEventType()Z
-HPLorg/thoughtcrime/securesms/database/model/MessageRecord;->isUpdate()Z
-HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getLinkPreviews()Ljava/util/List;
-HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getQuote()Lorg/thoughtcrime/securesms/database/model/Quote;
-HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->getUpdateDisplayBody(Landroid/content/Context;Lj$/util/function/Consumer;)Lorg/thoughtcrime/securesms/database/model/UpdateDescription;
-HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->isMediaPending()Z
-HPLorg/thoughtcrime/securesms/database/model/MmsMessageRecord;->withAttachments(Ljava/util/List;)Lorg/thoughtcrime/securesms/database/model/MmsMessageRecord;
-HPLorg/thoughtcrime/securesms/database/model/ThreadRecord;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/fonts/SignalSymbols;->getSpannedString(Landroid/content/Context;Lorg/thoughtcrime/securesms/fonts/SignalSymbols$Weight;Lorg/thoughtcrime/securesms/fonts/SignalSymbols$Glyph;)Ljava/lang/CharSequence;
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration$onDraw$1;->(Landroidx/recyclerview/widget/RecyclerView;)V
-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/GiphyMp4ItemDecoration;->onDraw(Landroid/graphics/Canvas;Landroidx/recyclerview/widget/RecyclerView;Landroidx/recyclerview/widget/RecyclerView$State;)V
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ItemDecoration;->setParentRecyclerTranslationY(Landroidx/recyclerview/widget/RecyclerView;)V
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController$RangeComparator;->compare(Ljava/lang/Integer;Ljava/lang/Integer;)I
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->getPlaybackSet(Ljava/util/Set;II)Ljava/util/Set;
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4PlaybackController;->performPlaybackUpdate(Landroidx/recyclerview/widget/RecyclerView;)V
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;->injectVideoViews(Landroid/content/Context;Landroidx/lifecycle/Lifecycle;Landroid/view/ViewGroup;I)Ljava/util/List;
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->getCurrentHolder(I)Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder;
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->stopAndReleaseAssignedVideos(Ljava/util/Set;)V
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->update(Landroidx/recyclerview/widget/RecyclerView;Ljava/util/List;Ljava/util/Set;)V
-HPLorg/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionRecycler;->updateVideoDisplayPositionAndSize(Landroidx/recyclerview/widget/RecyclerView;Lorg/thoughtcrime/securesms/giph/mp4/GiphyMp4Playable;)V
-HPLorg/thoughtcrime/securesms/keyvalue/SettingsValues;->getMessageNotificationsPrivacy()Lorg/thoughtcrime/securesms/preferences/widgets/NotificationPrivacyPreference;
-HPLorg/thoughtcrime/securesms/keyvalue/WallpaperValues;->hasWallpaperSet()Z
-HPLorg/thoughtcrime/securesms/logging/PersistentLogger$LogRequest;->getThreadString()Ljava/lang/String;
-HPLorg/thoughtcrime/securesms/messagerequests/MessageRequestRepository;->getMessageRequestState(Lorg/thoughtcrime/securesms/recipients/Recipient;J)Lorg/thoughtcrime/securesms/messagerequests/MessageRequestState;
-HPLorg/thoughtcrime/securesms/mms/ImageSlide;->isBorderless()Z
HPLorg/thoughtcrime/securesms/mms/Slide;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/mms/Slide;->getTransferState()I
-HPLorg/thoughtcrime/securesms/mms/Slide;->hashCode()I
-HPLorg/thoughtcrime/securesms/mms/Slide;->isInProgress()Z
-HPLorg/thoughtcrime/securesms/mms/Slide;->isPendingDownload()Z
-HPLorg/thoughtcrime/securesms/mms/SlideDeck;->getTextSlide()Lorg/thoughtcrime/securesms/mms/TextSlide;
-HPLorg/thoughtcrime/securesms/mms/SlideDeck;->getThumbnailSlides()Ljava/util/List;
HPLorg/thoughtcrime/securesms/profiles/ProfileName;->equals(Ljava/lang/Object;)Z
-HPLorg/thoughtcrime/securesms/reactions/ReactionsConversationView;->clear()V
-HPLorg/thoughtcrime/securesms/recipients/Recipient$combinedAboutAndEmoji$2;->invoke()Ljava/lang/String;
-HPLorg/thoughtcrime/securesms/recipients/Recipient;->getHasWallpaper()Z
HPLorg/thoughtcrime/securesms/recipients/Recipient;->hasSameContent(Lorg/thoughtcrime/securesms/recipients/Recipient;)Z
-HPLorg/thoughtcrime/securesms/recipients/Recipient;->isPushV1Group()Z
-HPLorg/thoughtcrime/securesms/recipients/Recipient;->isPushV2Group()Z
-HPLorg/thoughtcrime/securesms/recipients/RecipientUtil;->isMessageRequestAccepted(Landroid/content/Context;J)Z
HPLorg/thoughtcrime/securesms/util/BubbleUtil;->canBubble(Landroid/content/Context;Lorg/thoughtcrime/securesms/recipients/Recipient;Ljava/lang/Long;)Z
-HPLorg/thoughtcrime/securesms/util/DateUtils;->getDatelessRelativeTimeSpanFormattedDate(Landroid/content/Context;Ljava/util/Locale;J)Lorg/thoughtcrime/securesms/conversation/v2/computed/FormattedDate;
-HPLorg/thoughtcrime/securesms/util/DateUtils;->getSameDayDateFormat()Ljava/text/SimpleDateFormat;
-HPLorg/thoughtcrime/securesms/util/DateUtils;->isSameDay(JJ)Z
-HPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate$default(JLj$/time/ZoneId;ILjava/lang/Object;)Lj$/time/LocalDate;
-HPLorg/thoughtcrime/securesms/util/JavaTimeExtensionsKt;->toLocalDate(JLj$/time/ZoneId;)Lj$/time/LocalDate;
-HPLorg/thoughtcrime/securesms/util/Material3OnScrollHelper;->updateActiveState$lambda$7$lambda$6(Lorg/thoughtcrime/securesms/util/Material3OnScrollHelper;IIIILandroid/animation/ValueAnimator;)V
-HPLorg/thoughtcrime/securesms/util/MediaUtil;->isLongTextType(Ljava/lang/String;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasAudio(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasDocument(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasExtraText(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasLinkPreview(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasNoBubble(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasOnlyThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasQuote(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasSharedContact(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->hasThumbnail(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isBorderless(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isCaptionlessMms(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isEditMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isTextOnly(Lorg/thoughtcrime/securesms/database/model/MessageRecord;Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/util/MessageRecordUtil;->isViewOnceMessage(Lorg/thoughtcrime/securesms/database/model/MessageRecord;)Z
-HPLorg/thoughtcrime/securesms/util/Projection$Corners;->(FFFF)V
-HPLorg/thoughtcrime/securesms/util/Projection$Corners;->toRadii()[F
-HPLorg/thoughtcrime/securesms/util/ProjectionList;->close()V
-HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->drawAsTopItemDecoration(Landroid/view/View;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;I)V
-HPLorg/thoughtcrime/securesms/util/ViewExtensionsKt;->layoutIn(Landroid/view/View;Landroid/view/View;)V
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/content/Context;)Z
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->isLtr(Landroid/view/View;)Z
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->isRtl(Landroid/view/View;)Z
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingEnd(Landroid/view/View;I)V
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->setPaddingStart(Landroid/view/View;I)V
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->setTopMargin(Landroid/view/View;IZ)V
-HPLorg/thoughtcrime/securesms/util/ViewUtil;->updateLayoutParams(Landroid/view/View;II)V
-HPLorg/thoughtcrime/securesms/util/adapter/mapping/MappingViewHolder;->setPayload(Ljava/util/List;)V
-HPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItem(I)Lorg/thoughtcrime/securesms/util/adapter/mapping/MappingModel;
-HPLorg/thoughtcrime/securesms/util/adapter/mapping/PagingMappingAdapter;->getItemViewType(I)I
-HPLorg/thoughtcrime/securesms/util/views/NullableStub;->get()Ljava/lang/Object;
-HPLorg/thoughtcrime/securesms/util/views/NullableStub;->require()Ljava/lang/Object;
-HPLrxdogtag2/RxDogTag;->lambda$installWithBuilder$3(Lrxdogtag2/RxDogTag$Configuration;Lio/reactivex/rxjava3/core/Maybe;Lio/reactivex/rxjava3/core/MaybeObserver;)Lio/reactivex/rxjava3/core/MaybeObserver;
+HPLorg/whispersystems/signalservice/api/push/ServiceId$Companion;->parseOrNull(Ljava/lang/String;Z)Lorg/whispersystems/signalservice/api/push/ServiceId;
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
@@ -662,6 +234,7 @@ HSPLandroidx/appcompat/app/AppCompatActivity;->attachBaseContext(Landroid/conten
HSPLandroidx/appcompat/app/AppCompatActivity;->findViewById(I)Landroid/view/View;
HSPLandroidx/appcompat/app/AppCompatActivity;->getDelegate()Landroidx/appcompat/app/AppCompatDelegate;
HSPLandroidx/appcompat/app/AppCompatActivity;->getMenuInflater()Landroid/view/MenuInflater;
+HSPLandroidx/appcompat/app/AppCompatActivity;->getResources()Landroid/content/res/Resources;
HSPLandroidx/appcompat/app/AppCompatActivity;->initDelegate()V
HSPLandroidx/appcompat/app/AppCompatActivity;->initViewTreeOwners()V
HSPLandroidx/appcompat/app/AppCompatActivity;->invalidateOptionsMenu()V
@@ -693,6 +266,7 @@ HSPLandroidx/appcompat/app/AppCompatDelegate;->setDefaultNightMode(I)V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl$2;->run()V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V
+HSPLandroidx/appcompat/app/AppCompatDelegateImpl$3;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;
HSPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->(Landroidx/appcompat/app/AppCompatDelegateImpl;)V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->onAttachedFromWindow()V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl$5;->onDetachedFromWindow()V
@@ -757,6 +331,7 @@ HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTheme(I)V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->setTitle(Ljava/lang/CharSequence;)V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->throwFeatureRequestIfSubDecorInstalled()V
HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateAppConfiguration(ILandroidx/core/os/LocaleListCompat;Z)Z
+HSPLandroidx/appcompat/app/AppCompatDelegateImpl;->updateStatusGuard(Landroidx/core/view/WindowInsetsCompat;Landroid/graphics/Rect;)I
HSPLandroidx/appcompat/app/AppCompatViewInflater;->()V
HSPLandroidx/appcompat/app/AppCompatViewInflater;->()V
HSPLandroidx/appcompat/app/AppCompatViewInflater;->backportAccessibilityAttributes(Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V
@@ -824,7 +399,24 @@ 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/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
@@ -838,14 +430,20 @@ 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
@@ -853,11 +451,22 @@ 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
@@ -868,18 +477,25 @@ 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
@@ -889,11 +505,14 @@ 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;
@@ -908,11 +527,14 @@ 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
HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->setSupportBackgroundTintList(Landroid/content/res/ColorStateList;)V
HSPLandroidx/appcompat/widget/AppCompatBackgroundHelper;->shouldApplyFrameworkTintUsingColorFilter()Z
HSPLandroidx/appcompat/widget/AppCompatButton;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
+HSPLandroidx/appcompat/widget/AppCompatButton;->drawableStateChanged()V
HSPLandroidx/appcompat/widget/AppCompatButton;->getEmojiTextViewHelper()Landroidx/appcompat/widget/AppCompatEmojiTextHelper;
HSPLandroidx/appcompat/widget/AppCompatButton;->onTextChanged(Ljava/lang/CharSequence;III)V
HSPLandroidx/appcompat/widget/AppCompatButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
@@ -949,6 +571,7 @@ 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
@@ -957,14 +580,19 @@ 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
+HSPLandroidx/appcompat/widget/AppCompatImageButton;->hasOverlappingRendering()Z
HSPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
+HSPLandroidx/appcompat/widget/AppCompatImageButton;->setBackgroundResource(I)V
HSPLandroidx/appcompat/widget/AppCompatImageButton;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatImageButton;->setImageResource(I)V
HSPLandroidx/appcompat/widget/AppCompatImageHelper;->(Landroid/widget/ImageView;)V
@@ -982,6 +610,19 @@ HSPLandroidx/appcompat/widget/AppCompatImageView;->hasOverlappingRendering()Z
HSPLandroidx/appcompat/widget/AppCompatImageView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatImageView;->setImageResource(I)V
+HSPLandroidx/appcompat/widget/AppCompatProgressBarHelper;->()V
+HSPLandroidx/appcompat/widget/AppCompatProgressBarHelper;->(Landroid/widget/ProgressBar;)V
+HSPLandroidx/appcompat/widget/AppCompatProgressBarHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
+HSPLandroidx/appcompat/widget/AppCompatSeekBar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/appcompat/widget/AppCompatSeekBar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
+HSPLandroidx/appcompat/widget/AppCompatSeekBar;->drawableStateChanged()V
+HSPLandroidx/appcompat/widget/AppCompatSeekBar;->jumpDrawablesToCurrentState()V
+HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->(Landroid/widget/SeekBar;)V
+HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->applyTickMarkTint()V
+HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->drawableStateChanged()V
+HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->jumpDrawablesToCurrentState()V
+HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->loadFromAttributes(Landroid/util/AttributeSet;I)V
+HSPLandroidx/appcompat/widget/AppCompatSeekBarHelper;->setTickMark(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatTextClassifierHelper$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/Context;Ljava/lang/Class;)Ljava/lang/Object;
HSPLandroidx/appcompat/widget/AppCompatTextClassifierHelper;->(Landroid/widget/TextView;)V
HSPLandroidx/appcompat/widget/AppCompatTextHelper$1;->(Landroidx/appcompat/widget/AppCompatTextHelper;IILjava/lang/ref/WeakReference;)V
@@ -993,7 +634,9 @@ HSPLandroidx/appcompat/widget/AppCompatTextHelper;->applyCompoundDrawablesTints(
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
HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
@@ -1005,10 +648,12 @@ HSPLandroidx/appcompat/widget/AppCompatTextView;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->onMeasure(II)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->onTextChanged(Ljava/lang/CharSequence;III)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V
+HSPLandroidx/appcompat/widget/AppCompatTextView;->setBackgroundResource(I)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawables(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelative(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(IIII)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesRelativeWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
+HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(IIII)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setCompoundDrawablesWithIntrinsicBounds(Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setEmojiCompatEnabled(Z)V
HSPLandroidx/appcompat/widget/AppCompatTextView;->setFilters([Landroid/text/InputFilter;)V
@@ -1033,10 +678,15 @@ HSPLandroidx/appcompat/widget/ContentFrameLayout;->onDetachedFromWindow()V
HSPLandroidx/appcompat/widget/ContentFrameLayout;->onMeasure(II)V
HSPLandroidx/appcompat/widget/ContentFrameLayout;->setAttachListener(Landroidx/appcompat/widget/ContentFrameLayout$OnAttachListener;)V
HSPLandroidx/appcompat/widget/ContentFrameLayout;->setDecorPadding(IIII)V
+HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline0;->m(Landroid/graphics/Insets;)I
+HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline1;->m(Landroid/graphics/Insets;)I
+HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline2;->m(Landroid/graphics/Insets;)I
+HSPLandroidx/appcompat/widget/DrawableUtils$$ExternalSyntheticApiModelOutline3;->m(Landroid/graphics/Insets;)I
HSPLandroidx/appcompat/widget/DrawableUtils;->()V
HSPLandroidx/appcompat/widget/DrawableUtils;->canSafelyMutateDrawable(Landroid/graphics/drawable/Drawable;)Z
HSPLandroidx/appcompat/widget/DrawableUtils;->fixDrawable(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/appcompat/widget/FitWindowsFrameLayout;->fitSystemWindows(Landroid/graphics/Rect;)Z
HSPLandroidx/appcompat/widget/ForwardingListener;->(Landroid/view/View;)V
HSPLandroidx/appcompat/widget/ForwardingListener;->onViewAttachedToWindow(Landroid/view/View;)V
HSPLandroidx/appcompat/widget/LinearLayoutCompat$LayoutParams;->(II)V
@@ -1047,6 +697,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
@@ -1054,8 +705,10 @@ HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildAt(I)Landroid/
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->getVirtualChildCount()I
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->hasDividerBeforeChildAt(I)Z
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutHorizontal(IIII)V
+HSPLandroidx/appcompat/widget/LinearLayoutCompat;->layoutVertical(IIII)V
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureChildBeforeLayout(Landroid/view/View;IIIII)V
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureHorizontal(II)V
+HSPLandroidx/appcompat/widget/LinearLayoutCompat;->measureVertical(II)V
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onDraw(Landroid/graphics/Canvas;)V
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onInitializeAccessibilityNodeInfo(Landroid/view/accessibility/AccessibilityNodeInfo;)V
HSPLandroidx/appcompat/widget/LinearLayoutCompat;->onLayout(ZIIII)V
@@ -1122,6 +775,7 @@ HSPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/c
HSPLandroidx/appcompat/widget/TintTypedArray;->obtainStyledAttributes(Landroid/content/Context;Landroid/util/AttributeSet;[III)Landroidx/appcompat/widget/TintTypedArray;
HSPLandroidx/appcompat/widget/TintTypedArray;->recycle()V
HSPLandroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda0;->(Landroidx/appcompat/widget/Toolbar;)V
+HSPLandroidx/appcompat/widget/Toolbar$$ExternalSyntheticLambda0;->run()V
HSPLandroidx/appcompat/widget/Toolbar$1;->(Landroidx/appcompat/widget/Toolbar;)V
HSPLandroidx/appcompat/widget/Toolbar$2;->(Landroidx/appcompat/widget/Toolbar;)V
HSPLandroidx/appcompat/widget/Toolbar$3;->(Landroidx/appcompat/widget/Toolbar;)V
@@ -1134,6 +788,7 @@ HSPLandroidx/appcompat/widget/Toolbar$LayoutParams;->(Landroid/content/Con
HSPLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLandroidx/appcompat/widget/Toolbar;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
HSPLandroidx/appcompat/widget/Toolbar;->addCustomViewsWithGravity(Ljava/util/List;I)V
+HSPLandroidx/appcompat/widget/Toolbar;->addMenuProvider(Landroidx/core/view/MenuProvider;)V
HSPLandroidx/appcompat/widget/Toolbar;->addSystemView(Landroid/view/View;Z)V
HSPLandroidx/appcompat/widget/Toolbar;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z
HSPLandroidx/appcompat/widget/Toolbar;->ensureContentInsets()V
@@ -1152,8 +807,10 @@ HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetEnd()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetLeft()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetRight()I
HSPLandroidx/appcompat/widget/Toolbar;->getCurrentContentInsetStart()I
+HSPLandroidx/appcompat/widget/Toolbar;->getCurrentMenuItems()Ljava/util/ArrayList;
HSPLandroidx/appcompat/widget/Toolbar;->getHorizontalMargins(Landroid/view/View;)I
HSPLandroidx/appcompat/widget/Toolbar;->getMenu()Landroid/view/Menu;
+HSPLandroidx/appcompat/widget/Toolbar;->getMenuInflater()Landroid/view/MenuInflater;
HSPLandroidx/appcompat/widget/Toolbar;->getNavigationContentDescription()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/Toolbar;->getNavigationIcon()Landroid/graphics/drawable/Drawable;
HSPLandroidx/appcompat/widget/Toolbar;->getOverflowIcon()Landroid/graphics/drawable/Drawable;
@@ -1161,21 +818,29 @@ HSPLandroidx/appcompat/widget/Toolbar;->getSubtitle()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/Toolbar;->getTitle()Ljava/lang/CharSequence;
HSPLandroidx/appcompat/widget/Toolbar;->getVerticalMargins(Landroid/view/View;)I
HSPLandroidx/appcompat/widget/Toolbar;->getViewListMeasuredWidth(Ljava/util/List;[I)I
+HSPLandroidx/appcompat/widget/Toolbar;->invalidateMenu()V
HSPLandroidx/appcompat/widget/Toolbar;->isChildOrHidden(Landroid/view/View;)Z
HSPLandroidx/appcompat/widget/Toolbar;->layoutChildLeft(Landroid/view/View;I[II)I
HSPLandroidx/appcompat/widget/Toolbar;->layoutChildRight(Landroid/view/View;I[II)I
HSPLandroidx/appcompat/widget/Toolbar;->measureChildCollapseMargins(Landroid/view/View;IIII[I)I
HSPLandroidx/appcompat/widget/Toolbar;->measureChildConstrained(Landroid/view/View;IIIII)V
HSPLandroidx/appcompat/widget/Toolbar;->onAttachedToWindow()V
+HSPLandroidx/appcompat/widget/Toolbar;->onCreateMenu()V
HSPLandroidx/appcompat/widget/Toolbar;->onLayout(ZIIII)V
HSPLandroidx/appcompat/widget/Toolbar;->onMeasure(II)V
HSPLandroidx/appcompat/widget/Toolbar;->onRtlPropertiesChanged(I)V
HSPLandroidx/appcompat/widget/Toolbar;->setBackInvokedCallbackEnabled(Z)V
HSPLandroidx/appcompat/widget/Toolbar;->setMenuCallbacks(Landroidx/appcompat/view/menu/MenuPresenter$Callback;Landroidx/appcompat/view/menu/MenuBuilder$Callback;)V
+HSPLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(I)V
+HSPLandroidx/appcompat/widget/Toolbar;->setNavigationContentDescription(Ljava/lang/CharSequence;)V
+HSPLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(I)V
+HSPLandroidx/appcompat/widget/Toolbar;->setNavigationIcon(Landroid/graphics/drawable/Drawable;)V
HSPLandroidx/appcompat/widget/Toolbar;->setNavigationOnClickListener(Landroid/view/View$OnClickListener;)V
HSPLandroidx/appcompat/widget/Toolbar;->setOnMenuItemClickListener(Landroidx/appcompat/widget/Toolbar$OnMenuItemClickListener;)V
HSPLandroidx/appcompat/widget/Toolbar;->setPopupTheme(I)V
HSPLandroidx/appcompat/widget/Toolbar;->setTitle(Ljava/lang/CharSequence;)V
+HSPLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(I)V
+HSPLandroidx/appcompat/widget/Toolbar;->setTitleTextColor(Landroid/content/res/ColorStateList;)V
HSPLandroidx/appcompat/widget/Toolbar;->shouldCollapse()Z
HSPLandroidx/appcompat/widget/Toolbar;->shouldLayout(Landroid/view/View;)Z
HSPLandroidx/appcompat/widget/Toolbar;->updateBackInvokedCallbackState()V
@@ -1416,6 +1081,7 @@ HSPLandroidx/compose/ui/autofill/AndroidAutofill$$ExternalSyntheticApiModelOutli
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline0;->m()Landroid/graphics/Bitmap$Config;
HSPLandroidx/compose/ui/graphics/AndroidImageBitmap_androidKt$$ExternalSyntheticApiModelOutline1;->m()Landroid/graphics/Bitmap$Config;
HSPLandroidx/compose/ui/platform/AndroidComposeView$$ExternalSyntheticApiModelOutline0;->m(Landroid/content/res/Configuration;)I
+HSPLandroidx/compose/ui/platform/coreshims/SoftwareKeyboardControllerCompat$Impl30$$ExternalSyntheticApiModelOutline1;->m()I
HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline0;->m()Landroid/os/LocaleList;
HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline1;->m(Landroid/os/LocaleList;)I
HSPLandroidx/compose/ui/text/intl/AndroidLocaleDelegateAPI24$$ExternalSyntheticApiModelOutline2;->m(Landroid/os/LocaleList;I)Ljava/util/Locale;
@@ -1424,7 +1090,6 @@ HSPLandroidx/compose/ui/text/platform/extensions/LocaleListHelperMethods$$Extern
HSPLandroidx/concurrent/futures/AbstractResolvableFuture$SafeAtomicHelper$$ExternalSyntheticBackportWithForwarding0;->m(Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->()V
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->(Landroidx/constraintlayout/core/ArrayRow;Landroidx/constraintlayout/core/Cache;)V
-HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->add(Landroidx/constraintlayout/core/SolverVariable;FZ)V
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->clear()V
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->contains(Landroidx/constraintlayout/core/SolverVariable;)Z
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->divideByAmount(F)V
@@ -1433,13 +1098,13 @@ HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getCurrentSize()I
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getVariable(I)Landroidx/constraintlayout/core/SolverVariable;
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->getVariableValue(I)F
HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->invert()V
-HSPLandroidx/constraintlayout/core/ArrayRow;->(Landroidx/constraintlayout/core/Cache;)V
+HSPLandroidx/constraintlayout/core/ArrayLinkedVariables;->use(Landroidx/constraintlayout/core/ArrayRow;Z)F
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;
HSPLandroidx/constraintlayout/core/ArrayRow;->chooseSubject(Landroidx/constraintlayout/core/LinearSystem;)Z
-HSPLandroidx/constraintlayout/core/ArrayRow;->chooseSubjectInVariables(Landroidx/constraintlayout/core/LinearSystem;)Landroidx/constraintlayout/core/SolverVariable;
HSPLandroidx/constraintlayout/core/ArrayRow;->createRowCentering(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IFLandroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow;
HSPLandroidx/constraintlayout/core/ArrayRow;->createRowEqualMatchDimensions(FFFLandroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;)Landroidx/constraintlayout/core/ArrayRow;
+HSPLandroidx/constraintlayout/core/ArrayRow;->createRowEquals(Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow;
HSPLandroidx/constraintlayout/core/ArrayRow;->createRowEquals(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow;
HSPLandroidx/constraintlayout/core/ArrayRow;->createRowGreaterThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow;
HSPLandroidx/constraintlayout/core/ArrayRow;->createRowLowerThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;I)Landroidx/constraintlayout/core/ArrayRow;
@@ -1449,20 +1114,19 @@ 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/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;->addConstraint(Landroidx/constraintlayout/core/ArrayRow;)V
HSPLandroidx/constraintlayout/core/LinearSystem;->addEquality(Landroidx/constraintlayout/core/SolverVariable;I)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
+HSPLandroidx/constraintlayout/core/LinearSystem;->addLowerBarrier(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;IZ)V
HSPLandroidx/constraintlayout/core/LinearSystem;->addLowerThan(Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;II)V
-HSPLandroidx/constraintlayout/core/LinearSystem;->addRow(Landroidx/constraintlayout/core/ArrayRow;)V
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;
@@ -1475,6 +1139,7 @@ HSPLandroidx/constraintlayout/core/LinearSystem;->getObjectVariableValue(Ljava/l
HSPLandroidx/constraintlayout/core/LinearSystem;->increaseTableSize()V
HSPLandroidx/constraintlayout/core/LinearSystem;->minimize()V
HSPLandroidx/constraintlayout/core/LinearSystem;->minimizeGoal(Landroidx/constraintlayout/core/LinearSystem$Row;)V
+HSPLandroidx/constraintlayout/core/LinearSystem;->optimize(Landroidx/constraintlayout/core/LinearSystem$Row;Z)I
HSPLandroidx/constraintlayout/core/LinearSystem;->releaseRows()V
HSPLandroidx/constraintlayout/core/LinearSystem;->reset()V
HSPLandroidx/constraintlayout/core/Pools$SimplePool;->(I)V
@@ -1506,6 +1171,7 @@ HSPLandroidx/constraintlayout/core/SolverVariable;->removeFromRow(Landroidx/cons
HSPLandroidx/constraintlayout/core/SolverVariable;->reset()V
HSPLandroidx/constraintlayout/core/SolverVariable;->setFinalValue(Landroidx/constraintlayout/core/LinearSystem;F)V
HSPLandroidx/constraintlayout/core/SolverVariable;->setType(Landroidx/constraintlayout/core/SolverVariable$Type;Ljava/lang/String;)V
+HSPLandroidx/constraintlayout/core/SolverVariable;->updateReferencesWithNewDefinition(Landroidx/constraintlayout/core/LinearSystem;Landroidx/constraintlayout/core/ArrayRow;)V
HSPLandroidx/constraintlayout/core/state/WidgetFrame;->()V
HSPLandroidx/constraintlayout/core/state/WidgetFrame;->(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V
HSPLandroidx/constraintlayout/core/widgets/Barrier;->()V
@@ -1520,6 +1186,7 @@ HSPLandroidx/constraintlayout/core/widgets/ChainHead;->(Landroidx/constrai
HSPLandroidx/constraintlayout/core/widgets/ChainHead;->define()V
HSPLandroidx/constraintlayout/core/widgets/ChainHead;->defineChainProperties()V
HSPLandroidx/constraintlayout/core/widgets/ChainHead;->isMatchConstraintEqualityCandidate(Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)Z
+HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$1;->()V
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;->()V
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;->(Ljava/lang/String;I)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;->values()[Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;
@@ -1528,8 +1195,10 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->connect(Landroidx/
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getDependents()Ljava/util/HashSet;
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getFinalValue()I
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getMargin()I
+HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getOpposite()Landroidx/constraintlayout/core/widgets/ConstraintAnchor;
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getSolverVariable()Landroidx/constraintlayout/core/SolverVariable;
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->getTarget()Landroidx/constraintlayout/core/widgets/ConstraintAnchor;
+HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasCenteredDependents()Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasDependents()Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->hasFinalValue()Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintAnchor;->isConnected()Z
@@ -1545,6 +1214,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->()V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->()V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->addAnchors()V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->addFirst()Z
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->addToSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->applyConstraints(Landroidx/constraintlayout/core/LinearSystem;ZZZZLandroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/SolverVariable;Landroidx/constraintlayout/core/widgets/ConstraintWidget$DimensionBehaviour;ZLandroidx/constraintlayout/core/widgets/ConstraintAnchor;Landroidx/constraintlayout/core/widgets/ConstraintAnchor;IIIIFZZZZZIIIIFZ)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->createObjectVariables(Landroidx/constraintlayout/core/LinearSystem;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getAnchor(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/core/widgets/ConstraintAnchor;
@@ -1564,6 +1234,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getMinWidth()I
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getParent()Landroidx/constraintlayout/core/widgets/ConstraintWidget;
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalBiasPercent()F
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalDimensionBehaviour()Landroidx/constraintlayout/core/widgets/ConstraintWidget$DimensionBehaviour;
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVerticalMargin()I
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getVisibility()I
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getWidth()I
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->getX()I
@@ -1572,6 +1243,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasBaseline()Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasDanglingDimension(I)Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasDependencies()Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasDimensionOverride()Z
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->hasResolvedTargets(II)Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->immediateConnect(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;Landroidx/constraintlayout/core/widgets/ConstraintWidget;Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;II)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->isChainHead(I)Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->isHorizontalSolvingPassDone()Z
@@ -1593,6 +1265,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setBaselineDistanc
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setCompanionWidget(Ljava/lang/Object;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setDimensionRatio(Ljava/lang/String;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalHorizontal(II)V
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalLeft(I)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalTop(I)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFinalVertical(II)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setFrame(IIII)V
@@ -1614,6 +1287,7 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setMinWidth(I)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setParent(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalBiasPercent(F)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalChainStyle(I)V
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalDimension(II)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalDimensionBehaviour(Landroidx/constraintlayout/core/widgets/ConstraintWidget$DimensionBehaviour;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalMatchStyle(IIIF)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidget;->setVerticalWeight(F)V
@@ -1628,6 +1302,8 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->()V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addChain(Landroidx/constraintlayout/core/widgets/ConstraintWidget;I)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addChildrenToSolver(Landroidx/constraintlayout/core/LinearSystem;)Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalChain(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMaxVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V
+HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addHorizontalWrapMinVariable(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addMaxWrap(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;Landroidx/constraintlayout/core/SolverVariable;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addMinWrap(Landroidx/constraintlayout/core/widgets/ConstraintAnchor;Landroidx/constraintlayout/core/SolverVariable;)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->addVerticalChain(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V
@@ -1651,8 +1327,19 @@ HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->setPass(I
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->setRtl(Z)V
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->updateChildrenFromSolver(Landroidx/constraintlayout/core/LinearSystem;[Z)Z
HSPLandroidx/constraintlayout/core/widgets/ConstraintWidgetContainer;->updateHierarchy()V
+HSPLandroidx/constraintlayout/core/widgets/Guideline$1;->()V
HSPLandroidx/constraintlayout/core/widgets/Guideline;->()V
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->addToSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->getAnchor(Landroidx/constraintlayout/core/widgets/ConstraintAnchor$Type;)Landroidx/constraintlayout/core/widgets/ConstraintAnchor;
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->getOrientation()I
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->getRelativeBegin()I
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->getRelativeEnd()I
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->isResolvedVertically()Z
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->setFinalValue(I)V
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->setGuideBegin(I)V
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->setGuideEnd(I)V
HSPLandroidx/constraintlayout/core/widgets/Guideline;->setOrientation(I)V
+HSPLandroidx/constraintlayout/core/widgets/Guideline;->updateFromSolver(Landroidx/constraintlayout/core/LinearSystem;Z)V
HSPLandroidx/constraintlayout/core/widgets/HelperWidget;->()V
HSPLandroidx/constraintlayout/core/widgets/HelperWidget;->add(Landroidx/constraintlayout/core/widgets/ConstraintWidget;)V
HSPLandroidx/constraintlayout/core/widgets/HelperWidget;->removeAllIds()V
@@ -1679,12 +1366,15 @@ HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->invalidate
HSPLandroidx/constraintlayout/core/widgets/analyzer/DependencyGraph;->invalidateMeasures()V
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
@@ -1759,6 +1449,8 @@ HSPLandroidx/constraintlayout/widget/ConstraintSet;->applyToInternal(Landroidx/c
HSPLandroidx/constraintlayout/widget/ConstraintSet;->clone(Landroid/content/Context;I)V
HSPLandroidx/constraintlayout/widget/ConstraintSet;->clone(Landroidx/constraintlayout/widget/ConstraintLayout;)V
HSPLandroidx/constraintlayout/widget/Guideline;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/constraintlayout/widget/Guideline;->setGuidelineBegin(I)V
+HSPLandroidx/constraintlayout/widget/Guideline;->setGuidelineEnd(I)V
HSPLandroidx/constraintlayout/widget/R$styleable;->()V
HSPLandroidx/coordinatorlayout/R$styleable;->()V
HSPLandroidx/coordinatorlayout/widget/CoordinatorLayout$Behavior;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
@@ -1858,7 +1550,9 @@ 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;
@@ -1878,7 +1572,6 @@ HSPLandroidx/core/app/NotificationManagerCompat;->(Landroid/content/Contex
HSPLandroidx/core/app/NotificationManagerCompat;->cancel(I)V
HSPLandroidx/core/app/NotificationManagerCompat;->cancel(Ljava/lang/String;I)V
HSPLandroidx/core/app/NotificationManagerCompat;->from(Landroid/content/Context;)Landroidx/core/app/NotificationManagerCompat;
-HSPLandroidx/core/content/ContentValuesKt;->contentValuesOf([Lkotlin/Pair;)Landroid/content/ContentValues;
HSPLandroidx/core/content/ContextCompat$Api21Impl;->getDrawable(Landroid/content/Context;I)Landroid/graphics/drawable/Drawable;
HSPLandroidx/core/content/ContextCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/content/Context;I)I
HSPLandroidx/core/content/ContextCompat$Api23Impl;->getColor(Landroid/content/Context;I)I
@@ -1942,6 +1635,10 @@ HSPLandroidx/core/graphics/ColorUtils;->compositeAlpha(II)I
HSPLandroidx/core/graphics/ColorUtils;->compositeColors(II)I
HSPLandroidx/core/graphics/ColorUtils;->compositeComponent(IIIII)I
HSPLandroidx/core/graphics/ColorUtils;->setAlphaComponent(II)I
+HSPLandroidx/core/graphics/Insets;->()V
+HSPLandroidx/core/graphics/Insets;->(IIII)V
+HSPLandroidx/core/graphics/Insets;->of(IIII)Landroidx/core/graphics/Insets;
+HSPLandroidx/core/graphics/Insets;->toCompatInsets(Landroid/graphics/Insets;)Landroidx/core/graphics/Insets;
HSPLandroidx/core/graphics/TypefaceCompat;->()V
HSPLandroidx/core/graphics/TypefaceCompat;->create(Landroid/content/Context;Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
HSPLandroidx/core/graphics/TypefaceCompatApi29Impl;->()V
@@ -1996,6 +1693,10 @@ HSPLandroidx/core/os/TraceCompat;->endSection()V
HSPLandroidx/core/os/UserManagerCompat$Api24Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/os/UserManager;)Z
HSPLandroidx/core/os/UserManagerCompat$Api24Impl;->isUserUnlocked(Landroid/content/Context;)Z
HSPLandroidx/core/os/UserManagerCompat;->isUserUnlocked(Landroid/content/Context;)Z
+HSPLandroidx/core/text/util/LinkifyCompat$$ExternalSyntheticLambda0;->()V
+HSPLandroidx/core/text/util/LinkifyCompat;->()V
+HSPLandroidx/core/text/util/LinkifyCompat;->addLinks(Landroid/text/Spannable;I)Z
+HSPLandroidx/core/text/util/LinkifyCompat;->shouldAddLinksFallbackToFramework()Z
HSPLandroidx/core/util/ObjectsCompat$Api19Impl;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
HSPLandroidx/core/util/ObjectsCompat$Api19Impl;->hash([Ljava/lang/Object;)I
HSPLandroidx/core/util/ObjectsCompat;->equals(Ljava/lang/Object;Ljava/lang/Object;)Z
@@ -2055,6 +1756,7 @@ 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
@@ -2109,12 +1811,17 @@ HSPLandroidx/core/view/ViewCompat$Api19Impl;->getAccessibilityLiveRegion(Landroi
HSPLandroidx/core/view/ViewCompat$Api19Impl;->isAttachedToWindow(Landroid/view/View;)Z
HSPLandroidx/core/view/ViewCompat$Api19Impl;->isLaidOut(Landroid/view/View;)Z
HSPLandroidx/core/view/ViewCompat$Api19Impl;->notifySubtreeAccessibilityStateChanged(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;I)V
+HSPLandroidx/core/view/ViewCompat$Api20Impl;->dispatchApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
+HSPLandroidx/core/view/ViewCompat$Api20Impl;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
HSPLandroidx/core/view/ViewCompat$Api20Impl;->requestApplyInsets(Landroid/view/View;)V
HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V
+HSPLandroidx/core/view/ViewCompat$Api21Impl$1;->onApplyWindowInsets(Landroid/view/View;Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
HSPLandroidx/core/view/ViewCompat$Api21Impl;->getElevation(Landroid/view/View;)F
HSPLandroidx/core/view/ViewCompat$Api21Impl;->getZ(Landroid/view/View;)F
HSPLandroidx/core/view/ViewCompat$Api21Impl;->setBackgroundTintList(Landroid/view/View;Landroid/content/res/ColorStateList;)V
HSPLandroidx/core/view/ViewCompat$Api21Impl;->setOnApplyWindowInsetsListener(Landroid/view/View;Landroidx/core/view/OnApplyWindowInsetsListener;)V
+HSPLandroidx/core/view/ViewCompat$Api23Impl$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/View;)Landroid/view/WindowInsets;
+HSPLandroidx/core/view/ViewCompat$Api23Impl;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat;
HSPLandroidx/core/view/ViewCompat$Api26Impl$$ExternalSyntheticApiModelOutline0;->m(Landroid/view/View;)I
HSPLandroidx/core/view/ViewCompat$Api26Impl;->getImportantForAutofill(Landroid/view/View;)I
HSPLandroidx/core/view/ViewCompat$Api26Impl;->setImportantForAutofill(Landroid/view/View;I)V
@@ -2134,6 +1841,7 @@ HSPLandroidx/core/view/ViewCompat$Api30Impl;->getStateDescription(Landroid/view/
HSPLandroidx/core/view/ViewCompat;->()V
HSPLandroidx/core/view/ViewCompat;->accessibilityHeadingProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty;
HSPLandroidx/core/view/ViewCompat;->addAccessibilityAction(Landroid/view/View;Landroidx/core/view/accessibility/AccessibilityNodeInfoCompat$AccessibilityActionCompat;)V
+HSPLandroidx/core/view/ViewCompat;->dispatchApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;
HSPLandroidx/core/view/ViewCompat;->ensureAccessibilityDelegateCompat(Landroid/view/View;)V
HSPLandroidx/core/view/ViewCompat;->getAccessibilityDelegate(Landroid/view/View;)Landroidx/core/view/AccessibilityDelegateCompat;
HSPLandroidx/core/view/ViewCompat;->getAccessibilityDelegateInternal(Landroid/view/View;)Landroid/view/View$AccessibilityDelegate;
@@ -2150,6 +1858,7 @@ HSPLandroidx/core/view/ViewCompat;->getMinimumHeight(Landroid/view/View;)I
HSPLandroidx/core/view/ViewCompat;->getMinimumWidth(Landroid/view/View;)I
HSPLandroidx/core/view/ViewCompat;->getPaddingEnd(Landroid/view/View;)I
HSPLandroidx/core/view/ViewCompat;->getPaddingStart(Landroid/view/View;)I
+HSPLandroidx/core/view/ViewCompat;->getRootWindowInsets(Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat;
HSPLandroidx/core/view/ViewCompat;->getStateDescription(Landroid/view/View;)Ljava/lang/CharSequence;
HSPLandroidx/core/view/ViewCompat;->getZ(Landroid/view/View;)F
HSPLandroidx/core/view/ViewCompat;->hasAccessibilityDelegate(Landroid/view/View;)Z
@@ -2161,6 +1870,7 @@ HSPLandroidx/core/view/ViewCompat;->isScreenReaderFocusable(Landroid/view/View;)
HSPLandroidx/core/view/ViewCompat;->notifyViewAccessibilityStateChangedIfNeeded(Landroid/view/View;I)V
HSPLandroidx/core/view/ViewCompat;->offsetLeftAndRight(Landroid/view/View;I)V
HSPLandroidx/core/view/ViewCompat;->offsetTopAndBottom(Landroid/view/View;I)V
+HSPLandroidx/core/view/ViewCompat;->onApplyWindowInsets(Landroid/view/View;Landroidx/core/view/WindowInsetsCompat;)Landroidx/core/view/WindowInsetsCompat;
HSPLandroidx/core/view/ViewCompat;->paneTitleProperty()Landroidx/core/view/ViewCompat$AccessibilityViewProperty;
HSPLandroidx/core/view/ViewCompat;->postInvalidateOnAnimation(Landroid/view/View;)V
HSPLandroidx/core/view/ViewCompat;->postOnAnimation(Landroid/view/View;Ljava/lang/Runnable;)V
@@ -2191,9 +1901,18 @@ 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
HSPLandroidx/core/view/ViewKt$doOnPreDraw$1;->run()V
HSPLandroidx/core/view/ViewKt;->doOnPreDraw(Landroid/view/View;Lkotlin/jvm/functions/Function1;)Landroidx/core/view/OneShotPreDrawListener;
+HSPLandroidx/core/view/ViewKt;->isVisible(Landroid/view/View;)Z
HSPLandroidx/core/view/ViewParentCompat;->onNestedScrollAccepted(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;II)V
HSPLandroidx/core/view/ViewParentCompat;->onStartNestedScroll(Landroid/view/ViewParent;Landroid/view/View;Landroid/view/View;II)Z
HSPLandroidx/core/view/ViewParentCompat;->onStopNestedScroll(Landroid/view/ViewParent;Landroid/view/View;I)V
@@ -2203,9 +1922,61 @@ HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$$ExternalSyntheticApiM
HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30$ProxyCallback;->(Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V
HSPLandroidx/core/view/WindowInsetsAnimationCompat$Impl30;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V
HSPLandroidx/core/view/WindowInsetsAnimationCompat;->setCallback(Landroid/view/View;Landroidx/core/view/WindowInsetsAnimationCompat$Callback;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Builder;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$Builder;->build()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline5;->m(Landroid/view/WindowInsets$Builder;)Landroid/view/WindowInsets;
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline6;->m()Landroid/view/WindowInsets$Builder;
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29$$ExternalSyntheticApiModelOutline8;->m()V
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl29;->build()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl30;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->(Landroidx/core/view/WindowInsetsCompat;)V
+HSPLandroidx/core/view/WindowInsetsCompat$BuilderImpl;->applyInsetTypes()V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->getSystemWindowInsets()Landroidx/core/graphics/Insets;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl20;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl21;->isConsumed()Z
+HSPLandroidx/core/view/WindowInsetsCompat$Impl28$$ExternalSyntheticApiModelOutline1;->m(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl28;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl29;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline1;->m()Landroid/view/WindowInsets;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl30$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/WindowInsets;I)Landroid/graphics/Insets;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->(Landroidx/core/view/WindowInsetsCompat;Landroid/view/WindowInsets;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->copyRootViewBounds(Landroid/view/View;)V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl30;->getInsets(I)Landroidx/core/graphics/Insets;
+HSPLandroidx/core/view/WindowInsetsCompat$Impl;->()V
+HSPLandroidx/core/view/WindowInsetsCompat$Impl;->(Landroidx/core/view/WindowInsetsCompat;)V
HSPLandroidx/core/view/WindowInsetsCompat$Type;->displayCutout()I
HSPLandroidx/core/view/WindowInsetsCompat$Type;->ime()I
HSPLandroidx/core/view/WindowInsetsCompat$Type;->systemBars()I
+HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline0;->m()I
+HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline1;->m()I
+HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline2;->m()I
+HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30$$ExternalSyntheticApiModelOutline6;->m()I
+HSPLandroidx/core/view/WindowInsetsCompat$TypeImpl30;->toPlatformType(I)I
+HSPLandroidx/core/view/WindowInsetsCompat;->()V
+HSPLandroidx/core/view/WindowInsetsCompat;->(Landroid/view/WindowInsets;)V
+HSPLandroidx/core/view/WindowInsetsCompat;->(Landroidx/core/view/WindowInsetsCompat;)V
+HSPLandroidx/core/view/WindowInsetsCompat;->consumeDisplayCutout()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat;->consumeStableInsets()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat;->consumeSystemWindowInsets()Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat;->copyRootViewBounds(Landroid/view/View;)V
+HSPLandroidx/core/view/WindowInsetsCompat;->getInsets(I)Landroidx/core/graphics/Insets;
+HSPLandroidx/core/view/WindowInsetsCompat;->getSystemWindowInsetTop()I
+HSPLandroidx/core/view/WindowInsetsCompat;->isConsumed()Z
+HSPLandroidx/core/view/WindowInsetsCompat;->setOverriddenInsets([Landroidx/core/graphics/Insets;)V
+HSPLandroidx/core/view/WindowInsetsCompat;->setRootWindowInsets(Landroidx/core/view/WindowInsetsCompat;)V
+HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsets()Landroid/view/WindowInsets;
+HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;)Landroidx/core/view/WindowInsetsCompat;
+HSPLandroidx/core/view/WindowInsetsCompat;->toWindowInsetsCompat(Landroid/view/WindowInsets;Landroid/view/View;)Landroidx/core/view/WindowInsetsCompat;
HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline11;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V
HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline3;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Z)V
HSPLandroidx/core/view/accessibility/AccessibilityNodeInfoCompat$$ExternalSyntheticApiModelOutline6;->m(Landroid/view/accessibility/AccessibilityNodeInfo;Ljava/lang/CharSequence;)V
@@ -2252,6 +2023,11 @@ 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
@@ -2313,6 +2089,7 @@ 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
@@ -2340,21 +2117,29 @@ HSPLandroidx/emoji2/text/SpannableBuilder;->create(Ljava/lang/Class;Ljava/lang/C
HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanFlags(Ljava/lang/Object;)I
HSPLandroidx/emoji2/text/SpannableBuilder;->getSpanStart(Ljava/lang/Object;)I
HSPLandroidx/emoji2/text/SpannableBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;
+HSPLandroidx/emoji2/text/SpannableBuilder;->getWatcherFor(Ljava/lang/Object;)Landroidx/emoji2/text/SpannableBuilder$WatcherWrapper;
HSPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Class;)Z
HSPLandroidx/emoji2/text/SpannableBuilder;->isWatcher(Ljava/lang/Object;)Z
+HSPLandroidx/emoji2/text/SpannableBuilder;->nextSpanTransition(IILjava/lang/Class;)I
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
@@ -2491,6 +2276,7 @@ HSPLandroidx/fragment/app/Fragment;->prepareCallInternal(Landroidx/activity/resu
HSPLandroidx/fragment/app/Fragment;->registerForActivityResult(Landroidx/activity/result/contract/ActivityResultContract;Landroidx/activity/result/ActivityResultCallback;)Landroidx/activity/result/ActivityResultLauncher;
HSPLandroidx/fragment/app/Fragment;->registerOnPreAttachListener(Landroidx/fragment/app/Fragment$OnPreAttachedListener;)V
HSPLandroidx/fragment/app/Fragment;->requireActivity()Landroidx/fragment/app/FragmentActivity;
+HSPLandroidx/fragment/app/Fragment;->requireArguments()Landroid/os/Bundle;
HSPLandroidx/fragment/app/Fragment;->requireContext()Landroid/content/Context;
HSPLandroidx/fragment/app/Fragment;->requireView()Landroid/view/View;
HSPLandroidx/fragment/app/Fragment;->restoreChildFragmentState()V
@@ -2552,13 +2338,16 @@ 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
HSPLandroidx/fragment/app/FragmentContainerView;->(Landroid/content/Context;Landroid/util/AttributeSet;Landroidx/fragment/app/FragmentManager;)V
HSPLandroidx/fragment/app/FragmentContainerView;->addView(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V
+HSPLandroidx/fragment/app/FragmentContainerView;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
HSPLandroidx/fragment/app/FragmentContainerView;->dispatchDraw(Landroid/graphics/Canvas;)V
HSPLandroidx/fragment/app/FragmentContainerView;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z
+HSPLandroidx/fragment/app/FragmentContainerView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets;
HSPLandroidx/fragment/app/FragmentContainerView;->setDrawDisappearingViewsLast(Z)V
HSPLandroidx/fragment/app/FragmentController;->(Landroidx/fragment/app/FragmentHostCallback;)V
HSPLandroidx/fragment/app/FragmentController;->attachHost(Landroidx/fragment/app/Fragment;)V
@@ -2712,6 +2501,7 @@ HSPLandroidx/fragment/app/FragmentStateManager;->create()V
HSPLandroidx/fragment/app/FragmentStateManager;->createView()V
HSPLandroidx/fragment/app/FragmentStateManager;->ensureInflatedView()V
HSPLandroidx/fragment/app/FragmentStateManager;->getFragment()Landroidx/fragment/app/Fragment;
+HSPLandroidx/fragment/app/FragmentStateManager;->isFragmentViewChild(Landroid/view/View;)Z
HSPLandroidx/fragment/app/FragmentStateManager;->moveToExpectedState()V
HSPLandroidx/fragment/app/FragmentStateManager;->pause()V
HSPLandroidx/fragment/app/FragmentStateManager;->restoreState(Ljava/lang/ClassLoader;)V
@@ -2887,6 +2677,7 @@ HSPLandroidx/lifecycle/LifecycleRegistry$ObserverWithState;->getState()Landroidx
HSPLandroidx/lifecycle/LifecycleRegistry;->()V
HSPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;)V
HSPLandroidx/lifecycle/LifecycleRegistry;->(Landroidx/lifecycle/LifecycleOwner;Z)V
+HSPLandroidx/lifecycle/LifecycleRegistry;->addObserver(Landroidx/lifecycle/LifecycleObserver;)V
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
@@ -2923,7 +2714,6 @@ HSPLandroidx/lifecycle/LiveData;->(Ljava/lang/Object;)V
HSPLandroidx/lifecycle/LiveData;->assertMainThread(Ljava/lang/String;)V
HSPLandroidx/lifecycle/LiveData;->changeActiveCounter(I)V
HSPLandroidx/lifecycle/LiveData;->considerNotify(Landroidx/lifecycle/LiveData$ObserverWrapper;)V
-HSPLandroidx/lifecycle/LiveData;->dispatchingValue(Landroidx/lifecycle/LiveData$ObserverWrapper;)V
HSPLandroidx/lifecycle/LiveData;->getValue()Ljava/lang/Object;
HSPLandroidx/lifecycle/LiveData;->getVersion()I
HSPLandroidx/lifecycle/LiveData;->hasActiveObservers()Z
@@ -3038,6 +2828,7 @@ HSPLandroidx/lifecycle/SavedStateViewModelFactory;->create(Ljava/lang/Class;Land
HSPLandroidx/lifecycle/SavedStateViewModelFactory;->onRequery(Landroidx/lifecycle/ViewModel;)V
HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->()V
HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->access$getANDROID_VIEWMODEL_SIGNATURE$p()Ljava/util/List;
+HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->access$getVIEWMODEL_SIGNATURE$p()Ljava/util/List;
HSPLandroidx/lifecycle/SavedStateViewModelFactoryKt;->findMatchingConstructor(Ljava/lang/Class;Ljava/util/List;)Ljava/lang/reflect/Constructor;
HSPLandroidx/lifecycle/Transformations$map$1;->(Landroidx/lifecycle/MediatorLiveData;Lkotlin/jvm/functions/Function1;)V
HSPLandroidx/lifecycle/Transformations$map$1;->invoke(Ljava/lang/Object;)Ljava/lang/Object;
@@ -3084,6 +2875,7 @@ HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion;->()
HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory$Companion;->(Lkotlin/jvm/internal/DefaultConstructorMarker;)V
HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V
HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->()V
+HSPLandroidx/lifecycle/ViewModelProvider$NewInstanceFactory;->create(Ljava/lang/Class;)Landroidx/lifecycle/ViewModel;
HSPLandroidx/lifecycle/ViewModelProvider$OnRequeryFactory;->()V
HSPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;)V
HSPLandroidx/lifecycle/ViewModelProvider;->(Landroidx/lifecycle/ViewModelStore;Landroidx/lifecycle/ViewModelProvider$Factory;Landroidx/lifecycle/viewmodel/CreationExtras;)V
@@ -3941,6 +3733,7 @@ HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$$ExternalSyntheticApiMod
HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$$ExternalSyntheticApiModelOutline2;->m(Landroid/media/MediaCodecInfo;)Z
HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$$ExternalSyntheticApiModelOutline3;->m(Landroid/media/MediaCodecInfo;)Z
HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->(Ljava/lang/String;ZZ)V
+HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->equals(Ljava/lang/Object;)Z
HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$CodecKey;->hashCode()I
HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$MediaCodecListCompatV21;->(ZZ)V
HSPLandroidx/media3/exoplayer/mediacodec/MediaCodecUtil$MediaCodecListCompatV21;->ensureMediaCodecInfosInitialized()V
@@ -4683,6 +4476,18 @@ HSPLandroidx/media3/session/SessionTokenImplBase;->getServiceName()Ljava/lang/St
HSPLandroidx/media3/session/SessionTokenImplBase;->getType()I
HSPLandroidx/media3/session/SessionTokenImplBase;->getUid()I
HSPLandroidx/media3/session/SessionTokenImplBase;->isLegacySession()Z
+HSPLandroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher;->(Landroidx/media3/ui/AspectRatioFrameLayout;)V
+HSPLandroidx/media3/ui/AspectRatioFrameLayout$AspectRatioUpdateDispatcher;->(Landroidx/media3/ui/AspectRatioFrameLayout;Landroidx/media3/ui/AspectRatioFrameLayout$1;)V
+HSPLandroidx/media3/ui/AspectRatioFrameLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/media3/ui/AspectRatioFrameLayout;->onMeasure(II)V
+HSPLandroidx/media3/ui/AspectRatioFrameLayout;->setResizeMode(I)V
+HSPLandroidx/media3/ui/PlayerView$ComponentListener;->(Landroidx/media3/ui/PlayerView;)V
+HSPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V
+HSPLandroidx/media3/ui/PlayerView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V
+HSPLandroidx/media3/ui/PlayerView;->setResizeMode(I)V
+HSPLandroidx/media3/ui/PlayerView;->setResizeModeRaw(Landroidx/media3/ui/AspectRatioFrameLayout;I)V
+HSPLandroidx/media3/ui/PlayerView;->updateContentDescription()V
+HSPLandroidx/media3/ui/R$styleable;->()V
HSPLandroidx/multidex/MultiDex;->()V
HSPLandroidx/multidex/MultiDex;->install(Landroid/content/Context;)V
HSPLandroidx/multidex/MultiDex;->isVMMultidexCapable(Ljava/lang/String;)Z
@@ -5108,6 +4913,53 @@ HSPLandroidx/recyclerview/widget/ChildHelper;->getUnfilteredChildCount()I
HSPLandroidx/recyclerview/widget/ChildHelper;->isHidden(Landroid/view/View;)Z
HSPLandroidx/recyclerview/widget/ChildHelper;->removeAllViewsUnfiltered()V
HSPLandroidx/recyclerview/widget/ChildHelper;->removeViewIfHidden(Landroid/view/View;)Z
+HSPLandroidx/recyclerview/widget/ConcatAdapter$Config$StableIdMode;->