fixed #3

Daniel Gultsch created

Change summary

src/eu/siacs/conversations/services/XmppConnectionService.java | 15 +
src/eu/siacs/conversations/ui/ConversationActivity.java        | 13 +
src/eu/siacs/conversations/xmpp/XmppConnection.java            | 28 +--
3 files changed, 29 insertions(+), 27 deletions(-)

Detailed changes

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

@@ -175,11 +175,12 @@ public class XmppConnectionService extends Service {
 
 		@Override
 		public void onStatusChanged(Account account) {
-			Log.d(LOGTAG,account.getJid()+" status switched to " + account.getStatus());
 			if (accountChangedListener != null) {
-				Log.d(LOGTAG,"notifiy ui");
 				accountChangedListener.onAccountListChangedListener();
 			}
+			if (account.getXmppConnection().hasFeatureRosterManagment()) {
+				updateRoster(account, null);
+			}
 			if (account.getStatus() == Account.STATUS_ONLINE) {
 				databaseBackend.clearPresences(account);
 				connectMultiModeConversations(account);
@@ -612,7 +613,12 @@ public class XmppConnectionService extends Service {
 		IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET);
 		Element query = new Element("query");
 		query.setAttribute("xmlns", "jabber:iq:roster");
-		query.setAttribute("ver", account.getRosterVersion());
+		if (!"".equals(account.getRosterVersion())) {
+			Log.d(LOGTAG,account.getJid()+ ": fetching roster version "+account.getRosterVersion());
+			query.setAttribute("ver", account.getRosterVersion());
+		} else {
+			Log.d(LOGTAG,account.getJid()+": fetching roster");
+		}
 		iqPacket.addChild(query);
 		account.getXmppConnection().sendIqPacket(iqPacket,
 				new OnIqPacketReceived() {
@@ -622,6 +628,7 @@ public class XmppConnectionService extends Service {
 							IqPacket packet) {
 						Element roster = packet.findChild("query");
 						if (roster != null) {
+							Log.d(LOGTAG,account.getJid()+": processing roster");
 							processRosterItems(account, roster);
 							StringBuilder mWhere = new StringBuilder();
 							mWhere.append("jid NOT IN(");
@@ -645,6 +652,8 @@ public class XmppConnectionService extends Service {
 										null);
 							}
 
+						} else {
+							Log.d(LOGTAG,account.getJid()+": empty roster returend");
 						}
 						mergePhoneContactsWithRoster(new OnPhoneContactsMerged() {
 

src/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -147,7 +147,12 @@ public class ConversationActivity extends XmppActivity {
 					view = (View) inflater.inflate(
 							R.layout.conversation_list_row, null);
 				}
-				Conversation conv = getItem(position);
+				Conversation conv;
+				if (conversationList.size() > position) {
+					conv = getItem(position);
+				} else {
+					return view;
+				}
 				if (!spl.isSlideable()) {
 					if (conv==getSelectedConversation()) {
 						view.setBackgroundColor(0xffdddddd);
@@ -181,7 +186,7 @@ public class ConversationActivity extends XmppActivity {
 				
 				
 				((ImageView) view.findViewById(R.id.conversation_image))
-						.setImageURI(getItem(position).getProfilePhotoUri());
+						.setImageURI(conv.getProfilePhotoUri());
 				return view;
 			}
 
@@ -417,7 +422,6 @@ public class ConversationActivity extends XmppActivity {
 		xmppConnectionService.setOnConversationListChangedListener(this.onConvChanged);
 		
 		if (conversationList.size()==0) {
-			conversationList.clear();
 			conversationList.addAll(xmppConnectionService
 					.getConversations());
 			
@@ -452,12 +456,9 @@ public class ConversationActivity extends XmppActivity {
 				//find currently loaded fragment
 				ConversationFragment selectedFragment = (ConversationFragment) getFragmentManager().findFragmentByTag("conversation");
 				if (selectedFragment!=null) {
-					Log.d("gultsch","ConversationActivity. found old fragment.");
 					selectedFragment.onBackendConnected();
 				} else {
-					Log.d("gultsch","conversationactivity. no old fragment found. creating new one");
 					selectedConversation = conversationList.get(0);
-					Log.d("gultsch","selected conversation is #"+selectedConversation);
 					swapConversationFragment();
 				}
 			}

src/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -14,13 +14,11 @@ import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.security.cert.CertPathValidatorException;
 import java.security.cert.CertificateException;
-import java.security.cert.CertificateExpiredException;
 import java.security.cert.X509Certificate;
 import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.List;
 
-import javax.net.ssl.ManagerFactoryParameters;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
@@ -55,10 +53,6 @@ public class XmppConnection implements Runnable {
 	private XmlReader tagReader;
 	private TagWriter tagWriter;
 
-	private boolean isTlsEncrypted = false;
-	private boolean isAuthenticated = false;
-	// private boolean shouldUseTLS = false;
-	private boolean shouldConnect = true;
 	private boolean shouldBind = true;
 	private boolean shouldAuthenticate = true;
 	private Element streamFeatures;
@@ -170,9 +164,8 @@ public class XmppConnection implements Runnable {
 			} else if (nextTag.isStart("proceed")) {
 				switchOverToTls(nextTag);
 			} else if (nextTag.isStart("success")) {
-				isAuthenticated = true;
 				Log.d(LOGTAG, account.getJid()
-						+ ": read success tag in stream. reset again");
+						+ ": logged in");
 				tagReader.readTag();
 				tagReader.reset();
 				sendStartStream();
@@ -279,14 +272,12 @@ public class XmppConnection implements Runnable {
 	private void sendStartTLS() {
 		Tag startTLS = Tag.empty("starttls");
 		startTLS.setAttribute("xmlns", "urn:ietf:params:xml:ns:xmpp-tls");
-		Log.d(LOGTAG, account.getJid() + ": sending starttls");
 		tagWriter.writeTag(startTLS);
 	}
 
 	private void switchOverToTls(Tag currentTag) throws XmlPullParserException,
 			IOException {
 		Tag nextTag = tagReader.readTag(); // should be proceed end tag
-		Log.d(LOGTAG, account.getJid() + ": now switch to ssl");
 		try {
 			SSLContext sc = SSLContext.getInstance("TLS");
 			TrustManagerFactory tmf = TrustManagerFactory
@@ -352,11 +343,9 @@ public class XmppConnection implements Runnable {
 						socket.getInetAddress().getHostAddress(), socket.getPort(),
 						true);
 			tagReader.setInputStream(sslSocket.getInputStream());
-			Log.d(LOGTAG, "reset inputstream");
 			tagWriter.setOutputStream(sslSocket.getOutputStream());
-			Log.d(LOGTAG, "switch over seemed to work");
-			isTlsEncrypted = true;
 			sendStartStream();
+			Log.d(LOGTAG,account.getJid()+": TLS connection established");
 			processStream(tagReader.readTag());
 			sslSocket.close();
 		} catch (NoSuchAlgorithmException e1) {
@@ -375,15 +364,12 @@ public class XmppConnection implements Runnable {
 		auth.setAttribute("xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
 		auth.setAttribute("mechanism", "PLAIN");
 		auth.setContent(saslString);
-		Log.d(LOGTAG, account.getJid() + ": sending sasl " + auth.toString());
 		tagWriter.writeElement(auth);
 	}
 
 	private void processStreamFeatures(Tag currentTag)
 			throws XmlPullParserException, IOException {
 		this.streamFeatures = tagReader.readElement(currentTag);
-		Log.d(LOGTAG, account.getJid() + ": process stream features "
-				+ streamFeatures);
 		if (this.streamFeatures.hasChild("starttls")
 				&& account.isOptionSet(Account.OPTION_USETLS)) {
 			sendStartTLS();
@@ -457,7 +443,6 @@ public class XmppConnection implements Runnable {
 	}
 
 	private void sendEnableCarbons() {
-		Log.d(LOGTAG, account.getJid() + ": enable carbons");
 		IqPacket iq = new IqPacket(IqPacket.TYPE_SET);
 		Element enable = new Element("enable");
 		enable.setAttribute("xmlns", "urn:xmpp:carbons:2");
@@ -558,7 +543,14 @@ public class XmppConnection implements Runnable {
 	}
 
 	public void disconnect() {
-		shouldConnect = false;
 		tagWriter.writeTag(Tag.end("stream:stream"));
 	}
+	
+	public boolean hasFeatureRosterManagment() {
+		if (this.streamFeatures==null) {
+			return false;
+		} else {
+			return this.streamFeatures.hasChild("ver");
+		}
+	}
 }