Only announce device after publishing bundle

Andreas Straub created

Change summary

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java  | 24 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  3 
2 files changed, 19 insertions(+), 8 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java 🔗

@@ -231,8 +231,7 @@ public class AxolotlService {
 		axolotlStore.regenerate();
 		sessions.clear();
 		fetchStatusMap.clear();
-		publishBundlesIfNeeded();
-		publishOwnDeviceIdIfNeeded();
+		publishBundlesIfNeeded(true);
 	}
 
 	public int getOwnDeviceId() {
@@ -365,7 +364,7 @@ public class AxolotlService {
 		}
 	}
 
-	public void publishBundlesIfNeeded() {
+	public void publishBundlesIfNeeded(final boolean announceAfter) {
 		if (pepBroken) {
 			Log.d(Config.LOGTAG, getLogprefix(account) + "publishBundlesIfNeeded called, but PEP is broken. Ignoring... ");
 			return;
@@ -448,10 +447,23 @@ public class AxolotlService {
 						mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
 							@Override
 							public void onIqPacketReceived(Account account, IqPacket packet) {
-								// TODO: implement this!
-								Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Published bundle, got: " + packet);
+								if (packet.getType() == IqPacket.TYPE.RESULT) {
+									Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Successfully published bundle. ");
+									if (announceAfter) {
+										Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
+										publishOwnDeviceIdIfNeeded();
+									}
+								} else {
+									Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing bundle: " + packet.findChild("error"));
+								}
 							}
 						});
+					} else {
+						Log.d(Config.LOGTAG, getLogprefix(account) + "Bundle " + getOwnDeviceId() + " in PEP was current");
+						if (announceAfter) {
+							Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
+							publishOwnDeviceIdIfNeeded();
+						}
 					}
 				} catch (InvalidKeyException e) {
 					Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
@@ -733,7 +745,7 @@ public class AxolotlService {
 			plaintextMessage = message.decrypt(session, getOwnDeviceId());
 			Integer preKeyId = session.getPreKeyId();
 			if (preKeyId != null) {
-				publishBundlesIfNeeded();
+				publishBundlesIfNeeded(false);
 				session.resetPreKeyId();
 			}
 		} catch (CryptoFailedException e) {

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

@@ -165,8 +165,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 			mMessageArchiveService.executePendingQueries(account);
 			mJingleConnectionManager.cancelInTransmission();
 			syncDirtyContacts(account);
-			account.getAxolotlService().publishOwnDeviceIdIfNeeded();
-			account.getAxolotlService().publishBundlesIfNeeded();
+			account.getAxolotlService().publishBundlesIfNeeded(true);
 		}
 	};
 	private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {