Check for gateway/pstn after caps has been fetched

Stephen Paul Weber created

Previously we would check for the identity at contact presence change,
but the first time the contact comes online (say, during onboarding or
first app use) the contact has never had service discovery done and so
the identity is not known.  Move the identity check to after the service
discovery has certainly been done in order to be sure it works first
time.

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 12 
1 file changed, 8 insertions(+), 4 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -237,10 +237,6 @@ public class XmppConnectionService extends Service {
                 }
             }
         }
-
-        if (contact.getPresences().anyIdentity("gateway", "pstn")) {
-            contact.registerAsPhoneAccount(this);
-        }
     };
     private final PresenceGenerator mPresenceGenerator = new PresenceGenerator(this);
     private List<Account> accounts;
@@ -4677,12 +4673,16 @@ public class XmppConnectionService extends Service {
     public void fetchCaps(Account account, final Jid jid, final Presence presence) {
         final Pair<String, String> key = new Pair<>(presence.getHash(), presence.getVer());
         final ServiceDiscoveryResult disco = getCachedServiceDiscoveryResult(key);
+
         if (disco != null) {
             presence.setServiceDiscoveryResult(disco);
             final Contact contact = account.getRoster().getContact(jid);
             if (contact.refreshRtpCapability()) {
                 syncRoster(account);
             }
+            if (disco.hasIdentity("gateway", "pstn")) {
+                contact.registerAsPhoneAccount(this);
+            }
         } else {
             final IqPacket request = new IqPacket(IqPacket.TYPE.GET);
             request.setTo(jid);
@@ -4699,6 +4699,10 @@ public class XmppConnectionService extends Service {
                     if (presence.getVer().equals(discoveryResult.getVer())) {
                         databaseBackend.insertDiscoveryResult(discoveryResult);
                         injectServiceDiscoveryResult(a.getRoster(), presence.getHash(), presence.getVer(), discoveryResult);
+                        if (discoveryResult.hasIdentity("gateway", "pstn")) {
+                            final Contact contact = account.getRoster().getContact(jid);
+                            contact.registerAsPhoneAccount(this);
+                        }
                     } else {
                         Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": mismatch in caps for contact " + jid + " " + presence.getVer() + " vs " + discoveryResult.getVer());
                     }