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