fixed possible race conditions with presences

This commit is contained in:
Daniel Gultsch 2014-04-16 19:14:20 +02:00 committed by Andreas Straub
parent 4a36abf30f
commit a04d736f75
5 changed files with 23 additions and 11 deletions

View file

@ -13,6 +13,7 @@ import eu.siacs.conversations.xml.Element;
import android.content.ContentValues;
import android.database.Cursor;
import android.util.Log;
public class Contact extends AbstractEntity implements Serializable {
private static final long serialVersionUID = -4570817093119419962L;
@ -163,11 +164,16 @@ public class Contact extends AbstractEntity implements Serializable {
public void updatePresence(String resource, int status) {
this.presences.updatePresence(resource, status);
Log.d("xmppService","updatingPresence for contact="+this.jid+" resource="+resource+" num="+presences.size());
}
public void removePresence(String resource) {
this.presences.removePresence(resource);
}
public void clearPresences() {
this.presences.clearPresences();
}
public int getMostAvailableStatus() {
return this.presences.getMostAvailableStatus();

View file

@ -33,6 +33,10 @@ public class Presences {
this.presences.remove(resource);
}
public void clearPresences() {
this.presences.clear();
}
public int getMostAvailableStatus() {
int status = OFFLINE;
Iterator<Entry<String, Integer>> it = presences.entrySet().iterator();
@ -54,7 +58,7 @@ public class Presences {
jObj.put("resource", entry.getKey());
jObj.put("status", entry.getValue());
} catch (JSONException e) {
}
json.put(jObj);
}
@ -71,7 +75,7 @@ public class Presences {
jObj.getInt("status"));
}
} catch (JSONException e1) {
}
return presences;
}

View file

@ -1,6 +1,5 @@
package eu.siacs.conversations.services;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
@ -288,8 +287,7 @@ public class XmppConnectionService extends Service {
} else {
Contact contact = findContact(account, fromParts[0]);
if (contact == null) {
//Log.d(LOGTAG,"contact was null");
// most likely roster not synced
Log.d(LOGTAG,packet.getFrom()+ " could not be found");
return;
}
if (type == null) {
@ -314,17 +312,19 @@ public class XmppConnectionService extends Service {
}
}
}
replaceContactInConversation(contact.getJid(), contact);
databaseBackend.updateContact(contact);
} else {
// Log.d(LOGTAG,"presence without resource "+packet.toString());
//Log.d(LOGTAG,"presence without resource "+packet.toString());
}
} else if (type.equals("unavailable")) {
if (fromParts.length != 2) {
// Log.d(LOGTAG,"received presence with no resource "+packet.toString());
contact.clearPresences();
} else {
contact.removePresence(fromParts[1]);
databaseBackend.updateContact(contact);
}
replaceContactInConversation(contact.getJid(), contact);
databaseBackend.updateContact(contact);
} else if (type.equals("subscribe")) {
Log.d(LOGTAG,"received subscribe packet from "+packet.getFrom());
if (contact
@ -348,7 +348,6 @@ public class XmppConnectionService extends Service {
} else {
//Log.d(LOGTAG, packet.toString());
}
replaceContactInConversation(contact.getJid(), contact);
}
}
}

View file

@ -227,7 +227,11 @@ public class ContactDetailsActivity extends XmppActivity {
status.setTextColor(0xFFe92727);
break;
}
contactJid.setText(contact.getJid());
if (contact.getPresences().size() > 1) {
contactJid.setText(contact.getJid()+" ("+contact.getPresences().size()+")");
} else {
contactJid.setText(contact.getJid());
}
accountJid.setText(contact.getAccount().getJid());
UIHelper.prepareContactBadge(this, badge, contact, getApplicationContext());

View file

@ -674,7 +674,6 @@ public class XmppConnection implements Runnable {
"var"));
}
}
Log.d(LOGTAG,"put "+server+" "+features.toString());
disco.put(server, features);
if (account.getServer().equals(server)) {