Search code examples
javaandroidsmackmultiuserchatuser-presence

smack presence listener in multi user chat


smack presence listener in multi user chat not getting called. Used Smack Api to login and then added roster.addRosterListener(mRoasterListener); but could not get any success to listen when presence of other user of the chat room changes. I tried following code to get the presence listener to work :

connection.login(loginUser, passwordUser);

MultiUserChatManager manager = 

MultiUserChatManager.getInstanceFor(connection);

muc = manager.getMultiUserChat(roomID + "@" +context.getString(R.string.group_chat_id));

Log.d("Join User: ", "Already Created");

muc.join(Utilities.getUserPhoneNo(context));

muc.addMessageListener(mGroupMessageListener);

Roster roster = Roster.getInstanceFor(connection);//luna

roster.addRosterListener(mRoasterListener);//roasterListener

Log.d("Joined User Phone: ", " " + Utilities.getUserPhoneNo(context));

and this class to listen for presence change...

public class RoasterListener implements RosterListener{
        public RoasterListener(Context context){

        }

        @Override
        public void entriesAdded(Collection<String> collection) {

        }

        @Override
        public void entriesUpdated(Collection<String> collection) {

        }

        @Override
        public void entriesDeleted(Collection<String> collection) {

        }

        @Override
        public void presenceChanged(Presence presence) {
            System.out.println("Presence changed: " + presence.getFrom() + " " + presence);
        }
    }

I tried many links available by stackoverflow but could not get any success. Please Help!


Solution

  • For Multi User Chat you don't have to use Roster, because it's normal to meet people you don't have in Roster.

    To know who is in a muc, first ask for occupants:

    muc.join(user,password);
    
    List<String> occupantsAtJoinTime = muc.getOccupants();
    
                        for (String occupant : occupantsAtJoinTime)
                        {
                            System.out.println("occupant: "+occupant);
                            //actions
                        }
    

    then, to keep Occupants list updated, register a DefaultParticipantStatusListener to your muc and define that Listner:

    muc.addParticipantStatusListener(new CustomParticipantStatusListner());
    

    definied as (there are many methods to implement if you need):

        public class CustomParticipantStatusListner extends DefaultParticipantStatusListener 
        {
    
            public void joined(String participant) 
            {
                System.out.println(participant + "just joined MUC");
    //actions (add occupantsRightNow)
            }
    
            public void left(String participant)
            {
                System.out.println(participant + " just left MUC");
    //actions (remove occupantsRightNow)
            }
        }
    

    All this with smack 4.1.7