diff --git a/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java b/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java index 715517f62e..44b8e18604 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/DeviceProvisioningActivity.java @@ -9,10 +9,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity; +import org.thoughtcrime.securesms.keyvalue.SignalStore; public class DeviceProvisioningActivity extends PassphraseRequiredActivity { - @SuppressWarnings("unused") private static final String TAG = Log.tag(DeviceProvisioningActivity.class); @Override @@ -22,6 +22,13 @@ public class DeviceProvisioningActivity extends PassphraseRequiredActivity { @Override protected void onCreate(Bundle bundle, boolean ready) { + if (SignalStore.account().isLinkedDevice()) { + Log.i(TAG, "Cannot link a device from a linked device. Ignoring provisioning intent."); + startActivity(MainActivity.clearTop(this)); + finish(); + return; + } + AlertDialog dialog = new MaterialAlertDialogBuilder(this) .setTitle(getString(R.string.DeviceProvisioningActivity_link_a_signal_device)) .setMessage(getString(R.string.DeviceProvisioningActivity_to_link_a_desktop_or_ipad_to_this_signal_account)) diff --git a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UsernameOutOfSyncBanner.kt b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UsernameOutOfSyncBanner.kt index f3f52a4257..5e9e039e73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UsernameOutOfSyncBanner.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/banner/banners/UsernameOutOfSyncBanner.kt @@ -26,6 +26,10 @@ class UsernameOutOfSyncBanner(private val onActionClick: (UsernameSyncState) -> override val enabled: Boolean get() { + if (SignalStore.account.isLinkedDevice) { + return false + } + return when (SignalStore.account.usernameSyncState) { AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED -> true AccountValues.UsernameSyncState.LINK_CORRUPTED -> true 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 867f6b7bb0..91c4d32a4d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationUpdateItem.java @@ -697,7 +697,7 @@ public final class ConversationUpdateItem extends FrameLayout }); actionButton.setText(R.string.ConversationActivity__invite_to_signal); - } else if (conversationMessage.getMessageRecord().isPaymentsRequestToActivate() && !conversationMessage.getMessageRecord().isOutgoing() && !SignalStore.payments().mobileCoinPaymentsEnabled()) { + } else if (conversationMessage.getMessageRecord().isPaymentsRequestToActivate() && !conversationMessage.getMessageRecord().isOutgoing() && !SignalStore.payments().mobileCoinPaymentsEnabled() && SignalStore.account().isPrimaryDevice()) { actionButton.setText(R.string.ConversationUpdateItem_activate_payments); actionButton.setVisibility(VISIBLE); actionButton.setOnClickListener(v -> { @@ -707,7 +707,7 @@ public final class ConversationUpdateItem extends FrameLayout passthroughClickListener.onClick(v); } }); - } else if (conversationMessage.getMessageRecord().isPaymentsActivated() && !conversationMessage.getMessageRecord().isOutgoing()) { + } else if (conversationMessage.getMessageRecord().isPaymentsActivated() && !conversationMessage.getMessageRecord().isOutgoing() && SignalStore.account().isPrimaryDevice()) { actionButton.setText(R.string.ConversationUpdateItem_send_payment); actionButton.setVisibility(VISIBLE); actionButton.setOnClickListener(v -> { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java index 7d75f074d4..a61826763b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/MenuState.java @@ -260,7 +260,7 @@ public final class MenuState { return builder.shouldShowCopyAction(!actionMessage && !remoteDelete && hasText && !hasGift && !hasPayment && !hasPoll) .shouldShowDeleteAction(!hasInMemory && onlyContainsCompleteMessages(selectedParts)) .shouldShowReactions(!conversationRecipient.isReleaseNotes() && !conversationRecipient.isInactiveGroup()) - .shouldShowPaymentDetails(hasPayment) + .shouldShowPaymentDetails(hasPayment && SignalStore.account().isPrimaryDevice()) .shouldShowPollTerminate(hasPollTerminate) .shouldShowPinMessage(canPinMessage) .shouldShowUnpinMessage(canUnpinMessage) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt index 0ea399f60d..bebce332f3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/keyboard/AttachmentKeyboardFragment.kt @@ -128,7 +128,7 @@ class AttachmentKeyboardFragment : LoggingFragment(R.layout.attachment_keyboard_ private fun updateButtonsAvailable(recipient: Recipient) { val paymentsValues = SignalStore.payments - val isPaymentsAvailable = paymentsValues.paymentsAvailability.isSendAllowed && !recipient.isSelf && !recipient.isGroup && recipient.isRegistered + val isPaymentsAvailable = paymentsValues.paymentsAvailability.isSendAllowed && !recipient.isSelf && !recipient.isGroup && recipient.isRegistered && SignalStore.account.isPrimaryDevice if (!isPaymentsAvailable) { attachmentKeyboardView.filterAttachmentKeyboardButtons(removePaymentFilter) diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt index f8cb3d6986..909dfa4275 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureViewModel.kt @@ -57,7 +57,7 @@ class MediaCaptureViewModel(private val repository: MediaCaptureRepository) : Vi disposables += qrData .throttleFirst(5, TimeUnit.SECONDS) - .filter { it.startsWith("sgnl://linkdevice") } + .filter { it.startsWith("sgnl://linkdevice") && SignalStore.account.isPrimaryDevice } .subscribe { data -> internalEvents.onNext(MediaCaptureEvent.DeviceLinkScannedFromQrCode) } @@ -65,7 +65,7 @@ class MediaCaptureViewModel(private val repository: MediaCaptureRepository) : Vi if (SignalStore.account.isRegistered) { disposables += qrData .throttleFirst(5, TimeUnit.SECONDS) - .filter { it.startsWith("sgnl://rereg") && QuickRegistrationRepository.isValidReRegistrationQr(it) } + .filter { it.startsWith("sgnl://rereg") && QuickRegistrationRepository.isValidReRegistrationQr(it) && SignalStore.account.isPrimaryDevice } .subscribe { data -> internalEvents.onNext(MediaCaptureEvent.ReregistrationScannedFromQrCode(data)) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3QrRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3QrRepository.kt index f975ed39e7..2ce1fe58a7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3QrRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v3/MediaSendV3QrRepository.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.rx3.await import org.signal.core.util.logging.Log import org.signal.mediasend.MediaRecipientId import org.signal.mediasend.MediaSendQrRepository +import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.profiles.manage.UsernameRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.data.QuickRegistrationRepository @@ -20,8 +21,8 @@ object MediaSendV3QrRepository : MediaSendQrRepository { override suspend fun checkQrData(qrData: String): MediaSendQrRepository.QrCheckResult { return when { UsernameRepository.isValidLink(qrData) -> handleUsernameLink(qrData) - qrData.startsWith("sgnl://linkdevice") -> handleLinkDevice() - qrData.startsWith("sgnl://rereg") && QuickRegistrationRepository.isValidReRegistrationQr(qrData) -> handleReReg(qrData) + qrData.startsWith("sgnl://linkdevice") && SignalStore.account.isPrimaryDevice -> handleLinkDevice() + qrData.startsWith("sgnl://rereg") && QuickRegistrationRepository.isValidReRegistrationQr(qrData) && SignalStore.account.isPrimaryDevice -> handleReReg(qrData) else -> MediaSendQrRepository.QrCheckResult.None } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index f43dbff12f..19dce765cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -637,7 +637,7 @@ public final class Megaphones { } private static boolean shouldShowUseNewOnDeviceBackupsMegaphone() { - return Environment.Backups.isNewFormatSupportedForLocalBackup() && SignalStore.settings().isBackupEnabled() && (RemoteConfig.upgradeBackupsMegaphone() || RemoteConfig.internalUser()); + return SignalStore.account().isPrimaryDevice() && Environment.Backups.isNewFormatSupportedForLocalBackup() && SignalStore.settings().isBackupEnabled() && (RemoteConfig.upgradeBackupsMegaphone() || RemoteConfig.internalUser()); } private static boolean shouldShowGrantFullScreenIntentPermission(@NonNull Context context) {