Only refresh commands if update was for this contact

Stephen Paul Weber created

Change summary

src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java |  4 
src/main/java/eu/siacs/conversations/parser/IqParser.java                        |  2 
src/main/java/eu/siacs/conversations/parser/MessageParser.java                   |  2 
src/main/java/eu/siacs/conversations/parser/PresenceParser.java                  |  6 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java         | 26 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java              |  3 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java                |  7 
src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java               | 11 
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java           |  2 
src/main/java/eu/siacs/conversations/ui/XmppFragment.java                        |  5 
10 files changed, 46 insertions(+), 22 deletions(-)

Detailed changes

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;
     }
 

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);
     }

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);

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

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
+    }
 }

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();
     }
 

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<Jid> newCapsJids) {
+        if (newCapsJids.isEmpty() || newCapsJids.contains(conversation.getJid().asBareJid())) {
+            refreshCommands(true);
+        }
     }
 
     protected void refreshCommands(boolean delayShow) {

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<Jid> 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();
     }
 

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<Jid> newCapsJids) { }
 
 	protected void runOnUiThread(Runnable runnable) {
 		final Activity activity = getActivity();