From 41e0934dd47724af3b0cf3f5c51e843c3b52e265 Mon Sep 17 00:00:00 2001 From: Mikunj Varsani Date: Wed, 13 Nov 2019 12:28:17 +1100 Subject: [PATCH] Only update thread friend request status on message send if we haven't sent a previous request. Always send self sync messages to our primary device. Cache conversation input enabled so that subsequent calls don't cause it to flicker. --- .../conversation/ConversationActivity.java | 13 ++++++++++- .../securesms/jobs/PushSendJob.java | 3 ++- .../securesms/loki/FriendRequestHandler.kt | 23 +++++++++++-------- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 785d086582..1ceca9c158 100644 --- a/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/src/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -329,6 +329,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity protected HidingLinearLayout quickAttachmentToggle; protected HidingLinearLayout inlineAttachmentToggle; private InputPanel inputPanel; + private boolean alwaysEnableInputPanel = false; private LinkPreviewViewModel linkPreviewViewModel; private ConversationSearchViewModel searchViewModel; @@ -2202,7 +2203,14 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } private void updateInputPanel() { - if (recipient.isGroupRecipient() || isNoteToSelf()) { + /* + alwaysEnableInputPanel caches whether we have enabled the input once. + + This stops the case where the input panel disables and enables rapidly. + - This can occur when we are not friends with the current thread BUT multi-device tells us that we are friends with another one of their devices. + */ + + if (recipient.isGroupRecipient() || isNoteToSelf() || alwaysEnableInputPanel) { setInputPanelEnabled(true); return; } @@ -2212,9 +2220,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity boolean isPending = friendRequestStatus == LokiThreadFriendRequestStatus.REQUEST_SENDING || friendRequestStatus == LokiThreadFriendRequestStatus.REQUEST_SENT || friendRequestStatus == LokiThreadFriendRequestStatus.REQUEST_RECEIVED; setInputPanelEnabled(!isPending); + alwaysEnableInputPanel = friendRequestStatus == LokiThreadFriendRequestStatus.FRIENDS; + // This promise correctly updates the UI for multidevice if (friendRequestStatus != LokiThreadFriendRequestStatus.FRIENDS) { MultiDeviceUtilities.shouldEnableUserInput(this, recipient).success(shouldEnableInput -> { + alwaysEnableInputPanel = shouldEnableInput; setInputPanelEnabled(shouldEnableInput); return Unit.INSTANCE; }); diff --git a/src/org/thoughtcrime/securesms/jobs/PushSendJob.java b/src/org/thoughtcrime/securesms/jobs/PushSendJob.java index aaedf8f25a..526264ef67 100644 --- a/src/org/thoughtcrime/securesms/jobs/PushSendJob.java +++ b/src/org/thoughtcrime/securesms/jobs/PushSendJob.java @@ -303,7 +303,8 @@ public abstract class PushSendJob extends SendJob { } protected SignalServiceSyncMessage buildSelfSendSyncMessage(@NonNull Context context, @NonNull SignalServiceDataMessage message, Optional syncAccess) { - String localNumber = TextSecurePreferences.getLocalNumber(context); + String primary = TextSecurePreferences.getMasterHexEncodedPublicKey(context); + String localNumber = primary != null ? primary : TextSecurePreferences.getLocalNumber(context); SentTranscriptMessage transcript = new SentTranscriptMessage(localNumber, message.getTimestamp(), message, diff --git a/src/org/thoughtcrime/securesms/loki/FriendRequestHandler.kt b/src/org/thoughtcrime/securesms/loki/FriendRequestHandler.kt index cc4ef0f273..a4ca3bd886 100644 --- a/src/org/thoughtcrime/securesms/loki/FriendRequestHandler.kt +++ b/src/org/thoughtcrime/securesms/loki/FriendRequestHandler.kt @@ -1,12 +1,8 @@ package org.thoughtcrime.securesms.loki import android.content.Context -import nl.komponents.kovenant.Promise -import nl.komponents.kovenant.ui.alwaysUi import nl.komponents.kovenant.ui.successUi import org.thoughtcrime.securesms.database.DatabaseFactory -import org.thoughtcrime.securesms.util.Util -import org.whispersystems.signalservice.loki.api.LokiStorageAPI import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus import org.whispersystems.signalservice.loki.messaging.LokiThreadFriendRequestStatus import java.lang.IllegalStateException @@ -20,13 +16,20 @@ object FriendRequestHandler { val recipient = DatabaseFactory.getThreadDatabase(context).getRecipientForThreadId(threadId) ?: return if (!recipient.address.isPhone) { return } - // Update thread status - val threadFriendStatus = when (type) { - ActionType.Sending -> LokiThreadFriendRequestStatus.REQUEST_SENDING - ActionType.Failed -> LokiThreadFriendRequestStatus.NONE - ActionType.Sent -> LokiThreadFriendRequestStatus.REQUEST_SENT + val currentFriendStatus = DatabaseFactory.getLokiThreadDatabase(context).getFriendRequestStatus(threadId) + // Update thread status if we haven't sent a friend request before + if (currentFriendStatus != LokiThreadFriendRequestStatus.REQUEST_RECEIVED && + currentFriendStatus != LokiThreadFriendRequestStatus.REQUEST_SENT && + currentFriendStatus != LokiThreadFriendRequestStatus.FRIENDS + ) { + val threadFriendStatus = when (type) { + ActionType.Sending -> LokiThreadFriendRequestStatus.REQUEST_SENDING + ActionType.Failed -> LokiThreadFriendRequestStatus.NONE + ActionType.Sent -> LokiThreadFriendRequestStatus.REQUEST_SENT + } + DatabaseFactory.getLokiThreadDatabase(context).setFriendRequestStatus(threadId, threadFriendStatus) } - DatabaseFactory.getLokiThreadDatabase(context).setFriendRequestStatus(threadId, threadFriendStatus) + // Update message status if (messageId >= 0) {