How To Know Typing Status In Xmpp Openfire Using Smack
Solution 1:
To enable ChatStateListener
you need to create a custom MessageListener
Class
publicclassMessageListenerImplimplementsMessageListener,ChatStateListener {
@OverridepublicvoidprocessMessage(Chat arg0, Message arg1) {
System.out.println("Received message: " + arg1);
}
@OverridepublicvoidstateChanged(Chat arg0, ChatState arg1) {
if (ChatState.composing.equals(arg1)) {
Log.d("Chat State",arg0.getParticipant() + " is typing..");
} elseif (ChatState.gone.equals(arg1)) {
Log.d("Chat State",arg0.getParticipant() + " has left the conversation.");
} else {
Log.d("Chat State",arg0.getParticipant() + ": " + arg1.name());
}
}
}
Then you create MessageListener
object
MessageListenermessageListener=newMessageListenerImpl();
And then pass this in the create chat method
ChatnewChat= chatmanager.createChat(jabber_id_of_friend, messageListener);
what is difference between Smack and asmack? <-- Check This
Solution 2:
finally I got the solution. I need to use chat listener along with chat manager and also I need to use in built sendcomposingnotification function. No need to use Messageeventrequestlistener interface or any other custom class for this. I added the following lines,,
connection.getChatManager().addChatListener(newChatManagerListener() {
@OverridepublicvoidchatCreated(final Chat arg0, finalboolean arg1) {
// TODO Auto-generated method stub
arg0.addMessageListener(newMessageListener()
{
@OverridepublicvoidprocessMessage(Chat arg0, Message arg1)
{
// TODO Auto-generated method stub
Log.d("TYpe Stat",title[0] + " is typing......");
Toast.makeText(getApplicationContext(),title[0] + " is typing......",Toast.LENGTH_SHORT).show();
}
}
});
}
});
and also need to send notification like this..
mem.sendComposingNotification(etRecipient.getText().toString(), message.getPacketID());
System.out.println("Sending notification");
where mem is type of MessageEventManger. Ref: http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/MessageEventManager.html
Solution 3:
ChatManager chatManager = ChatManager.getInstanceFor(connection);
Chat chat= chatManager.createChat(to, newChatStateListener() {
@OverridepublicvoidstateChanged(Chat chat, ChatState state) {
switch (state){
caseactive:
Log.d("state","active");
break;
casecomposing:
Log.d("state","composing");
break;
casepaused:
Log.d("state","paused");
break;
caseinactive:
Log.d("state","inactive");
break;
casegone:
Log.d("state","gone");
break;
}
}
@OverridepublicvoidprocessMessage(Chat chat, Message message) {
Log.d("processMessage","processMessage");
}
});
use this code.hope so will work
Solution 4:
i am using chat state listener :
Chatchat= chatManager.createChat(jid,
newChatStateChangedListener());
bind the chatstatelistener with each jid like above , then :
publicclassChatStateChangedListenerimplementsChatStateListener {
publicChatStateChangedListener() {
printLog("Chat State Changed Listner Constructor");
}
@OverridepublicvoidprocessMessage(Chat arg0, Message arg1) {
}
@OverridepublicvoidstateChanged(Chat chat, ChatState state) {
if (state.toString().equals(ChatState.composing.toString())) {
tvLastSeen.setText("Typing...");
} elseif (state.toString().equals(ChatState.paused.toString())) {
tvLastSeen.setText("paused...");
} else {
tvLastSeen.setText("nothing");
}
}
}
}
Solution 5:
Create On Class MMessageListener to listen incoming messages
private class MMessageListener implements MessageListener, ChatStateListener {
publicMMessageListener(Context contxt) {
}
@OverridepublicvoidstateChanged(Chat chat, ChatState chatState) {
mStatus = "Online";
if (ChatState.composing.equals(chatState)) {
mStatus = chat.getParticipant() + " is typing..";
Log.d("Chat State", chat.getParticipant() + " is typing..");
} elseif (ChatState.gone.equals(chatState)) {
Log.d("Chat State", chat.getParticipant() + " has left the conversation.");
mStatus = chat.getParticipant() + " has left the conversation.";
} elseif (ChatState.paused.equals(chatState)){
Log.d("Chat State", chat.getParticipant() + ": " + chatState.name());
mStatus = "Paused";
}elseif (ChatState.active.equals(chatState)){
mStatus = "Online";
}
// do whatever you want to do once you receive status
}
@OverridepublicvoidprocessMessage(Message message) {
}
@OverridepublicvoidprocessMessage(Chat chat, Message message) {
}
}
Add Listener to your chat object
Chat Mychat = ChatManager.getInstanceFor(connection).createChat( "user2@localhost"), mMessageListener);
Send status to receiving user on edittext text change
ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing, Mychat);
This works fine for me.
Post a Comment for "How To Know Typing Status In Xmpp Openfire Using Smack"