Detailed changes
@@ -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;
}
@@ -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);
}
@@ -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);
@@ -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
@@ -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
+ }
}
@@ -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();
}
@@ -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) {
@@ -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();
}
@@ -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();
}
@@ -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();