From 83faff526f946d9f50d63cacc079efc9d78f7663 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Mon, 15 Jul 2024 10:28:16 -0500 Subject: [PATCH] Only refresh commands if update was for this contact --- .../services/QuickConversationsService.java | 4 +-- .../siacs/conversations/parser/IqParser.java | 2 +- .../conversations/parser/MessageParser.java | 2 +- .../conversations/parser/PresenceParser.java | 6 ++--- .../services/XmppConnectionService.java | 26 ++++++++++++++----- .../ui/ContactDetailsActivity.java | 3 ++- .../ui/ConversationFragment.java | 7 +++-- .../ui/ConversationsActivity.java | 11 +++++--- .../ui/StartConversationActivity.java | 2 +- .../siacs/conversations/ui/XmppFragment.java | 5 +++- 10 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java b/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java index 3b87b1602d65329ad7b389e1bcf128b3db5c4b3b..9c757552f4d33da5a9b87316a4e15a97bfee7026 100644 --- a/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java +++ b/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java @@ -54,7 +54,7 @@ public class QuickConversationsService extends AbstractQuickConversationsService mSerialSingleThreadExecutor.execute(() -> { considerSync(force); if (mRunningSyncJobs.decrementAndGet() == 0) { - service.updateRosterUi(); + service.updateRosterUi(XmppConnectionService.UpdateRosterReason.INIT); } }); } @@ -152,7 +152,7 @@ public class QuickConversationsService extends AbstractQuickConversationsService mRunningSyncJobs.decrementAndGet(); service.syncRoster(account); - service.updateRosterUi(); + service.updateRosterUi(XmppConnectionService.UpdateRosterReason.INIT); return true; } diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java index 1eb00d0e0b1fbf9b86d9881c0511ddf1df9c1d39..c401c29d212a458d9a90d8e7aaa86b8a8ab20358 100644 --- a/src/main/java/eu/siacs/conversations/parser/IqParser.java +++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java @@ -139,7 +139,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { } } mXmppConnectionService.updateConversationUi(); - mXmppConnectionService.updateRosterUi(); + mXmppConnectionService.updateRosterUi(XmppConnectionService.UpdateRosterReason.PUSH); mXmppConnectionService.getShortcutService().refresh(); mXmppConnectionService.syncRoster(account); } diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 33f05708492ba99a81ae512dfd4336d86d9051b6..cc71391119f3e991c07b481570a373893f231dbb 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -237,7 +237,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece mXmppConnectionService.syncRoster(account); mXmppConnectionService.getAvatarService().clear(contact); mXmppConnectionService.updateConversationUi(); - mXmppConnectionService.updateRosterUi(); + mXmppConnectionService.updateRosterUi(XmppConnectionService.UpdateRosterReason.AVATAR); } } else if (mXmppConnectionService.isDataSaverDisabled()) { mXmppConnectionService.fetchAvatar(account, avatar); diff --git a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java index cf627573e6743aabd2e0b3762c7c9deb91ca9949..955cf9d1e1a606f570f4b4922d160378f70ab25b 100644 --- a/src/main/java/eu/siacs/conversations/parser/PresenceParser.java +++ b/src/main/java/eu/siacs/conversations/parser/PresenceParser.java @@ -150,7 +150,7 @@ public class PresenceParser extends AbstractParser implements OnPresencePacketRe c.setAvatar(avatar); mXmppConnectionService.syncRoster(conversation.getAccount()); mXmppConnectionService.getAvatarService().clear(c); - mXmppConnectionService.updateRosterUi(); + mXmppConnectionService.updateRosterUi(XmppConnectionService.UpdateRosterReason.AVATAR); } } else if (mXmppConnectionService.isDataSaverDisabled()) { mXmppConnectionService.fetchAvatar(mucOptions.getAccount(), avatar); @@ -326,7 +326,7 @@ public class PresenceParser extends AbstractParser implements OnPresencePacketRe mXmppConnectionService.syncRoster(account); mXmppConnectionService.getAvatarService().clear(contact); mXmppConnectionService.updateConversationUi(); - mXmppConnectionService.updateRosterUi(); + mXmppConnectionService.updateRosterUi(XmppConnectionService.UpdateRosterReason.AVATAR); } } else if (mXmppConnectionService.isDataSaverDisabled()) { mXmppConnectionService.fetchAvatar(account, avatar); @@ -430,7 +430,7 @@ public class PresenceParser extends AbstractParser implements OnPresencePacketRe } } } - mXmppConnectionService.updateRosterUi(); + mXmppConnectionService.updateRosterUi(XmppConnectionService.UpdateRosterReason.PRESENCE, contact); } @Override diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index ded1b6117466b7edb7924401d396a262534332cc..a129d0e0d8ff080f76efd77409ee0483a0fe19d3 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -2678,7 +2678,7 @@ public class XmppConnectionService extends Service { } Log.d(Config.LOGTAG, "finished merging phone contacts"); mShortcutService.refresh(mInitialAddressbookSyncCompleted.compareAndSet(false, true)); - updateRosterUi(); + updateRosterUi(UpdateRosterReason.INIT); mQuickConversationsService.considerSync(); }); } @@ -4715,7 +4715,7 @@ public class XmppConnectionService extends Service { syncRoster(account); getAvatarService().clear(contact); updateConversationUi(); - updateRosterUi(); + updateRosterUi(UpdateRosterReason.AVATAR); } if (callback != null) { callback.success(avatar); @@ -4774,7 +4774,7 @@ public class XmppConnectionService extends Service { contact.setAvatar(avatar, previouslyOmittedPepFetch); syncRoster(account); getAvatarService().clear(contact); - updateRosterUi(); + updateRosterUi(UpdateRosterReason.AVATAR); } updateConversationUi(); } else { @@ -4792,7 +4792,7 @@ public class XmppConnectionService extends Service { contact.setAvatar(avatar); syncRoster(account); getAvatarService().clear(contact); - updateRosterUi(); + updateRosterUi(UpdateRosterReason.AVATAR); } } } @@ -5138,9 +5138,14 @@ public class XmppConnectionService extends Service { } } - public void updateRosterUi() { + public void updateRosterUi(final UpdateRosterReason reason) { + if (reason == UpdateRosterReason.PRESENCE) throw new IllegalArgumentException("PRESENCE must also come with a contact"); + updateRosterUi(reason, null); + } + + public void updateRosterUi(final UpdateRosterReason reason, final Contact contact) { for (OnRosterUpdate listener : threadSafeList(this.mOnRosterUpdates)) { - listener.onRosterUpdate(); + listener.onRosterUpdate(reason, contact); } } @@ -5983,7 +5988,7 @@ public class XmppConnectionService extends Service { } public interface OnRosterUpdate { - void onRosterUpdate(); + void onRosterUpdate(final UpdateRosterReason reason, final Contact contact); } public interface OnMucRosterUpdate { @@ -6083,4 +6088,11 @@ public class XmppConnectionService extends Service { } public static class BlockedMediaException extends Exception { } + + public static enum UpdateRosterReason { + INIT, + AVATAR, + PUSH, + PRESENCE + } } diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java index ad52eeb1313f06d7c4f1d13ef46ddb166ef0f955..8b26118bd429eb46ea06f7359426ce3c07dff739 100644 --- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java @@ -72,6 +72,7 @@ import eu.siacs.conversations.entities.ListItem; import eu.siacs.conversations.entities.Presence; import eu.siacs.conversations.services.AbstractQuickConversationsService; import eu.siacs.conversations.services.QuickConversationsService; +import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate; import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate; import eu.siacs.conversations.ui.adapter.MediaAdapter; @@ -201,7 +202,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp } @Override - public void onRosterUpdate() { + public void onRosterUpdate(final XmppConnectionService.UpdateRosterReason reason, final Contact contact) { refreshUi(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index c2c7a8eb93302343b71639ce7a8462bc9a76ac27..66b66d2a36af82c7c634b1024a3213bc7e0fa7a3 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -3287,8 +3287,11 @@ public class ConversationFragment extends XmppFragment return true; } - public void refreshForNewCaps() { - refreshCommands(true); + @Override + public void refreshForNewCaps(final Set newCapsJids) { + if (newCapsJids.isEmpty() || newCapsJids.contains(conversation.getJid().asBareJid())) { + refreshCommands(true); + } } protected void refreshCommands(boolean delayShow) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index 4c251a9520c9e64e3d11c273cad585dd2910211d..ad571a91425d7e010c3cdfc009f659f6c55b0e04 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java @@ -144,6 +144,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio private boolean mActivityPaused = true; private final AtomicBoolean mRedirectInProcess = new AtomicBoolean(false); private boolean refreshForNewCaps = false; + private Set newCapsJids = new HashSet<>(); private int mRequestCode = -1; private static boolean isViewOrShareIntent(Intent i) { @@ -165,6 +166,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio refreshFragment(id); } refreshForNewCaps = false; + newCapsJids.clear(); } @Override @@ -367,7 +369,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio final Fragment fragment = getFragmentManager().findFragmentById(id); if (fragment instanceof XmppFragment) { ((XmppFragment) fragment).refresh(); - if (refreshForNewCaps) ((XmppFragment) fragment).refreshForNewCaps(); + if (refreshForNewCaps) ((XmppFragment) fragment).refreshForNewCaps(newCapsJids); } } @@ -911,8 +913,11 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio } @Override - public void onRosterUpdate() { - refreshForNewCaps = true; + public void onRosterUpdate(final XmppConnectionService.UpdateRosterReason reason, final Contact contact) { + if (reason != XmppConnectionService.UpdateRosterReason.AVATAR) { + refreshForNewCaps = true; + if (contact != null) newCapsJids.add(contact.getJid().asBareJid()); + } this.refreshUi(); } diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index c0d27df2ad84cf35bf87b608bbe308af7c943137..6df65ba8a9409759c3f8a01bd860af92ad203251 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -287,7 +287,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } @Override - public void onRosterUpdate() { + public void onRosterUpdate(final XmppConnectionService.UpdateRosterReason reason, final Contact contact) { this.refreshUi(); } diff --git a/src/main/java/eu/siacs/conversations/ui/XmppFragment.java b/src/main/java/eu/siacs/conversations/ui/XmppFragment.java index b3f563b2502b8e881a699f7b71fe74f02edbe44e..e5e5dc6dcd781473fdc0ff273d1e181d528453bd 100644 --- a/src/main/java/eu/siacs/conversations/ui/XmppFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/XmppFragment.java @@ -36,14 +36,17 @@ import androidx.lifecycle.Lifecycle; import androidx.lifecycle.LifecycleRegistry; import androidx.lifecycle.LifecycleOwner; +import java.util.Set; + import eu.siacs.conversations.ui.interfaces.OnBackendConnected; +import eu.siacs.conversations.xmpp.Jid; public abstract class XmppFragment extends Fragment implements OnBackendConnected, LifecycleOwner { protected LifecycleRegistry lifecycle = new LifecycleRegistry(this); abstract void refresh(); - public void refreshForNewCaps() { } + public void refreshForNewCaps(final Set newCapsJids) { } protected void runOnUiThread(Runnable runnable) { final Activity activity = getActivity();