Update unregistered UI for linked devices.

This commit is contained in:
Cody Henthorne
2026-07-02 10:07:29 -04:00
committed by Alex Hart
parent 9be6f488c4
commit cd5ead4981
6 changed files with 60 additions and 14 deletions
@@ -38,26 +38,36 @@ class UnauthorizedBanner(val context: Context) : Banner<Unit>() {
@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)
}
}
@@ -4763,6 +4763,10 @@ class ConversationFragment :
startActivity(RegistrationActivity.newIntentForReRegistration(requireContext()))
}
override fun onReLinkDeviceClicked() {
startActivity(RegistrationActivity.newIntentForReLinkDevice(requireContext()))
}
override fun onCancelGroupRequestClicked() {
conversationGroupViewModel
.cancelJoinRequest()
@@ -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<TextView>(R.id.logged_out_message)
val actionButton = findViewById<MaterialButton>(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()
@@ -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)
}
}
}
}
@@ -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))
+6
View File
@@ -617,6 +617,8 @@
<string name="ConversationFragment__update_build">Update Signal</string>
<!-- Action shown to allow a user to re-register as they are no longer registered -->
<string name="ConversationFragment__reregister_signal">Re-register Signal</string>
<!-- Action shown in the conversation input area to allow a user to re-link this device as it is no longer linked -->
<string name="ConversationFragment__relink_signal">Re-link</string>
<!-- Label for a button displayed in the conversation toolbar to return to the previous screen. -->
<string name="ConversationFragment__content_description_back_button">Navigate back.</string>
<!-- Label for a button displayed in the conversation toolbar to open the main screen of the app. -->
@@ -3492,6 +3494,10 @@
<string name="UnauthorizedReminder_this_is_likely_because_you_registered_your_phone_number_with_Signal_on_a_different_device">This device is no longer registered. This is likely because you registered your phone number with Signal on a different device.</string>
<!-- Action in reminder banner that will take user to re-register -->
<string name="UnauthorizedReminder_reregister_action">Re-register device</string>
<!-- Message shown in a reminder banner when this linked device is no longer linked to a primary device -->
<string name="UnauthorizedReminder_this_device_is_no_longer_linked_relink_to_continue_messaging">This device is no longer linked. Re-link Signal with your phone to continue messaging.</string>
<!-- Action in reminder banner that will take the user to re-link this device -->
<string name="UnauthorizedReminder_relink_action">Re-link device</string>
<!-- Push notification when the app is forcibly logged out by the server. -->
<string name="LoggedOutNotification_you_have_been_logged_out">You have been logged out of Signal on this device.</string>