diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt
index e6289c39cb..71bcc68db6 100644
--- a/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt
+++ b/app/src/androidTest/java/org/thoughtcrime/securesms/conversation/v2/items/V2ConversationItemShapeTest.kt
@@ -346,5 +346,7 @@ class V2ConversationItemShapeTest {
override fun onDisplayMediaNoLongerAvailableSheet() = Unit
override fun onShowUnverifiedProfileSheet(forGroup: Boolean) = Unit
+
+ override fun onUpdateSignalClicked() = Unit
}
}
diff --git a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt
index 906654ca04..d6475e411f 100644
--- a/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt
+++ b/app/src/debug/java/org/thoughtcrime/securesms/components/settings/app/internal/conversation/test/InternalConversationTestFragment.kt
@@ -332,5 +332,9 @@ class InternalConversationTestFragment : Fragment(R.layout.conversation_test_fra
override fun onShowUnverifiedProfileSheet(forGroup: Boolean) {
Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show()
}
+
+ override fun onUpdateSignalClicked() {
+ Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show()
+ }
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java
index 8f8feddfec..f3d357a23e 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/BindableConversationItem.java
@@ -142,5 +142,6 @@ public interface BindableConversationItem extends Unbindable, GiphyMp4Playable,
void onPaymentTombstoneClicked();
void onDisplayMediaNoLongerAvailableSheet();
void onShowUnverifiedProfileSheet(boolean forGroup);
+ void onUpdateSignalClicked();
}
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java
index 6d802e0994..cab411672b 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java
@@ -634,6 +634,16 @@ public final class ConversationUpdateItem extends FrameLayout
passthroughClickListener.onClick(v);
}
});
+ } else if (conversationMessage.getMessageRecord().isUnsupported()) {
+ actionButton.setText(R.string.ConversationFragment__update_build);
+ actionButton.setVisibility(VISIBLE);
+ actionButton.setOnClickListener(v -> {
+ if (batchSelected.isEmpty() && eventListener != null) {
+ eventListener.onUpdateSignalClicked();
+ } else {
+ passthroughClickListener.onClick(v);
+ }
+ });
} else {
actionButton.setVisibility(GONE);
actionButton.setOnClickListener(null);
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 dd85d9e6c2..1b306cf725 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
@@ -3040,6 +3040,10 @@ class ConversationFragment :
UnverifiedProfileNameBottomSheet.show(parentFragmentManager, forGroup)
}
+ override fun onUpdateSignalClicked() {
+ PlayStoreUtil.openPlayStoreOrOurApkDownloadPage(requireContext())
+ }
+
override fun onJoinGroupCallClicked() {
val activity = activity ?: return
val recipient = viewModel.recipientSnapshot ?: return
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 0c235310cd..9fb03f8628 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
@@ -256,4 +256,8 @@ public abstract class DisplayRecord {
public boolean isUnblocked() {
return MessageTypes.isUnblocked(type);
}
+
+ public boolean isUnsupported() {
+ return MessageTypes.isUnsupportedMessageType(type);
+ }
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java
index 394dcef6aa..492e536dfd 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/MessageRecord.java
@@ -291,6 +291,8 @@ public abstract class MessageRecord extends DisplayRecord {
return staticUpdateDescription(context.getString(isGroupV2() ? R.string.MessageRecord_you_blocked_this_group : R.string.MessageRecord_you_blocked_this_person), Glyph.BLOCK);
} else if (isUnblocked()) {
return staticUpdateDescription(context.getString(isGroupV2() ? R.string.MessageRecord_you_unblocked_this_group : R.string.MessageRecord_you_unblocked_this_person) , Glyph.THREAD);
+ } else if (isUnsupported()) {
+ return staticUpdateDescription(context.getString(R.string.MessageRecord_unsupported_feature, getFromRecipient().getDisplayName(context)), Glyph.ERROR);
}
return null;
@@ -730,7 +732,7 @@ public abstract class MessageRecord extends DisplayRecord {
isProfileChange() || isGroupV1MigrationEvent() || isChatSessionRefresh() || isBadDecryptType() ||
isChangeNumber() || isReleaseChannelDonationRequest() || isThreadMergeEventType() || isSmsExportType() || isSessionSwitchoverEventType() ||
isPaymentsRequestToActivate() || isPaymentsActivated() || isReportedSpam() || isMessageRequestAccepted() ||
- isBlocked() || isUnblocked();
+ isBlocked() || isUnblocked() || isUnsupported();
}
public boolean isMediaPending() {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt
index 89691b5ea5..513b4572b4 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt
@@ -5,6 +5,7 @@ import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.FrameLayout
+import android.widget.Toast
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
@@ -391,6 +392,10 @@ class MessageDetailsFragment : FullScreenDialogFragment(), MessageDetailsAdapter
Log.w(TAG, "Not yet implemented!", Exception())
}
+ override fun onUpdateSignalClicked() {
+ Toast.makeText(requireContext(), "Can't touch this.", Toast.LENGTH_SHORT).show()
+ }
+
interface Callback {
fun onMessageDetailsFragmentDismissed()
}
diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt
index 7c5033cc0f..f3c0713dba 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt
+++ b/app/src/main/java/org/thoughtcrime/securesms/messages/MessageDecryptor.kt
@@ -45,6 +45,7 @@ import org.thoughtcrime.securesms.jobs.SendRetryReceiptJob
import org.thoughtcrime.securesms.keyvalue.SignalStore
import org.thoughtcrime.securesms.logsubmit.SubmitDebugLogActivity
import org.thoughtcrime.securesms.messages.MessageDecryptor.FollowUpOperation
+import org.thoughtcrime.securesms.messages.SignalServiceProtoUtil.hasGroupContext
import org.thoughtcrime.securesms.messages.protocol.BufferedProtocolStore
import org.thoughtcrime.securesms.notifications.NotificationChannels
import org.thoughtcrime.securesms.notifications.NotificationIds
@@ -528,10 +529,15 @@ object MessageDecryptor {
}
private fun SignalServiceCipherResult.toErrorMetadata(): ErrorMetadata {
+ val groupId = if (this.content.dataMessage.hasGroupContext) {
+ GroupId.v2(GroupMasterKey(this.content.dataMessage!!.groupV2!!.masterKey!!.toByteArray()))
+ } else {
+ null
+ }
return ErrorMetadata(
sender = this.metadata.sourceServiceId.toString(),
senderDevice = this.metadata.sourceDeviceId,
- groupId = null
+ groupId = groupId
)
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 19d2accff1..e94d5e0f19 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -2115,6 +2115,8 @@
You blocked this group
You unblocked this group
+
+ %1$s sent you a message that can\'t be processed or displayed because it uses a new Signal feature.
Accept