From cd5ead4981e55f76ec338bc2af6021cbe6976787 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 2 Jul 2026 10:07:29 -0400 Subject: [PATCH] Update unregistered UI for linked devices. --- .../banner/banners/UnauthorizedBanner.kt | 22 +++++++++++----- .../conversation/v2/ConversationFragment.kt | 4 +++ .../conversation/v2/DisabledInputView.kt | 26 ++++++++++++++----- .../registration/ui/RegistrationActivity.kt | 9 +++++++ .../securesms/util/TextSecurePreferences.java | 7 ++++- app/src/main/res/values/strings.xml | 6 +++++ 6 files changed, 60 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UnauthorizedBanner.kt b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UnauthorizedBanner.kt index 1708fa1482..c85de26005 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UnauthorizedBanner.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UnauthorizedBanner.kt @@ -38,26 +38,36 @@ class UnauthorizedBanner(val context: Context) : Banner() { @Composable override fun DisplayBanner(model: Unit, contentPadding: PaddingValues) { - Banner(contentPadding) + Banner(contentPadding, SignalStore.account.isLinkedDevice) } } @Composable -private fun Banner(contentPadding: PaddingValues) { +private fun Banner(contentPadding: PaddingValues, isLinkedDevice: Boolean) { val context = LocalContext.current DefaultBanner( title = null, - body = stringResource(id = R.string.UnauthorizedReminder_this_is_likely_because_you_registered_your_phone_number_with_Signal_on_a_different_device), + body = stringResource( + id = if (isLinkedDevice) { + R.string.UnauthorizedReminder_this_device_is_no_longer_linked_relink_to_continue_messaging + } else { + R.string.UnauthorizedReminder_this_is_likely_because_you_registered_your_phone_number_with_Signal_on_a_different_device + } + ), importance = Importance.ERROR, actions = listOf( - Action(R.string.UnauthorizedReminder_reregister_action) { + Action(if (isLinkedDevice) R.string.UnauthorizedReminder_relink_action else R.string.UnauthorizedReminder_reregister_action) { if (SignalStore.misc.isOldDeviceTransferLocked) { SignalStore.misc.isOldDeviceTransferLocked = false DeviceTransferBlockingInterceptor.getInstance().unblockNetwork() } - val registrationIntent = RegistrationActivity.newIntentForReRegistration(context) + val registrationIntent = if (isLinkedDevice) { + RegistrationActivity.newIntentForReLinkDevice(context) + } else { + RegistrationActivity.newIntentForReRegistration(context) + } context.startActivity(registrationIntent) } ), @@ -69,6 +79,6 @@ private fun Banner(contentPadding: PaddingValues) { @Composable private fun BannerPreview() { Previews.Preview { - Banner(PaddingValues(0.dp)) + Banner(PaddingValues(0.dp), isLinkedDevice = false) } } 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 b38be6cf2c..f3eee4ef75 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 @@ -4763,6 +4763,10 @@ class ConversationFragment : startActivity(RegistrationActivity.newIntentForReRegistration(requireContext())) } + override fun onReLinkDeviceClicked() { + startActivity(RegistrationActivity.newIntentForReLinkDevice(requireContext())) + } + override fun onCancelGroupRequestClicked() { conversationGroupViewModel .cancelJoinRequest() diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt index 6200680ab6..7872237f35 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/DisabledInputView.kt @@ -18,6 +18,7 @@ import com.google.android.material.button.MaterialButton import com.google.android.material.dialog.MaterialAlertDialogBuilder import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.messagerequests.MessageRequestState import org.thoughtcrime.securesms.messagerequests.MessageRequestsBottomView import org.thoughtcrime.securesms.recipients.Recipient @@ -69,13 +70,23 @@ class DisabledInputView @JvmOverloads constructor( val message = findViewById(R.id.logged_out_message) val actionButton = findViewById(R.id.logged_out_button) - message.setText(if (clientExpired) R.string.ExpiredBuildReminder_this_version_of_signal_has_expired else R.string.UnauthorizedReminder_this_is_likely_because_you_registered_your_phone_number_with_Signal_on_a_different_device) - actionButton.setText(if (clientExpired) R.string.ConversationFragment__update_build else R.string.ConversationFragment__reregister_signal) - actionButton.setOnClickListener { - if (clientExpired) { - listener?.onUpdateAppClicked() - } else { - listener?.onReRegisterClicked() + when { + clientExpired -> { + message.setText(R.string.ExpiredBuildReminder_this_version_of_signal_has_expired) + actionButton.setText(R.string.ConversationFragment__update_build) + actionButton.setOnClickListener { listener?.onUpdateAppClicked() } + } + + unauthorized && SignalStore.account.isLinkedDevice -> { + message.setText(R.string.UnauthorizedReminder_this_device_is_no_longer_linked_relink_to_continue_messaging) + actionButton.setText(R.string.ConversationFragment__relink_signal) + actionButton.setOnClickListener { listener?.onReLinkDeviceClicked() } + } + + else -> { + message.setText(R.string.UnauthorizedReminder_this_is_likely_because_you_registered_your_phone_number_with_Signal_on_a_different_device) + actionButton.setText(R.string.ConversationFragment__reregister_signal) + actionButton.setOnClickListener { listener?.onReRegisterClicked() } } } } @@ -275,6 +286,7 @@ class DisabledInputView @JvmOverloads constructor( interface Listener { fun onUpdateAppClicked() fun onReRegisterClicked() + fun onReLinkDeviceClicked() fun onCancelGroupRequestClicked() fun onShowAdminsBottomSheetDialog() fun onAcceptMessageRequestClicked() diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationActivity.kt index 29418b3750..e7f14340d0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationActivity.kt @@ -103,5 +103,14 @@ class RegistrationActivity : BaseActivity() { } } } + + @JvmStatic + fun newIntentForReLinkDevice(context: Context): Intent { + return if (Environment.USE_NEW_REGISTRATION) { + org.signal.registration.RegistrationActivity.createIntent(context, MainActivity.clearTop(context)) + } else { + Intent(context, RegistrationActivity::class.java) + } + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java index 8501551f7d..2b04af571f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/TextSecurePreferences.java @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.util; import android.Manifest; import android.app.PendingIntent; import android.content.Context; +import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; @@ -885,10 +886,14 @@ public class TextSecurePreferences { return; } + Intent registrationIntent = SignalStore.account().isLinkedDevice() ? RegistrationActivity.newIntentForReLinkDevice(context) + : RegistrationActivity.newIntentForReRegistration(context); + PendingIntent reRegistrationIntent = PendingIntent.getActivity(context, 0, - RegistrationActivity.newIntentForReRegistration(context), + registrationIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntentFlags.immutable()); + final NotificationCompat.Builder builder = new NotificationCompat.Builder(context, NotificationChannels.getInstance().FAILURES) .setSmallIcon(R.drawable.ic_signal_logo_large) .setContentText(context.getString(R.string.LoggedOutNotification_you_have_been_logged_out)) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ce4ad9d090..7c052a7be0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -617,6 +617,8 @@ Update Signal Re-register Signal + + Re-link Navigate back. @@ -3492,6 +3494,10 @@ This device is no longer registered. This is likely because you registered your phone number with Signal on a different device. Re-register device + + This device is no longer linked. Re-link Signal with your phone to continue messaging. + + Re-link device You have been logged out of Signal on this device.