Skip to content Skip to sidebar Skip to footer

How To Know Typing Status In Xmpp Openfire Using Smack

I am developing chat application by using Openfire XMPP server. I can text chat between two user. But i want to know Typing status when some one is typing message. So i created a c

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"