Hello,
I recently began trying to use the new ChatState system in Smack 3.0.2 and have run into the following exception:
java.lang.NullPointerException: null values not allowed
at org.jivesoftware.smack.util.collections.AbstractReferenceMap.put(AbstractRefere nceMap.java:252)
at org.jivesoftware.smackx.ChatStateManager.updateChatState(ChatStateManager.java: 122)
at org.jivesoftware.smackx.ChatStateManager.access$300(ChatStateManager.java:45)
at org.jivesoftware.smackx.ChatStateManager$OutgoingMessageInterceptor.interceptPa cket(ChatStateManager.java:144)
at org.jivesoftware.smack.ChatManager.sendMessage(ChatManager.java:228)
at org.jivesoftware.smack.Chat.sendMessage(Chat.java:113)
After looking at the code, I believe to fix the null pointer line 122 of ChatStateManager should be this:
chatStates.put(chat, newState);
instead of this:
chatStates.put(chat, lastChatState);
Thanks,
Chris
I am about to check in this fix:
SMACK-229
Thanks!
Alex
Hi Alex,
Thanks for checking in the fix. Since my original post I now have a working example of using your chat state system (I like it a lot more than message events). One other stumbling block I ran into for a while was that I didn’'t initially realize you need to call ChatStateManager.getInstance() right after the connection was created in order to receive all the typing notifications I was expecting. I originally only made that call when I needed to send typing notifications because I assumed it registered listeners at startup behind the scenes. I eventually figured it out after some debugging, but a more clear statement about it in the Javadoc would be nice for future developers.
Thanks,
Chris
Thanks, for the idea! I added the note to the JavaDoc, though longer term I would like a better way to handle this automatically.
I would like it so that you will only advertise that you support ChatStates on a chat if you have a listener on the chat listening for the update.
Cheers,
Alex
Alex,
It seems the fix you checked in does not actually fix my problem. The use case is as follows:
1.) User A sends a message for the first time to user B.
2.) User B starts typing a reply for the first time and therefore sends a chat state.
3.) The exception is thrown.
The original fix I posted works for me, please see lines 146-150 of ChatStateManager:
ChatState lastChatState = chatStates.get(chat);
if (lastChatState == null || lastChatState != newState) {
chatStates.put(chat, lastChatState);
return true;
}
You see that the first time a chat state is ever sent for a chat, lastChatState will be null. Since the chatStates variable can never have null values, I don’'t think you would ever want to check that lastChatState == null and then go ahead and try to put into the map.
Chris
Chris,
My apologies, I missed the fix. I have been working on some test cases for it so I am sorry you are a bit of a guinea pig. Anyways I checked in again and it should work as expected.
Thanks,
Alex
No worries Alex :). I just grabbed your latest patch and it seems to be working fine now.
Thanks for your support,
Chris