Merge branch 'master' into development
This commit is contained in:
commit
b0710cdf04
|
@ -1,5 +1,8 @@
|
|||
###Changelog
|
||||
|
||||
####Version 1.6.1
|
||||
* fixed crashes
|
||||
|
||||
####Version 1.6.0
|
||||
* new multi-end-to-multi-end encryption method
|
||||
* redesigned chat bubbles
|
||||
|
|
|
@ -48,7 +48,7 @@ android {
|
|||
defaultConfig {
|
||||
minSdkVersion 14
|
||||
targetSdkVersion 21
|
||||
versionCode 84
|
||||
versionCode 85
|
||||
versionName "1.7.0-alpha"
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:icon="@drawable/ic_launcher"
|
||||
|
|
|
@ -307,6 +307,7 @@ public class AxolotlService {
|
|||
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
|
||||
@Override
|
||||
public void onIqPacketReceived(Account account, IqPacket packet) {
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
Element item = mXmppConnectionService.getIqParser().getItem(packet);
|
||||
Set<Integer> deviceIds = mXmppConnectionService.getIqParser().deviceIds(item);
|
||||
if (deviceIds == null) {
|
||||
|
@ -323,6 +324,9 @@ public class AxolotlService {
|
|||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing device ID:" + packet.findChild("error"));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -332,6 +336,7 @@ public class AxolotlService {
|
|||
mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
|
||||
@Override
|
||||
public void onIqPacketReceived(Account account, IqPacket packet) {
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
PreKeyBundle bundle = mXmppConnectionService.getIqParser().bundle(packet);
|
||||
Map<Integer, ECPublicKey> keys = mXmppConnectionService.getIqParser().preKeyPublics(packet);
|
||||
boolean flush = false;
|
||||
|
@ -415,6 +420,9 @@ public class AxolotlService {
|
|||
Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing Bundle:" + packet.findChild("error"));
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -453,6 +461,7 @@ public class AxolotlService {
|
|||
|
||||
@Override
|
||||
public void onIqPacketReceived(Account account, IqPacket packet) {
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Received preKey IQ packet, processing...");
|
||||
final IqParser parser = mXmppConnectionService.getIqParser();
|
||||
final List<PreKeyBundle> preKeyBundleList = parser.preKeys(packet);
|
||||
|
@ -492,6 +501,12 @@ public class AxolotlService {
|
|||
}
|
||||
|
||||
finish();
|
||||
} else {
|
||||
fetchStatusMap.put(address, FetchStatus.ERROR);
|
||||
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while building session:" + packet.findChild("error"));
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (InvalidJidException e) {
|
||||
|
|
|
@ -236,7 +236,9 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
|
|||
|
||||
@Override
|
||||
public void onIqPacketReceived(final Account account, final IqPacket packet) {
|
||||
if (packet.hasChild("query", Xmlns.ROSTER) && packet.fromServer(account)) {
|
||||
if (packet.getType() == IqPacket.TYPE.ERROR) {
|
||||
return;
|
||||
} else if (packet.hasChild("query", Xmlns.ROSTER) && packet.fromServer(account)) {
|
||||
final Element query = packet.findChild("query");
|
||||
// If this is in response to a query for the whole roster:
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
|
@ -306,13 +308,11 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived {
|
|||
final IqPacket response = packet.generateResponse(IqPacket.TYPE.RESULT);
|
||||
mXmppConnectionService.sendIqPacket(account, response, null);
|
||||
} else {
|
||||
if ((packet.getType() == IqPacket.TYPE.GET)
|
||||
|| (packet.getType() == IqPacket.TYPE.SET)) {
|
||||
if (packet.getType() == IqPacket.TYPE.GET || packet.getType() == IqPacket.TYPE.SET) {
|
||||
final IqPacket response = packet.generateResponse(IqPacket.TYPE.ERROR);
|
||||
final Element error = response.addChild("error");
|
||||
error.setAttribute("type", "cancel");
|
||||
error.addChild("feature-not-implemented",
|
||||
"urn:ietf:params:xml:ns:xmpp-stanzas");
|
||||
error.addChild("feature-not-implemented","urn:ietf:params:xml:ns:xmpp-stanzas");
|
||||
account.getXmppConnection().sendIqPacket(response, null);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -867,10 +867,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
|
|||
|
||||
@Override
|
||||
public void onIqPacketReceived(final Account account, final IqPacket packet) {
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
final Element query = packet.query();
|
||||
final List<Bookmark> bookmarks = new CopyOnWriteArrayList<>();
|
||||
final Element storage = query.findChild("storage",
|
||||
"storage:bookmarks");
|
||||
final Element storage = query.findChild("storage", "storage:bookmarks");
|
||||
if (storage != null) {
|
||||
for (final Element item : storage.getChildren()) {
|
||||
if (item.getName().equals("conference")) {
|
||||
|
@ -889,6 +889,9 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
|
|||
}
|
||||
}
|
||||
account.setBookmarks(bookmarks);
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not fetch bookmarks");
|
||||
}
|
||||
}
|
||||
};
|
||||
sendIqPacket(account, iqPacket, callback);
|
||||
|
@ -1952,10 +1955,8 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
|
|||
final IqPacket packet = XmppConnectionService.this.mIqGenerator
|
||||
.publishAvatarMetadata(avatar);
|
||||
sendIqPacket(account, packet, new OnIqPacketReceived() {
|
||||
|
||||
@Override
|
||||
public void onIqPacketReceived(Account account,
|
||||
IqPacket result) {
|
||||
public void onIqPacketReceived(Account account, IqPacket result) {
|
||||
if (result.getType() == IqPacket.TYPE.RESULT) {
|
||||
if (account.setAvatar(avatar.getFilename())) {
|
||||
getAvatarService().clear(account);
|
||||
|
|
|
@ -69,8 +69,7 @@ public class Element {
|
|||
|
||||
public Element findChild(String name, String xmlns) {
|
||||
for (Element child : this.children) {
|
||||
if (child.getName().equals(name)
|
||||
&& (child.getAttribute("xmlns").equals(xmlns))) {
|
||||
if (name.equals(child.getName()) && xmlns.equals(child.getAttribute("xmlns"))) {
|
||||
return child;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -34,7 +34,6 @@ import java.util.Hashtable;
|
|||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import javax.net.ssl.HostnameVerifier;
|
||||
|
@ -102,7 +101,7 @@ public class XmppConnection implements Runnable {
|
|||
private long lastConnect = 0;
|
||||
private long lastSessionStarted = 0;
|
||||
private int attempt = 0;
|
||||
private final Map<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>();
|
||||
private final Hashtable<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>();
|
||||
private OnPresencePacketReceived presenceListener = null;
|
||||
private OnJinglePacketReceived jingleListener = null;
|
||||
private OnIqPacketReceived unregisteredIqListener = null;
|
||||
|
@ -649,8 +648,8 @@ public class XmppConnection implements Runnable {
|
|||
|
||||
@Override
|
||||
public void onIqPacketReceived(final Account account, final IqPacket packet) {
|
||||
final Element instructions = packet.query().findChild("instructions");
|
||||
if (packet.query().hasChild("username")
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT
|
||||
&& packet.query().hasChild("username")
|
||||
&& (packet.query().hasChild("password"))) {
|
||||
final IqPacket register = new IqPacket(IqPacket.TYPE.SET);
|
||||
final Element username = new Element("username").setContent(account.getUsername());
|
||||
|
@ -677,6 +676,7 @@ public class XmppConnection implements Runnable {
|
|||
}
|
||||
});
|
||||
} else {
|
||||
final Element instructions = packet.query().findChild("instructions");
|
||||
changeStatus(Account.State.REGISTRATION_FAILED);
|
||||
disconnect(true);
|
||||
Log.d(Config.LOGTAG, account.getJid().toBareJid()
|
||||
|
@ -716,9 +716,11 @@ public class XmppConnection implements Runnable {
|
|||
sendPostBindInitialization();
|
||||
}
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid()+": disconnecting because of bind failure");
|
||||
disconnect(true);
|
||||
}
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid()+": disconnecting because of bind failure");
|
||||
disconnect(true);
|
||||
}
|
||||
}
|
||||
|
@ -726,16 +728,24 @@ public class XmppConnection implements Runnable {
|
|||
}
|
||||
|
||||
private void clearIqCallbacks() {
|
||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": clearing iq iq callbacks");
|
||||
final IqPacket failurePacket = new IqPacket(IqPacket.TYPE.ERROR);
|
||||
final ArrayList<OnIqPacketReceived> callbacks = new ArrayList<>();
|
||||
synchronized (this.packetCallbacks) {
|
||||
Iterator<Entry<String, Pair<IqPacket, OnIqPacketReceived>>> iterator = this.packetCallbacks.entrySet().iterator();
|
||||
if (this.packetCallbacks.size() == 0) {
|
||||
return;
|
||||
}
|
||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": clearing "+this.packetCallbacks.size()+" iq callbacks");
|
||||
final Iterator<Pair<IqPacket, OnIqPacketReceived>> iterator = this.packetCallbacks.values().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Entry<String, Pair<IqPacket, OnIqPacketReceived>> entry = iterator.next();
|
||||
entry.getValue().second.onIqPacketReceived(account, failurePacket);
|
||||
Pair<IqPacket, OnIqPacketReceived> entry = iterator.next();
|
||||
callbacks.add(entry.second);
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
for(OnIqPacketReceived callback : callbacks) {
|
||||
callback.onIqPacketReceived(account,failurePacket);
|
||||
}
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": done clearing iq callbacks. "+this.packetCallbacks.size()+" left");
|
||||
}
|
||||
|
||||
private void sendStartSession() {
|
||||
|
@ -747,6 +757,7 @@ public class XmppConnection implements Runnable {
|
|||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
sendPostBindInitialization();
|
||||
} else {
|
||||
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": could not init sessions");
|
||||
disconnect(true);
|
||||
}
|
||||
}
|
||||
|
@ -792,6 +803,7 @@ public class XmppConnection implements Runnable {
|
|||
|
||||
@Override
|
||||
public void onIqPacketReceived(final Account account, final IqPacket packet) {
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
final List<Element> elements = packet.query().getChildren();
|
||||
final Info info = new Info();
|
||||
for (final Element element : elements) {
|
||||
|
@ -806,13 +818,15 @@ public class XmppConnection implements Runnable {
|
|||
}
|
||||
}
|
||||
disco.put(jid, info);
|
||||
|
||||
if (account.getServer().equals(jid)) {
|
||||
enableAdvancedStreamFeatures();
|
||||
for (final OnAdvancedStreamFeaturesLoaded listener : advancedStreamFeaturesLoadedListeners) {
|
||||
listener.onAdvancedStreamFeaturesAvailable(account);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not query disco info for "+jid.toString());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -836,6 +850,7 @@ public class XmppConnection implements Runnable {
|
|||
|
||||
@Override
|
||||
public void onIqPacketReceived(final Account account, final IqPacket packet) {
|
||||
if (packet.getType() == IqPacket.TYPE.RESULT) {
|
||||
final List<Element> elements = packet.query().getChildren();
|
||||
for (final Element element : elements) {
|
||||
if (element.getName().equals("item")) {
|
||||
|
@ -845,6 +860,9 @@ public class XmppConnection implements Runnable {
|
|||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not query disco items of "+server);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -877,6 +895,8 @@ public class XmppConnection implements Runnable {
|
|||
Log.d(Config.LOGTAG,
|
||||
account.getJid().toBareJid() + ": switching resource due to conflict ("
|
||||
+ account.getResource() + ")");
|
||||
} else if (streamError != null) {
|
||||
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue