modify otr chat status for already openned chat when the participant goes offline default tip
authorNikita Kozlov <nikita@elyzion.net>
Sat, 05 Nov 2011 22:27:58 +0100
changeset 921 319ce14e4826
parent 920 b659da60d81e
modify otr chat status for already openned chat when the participant goes offline
src/com/beem/project/beem/service/BeemChatManager.java
src/com/beem/project/beem/service/ChatAdapter.java
src/com/beem/project/beem/service/XmppConnectionAdapter.java
src/com/beem/project/beem/ui/ChangeStatus.java
--- a/src/com/beem/project/beem/service/BeemChatManager.java	Wed Aug 24 23:15:26 2011 +0200
+++ b/src/com/beem/project/beem/service/BeemChatManager.java	Sat Nov 05 22:27:58 2011 +0100
@@ -45,13 +45,20 @@
 
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import net.java.otr4j.OtrException;
+
 import org.jivesoftware.smack.Chat;
 import org.jivesoftware.smack.ChatManager;
 import org.jivesoftware.smack.ChatManagerListener;
+import org.jivesoftware.smack.Roster;
+import org.jivesoftware.smack.RosterListener;
+import org.jivesoftware.smack.packet.Presence;
+import org.jivesoftware.smack.util.StringUtils;
 
 import android.app.Notification;
 import android.app.PendingIntent;
@@ -70,6 +77,7 @@
 import com.beem.project.beem.service.aidl.IChatManagerListener;
 import com.beem.project.beem.service.aidl.IMessageListener;
 import com.beem.project.beem.service.aidl.IRoster;
+import com.beem.project.beem.utils.Status;
 
 /**
  * An adapter for smack's ChatManager. This class provides functionnality to handle chats.
@@ -83,15 +91,18 @@
     private final ChatListener mChatListener = new ChatListener();
     private final RemoteCallbackList<IChatManagerListener> mRemoteChatCreationListeners = new RemoteCallbackList<IChatManagerListener>();
     private final BeemService mService;
+    private final ChatRosterListener mChatRosterListn = new ChatRosterListener();
 
     /**
      * Constructor.
      * @param chatManager the smack ChatManager to adapt
      * @param service the service which runs the chat manager
+     * @param roster 
      */
-    public BeemChatManager(final ChatManager chatManager, final BeemService service) {
+    public BeemChatManager(final ChatManager chatManager, final BeemService service, final Roster roster) {
 	mService = service;
 	mAdaptee = chatManager;
+	roster.addRosterListener(mChatRosterListn);
 	mAdaptee.addChatListener(mChatListener);
     }
 
@@ -325,4 +336,36 @@
 
 	}
     }
+
+    private class ChatRosterListener implements RosterListener {
+
+	@Override
+	public void entriesAdded(Collection<String> arg0) {
+	}
+
+	@Override
+	public void entriesDeleted(Collection<String> arg0) {
+	}
+
+	@Override
+	public void entriesUpdated(Collection<String> arg0) {
+	}
+
+	@Override
+	public void presenceChanged(Presence presence) {
+	    String key = StringUtils.parseBareAddress(presence.getFrom());
+	    if (!mChats.containsKey(key)) {
+		return;
+	    }
+
+	    if (Status.getStatusFromPresence(presence) >= Status.CONTACT_STATUS_DISCONNECT) {
+		try {
+		    mChats.get(key).localEndOtrSession();
+		} catch (OtrException e) {
+		    e.printStackTrace();
+		}
+	    }
+	}
+
+    }
 }
--- a/src/com/beem/project/beem/service/ChatAdapter.java	Wed Aug 24 23:15:26 2011 +0200
+++ b/src/com/beem/project/beem/service/ChatAdapter.java	Sat Nov 05 22:27:58 2011 +0100
@@ -486,9 +486,7 @@
 		BeemOtrManager.getInstance().verifyRemoteFingerprint(mOtrSessionId);
 	    else
 		BeemOtrManager.getInstance().unverifyRemoteFingerprint(mOtrSessionId);
-
 	}
-
     }
 
     @Override
--- a/src/com/beem/project/beem/service/XmppConnectionAdapter.java	Wed Aug 24 23:15:26 2011 +0200
+++ b/src/com/beem/project/beem/service/XmppConnectionAdapter.java	Sat Nov 05 22:27:58 2011 +0100
@@ -241,9 +241,9 @@
 	    mAdaptee.login(mLogin, mPassword, mResource);
 	    mUserInfo = new UserInfo(mAdaptee.getUser());
 
-	    mChatManager = new BeemChatManager(mAdaptee.getChatManager(), mService);
+	    mChatManager = new BeemChatManager(mAdaptee.getChatManager(), mService, mAdaptee.getRoster());
 	    //nikita: I commented this line because of the logs provided in http://www.beem-project.com/issues/321
-	    //Also, since the privacylistmanager isn't finished and used, it will be safer to not initialize it
+	    //Also, since the privacylistmanager isn't finished and used, it will be safer to not initialise it
 	    //mPrivacyListManager = new PrivacyListManagerAdapter(PrivacyListManager.getInstanceFor(mAdaptee));
 	    mService.initJingle(mAdaptee);
 	    discoverServerFeatures();
--- a/src/com/beem/project/beem/ui/ChangeStatus.java	Wed Aug 24 23:15:26 2011 +0200
+++ b/src/com/beem/project/beem/ui/ChangeStatus.java	Sat Nov 05 22:27:58 2011 +0100
@@ -270,7 +270,6 @@
 		break;
 	    default:
 		Log.w(TAG, "onActivityResult : invalid request code");
-
 	}
     }