0
votes

I am creating an android chat application using xmpp smack library.I have create a background service to listen to incoming chats and use an application class to initialize the xmpp connection object. The problem is the chatCreated function of chat listener is called twice therefore duplicate message is shown.. This is my application class where i have created connection

Authenticate.java

public class Authenticate extends Application {

    private static final String DOMAIN = StaticVariables.chatServer;
    private static final String HOST = StaticVariables.chatServer;
    private static final int PORT = 5222;
    static AbstractXMPPConnection connection ;
    String username,password;
    private boolean connected;

    @Override
    public void onCreate() {
        super.onCreate();

    }

    public AbstractXMPPConnection initializeXMPPTCPConnection(String username,String password) {
        Log.e("APPLICATION", "username: "+username);
        Log.e("APPLICATION", "password: "+password);
        Log.i("APPLCATION", "initializeXMPPTCPConnection calle:");
        this.username=username;
        this.password=password;
        XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder();
        configBuilder.setUsernameAndPassword(username, password);
        configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
        configBuilder.setResource("Android");
        configBuilder.setServiceName(DOMAIN);
        configBuilder.setHost(HOST);
        configBuilder.setPort(PORT);
        configBuilder.setDebuggerEnabled(true);
        connection = new XMPPTCPConnection(configBuilder.build());
        connection=connectConnection();
        Log.e("APPLICATION", "initializeXMPPTCPConnection: "+connection.isConnected());
        return connection;
    }

    public AbstractXMPPConnection getConnection(){
        return connection;
    }

    public AbstractXMPPConnection connectConnection()
    {
        AsyncTask<Void, Void, AbstractXMPPConnection> connectionThread = new AsyncTask<Void, Void, AbstractXMPPConnection>() {

            @Override
            protected AbstractXMPPConnection doInBackground(Void... arg0) {

                // Create a connection
                try {
                    connection.connect().login();
                    Log.e("Application", "doInBackground: "+connection.isConnected());
                    //login();
                    connected = true;
                    //sendMsg();

                } catch (IOException e) {
                    e.printStackTrace();
                } catch (SmackException e) {
                    e.printStackTrace();
                } catch (XMPPException e) {
                    e.printStackTrace();
                }

                return connection;
            }

            @Override
            protected void onPostExecute(AbstractXMPPConnection connection2) {
                super.onPostExecute(connection2);
//                sendMsg(message.getText().toString());
                Log.e("APPLICATION", "onPostExecute: "+connection2.isConnected());
                connection=connection2;
            }
        };
        try {
            connection=connectionThread.execute().get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        Log.e("Application", "connectConnection: "+connection.isConnected());
        return connection;
    }

    public void login() {

        try {
            connection.login(username, password);
            Log.e("APPLICATIPN", "Yey! We're connected to the Xmpp server!");

        } catch (XMPPException | SmackException | IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
        }

    }



}

This is the code through which i am calling connection instance

connection=((Authenticate)getApplication()).getConnection();

Listener function

public void listenChat(String name){
            ChatManager manager = ChatManager.getInstanceFor(connection);
            manager.addChatListener(new ChatManagerListener() {

                @Override
                public void chatCreated(final Chat chat, boolean createdLocally) {
                    System.out.println("Created chat");
                    chat.addMessageListener(new ChatMessageListener() {

                        @Override
                        public void processMessage(final Chat chat, final org.jivesoftware.smack.packet.Message message) {
//This is called twice

                            }
                        }
                    });

                }
            });
        }

I am a beginner in android and as well in xmpp.Please tell me where i am wrong how can i resolve it

1
just a suggestion, don't put your main login in application class. create a separate singleton. and where is your connectConnection,listenChat and initializeXMPPConnection is getting called?Farhan
make sure that how many times called listenChat() this method, I think it's called two times so...Rakesh Kalashetti

1 Answers

0
votes

You have to fix createdLocally usage in chatCreated method.

Just add the listener if is not createdLocally like this:

public void chatCreated(Chat chat, boolean createdLocally)
            {
                if (!createdLocally)
                {
                    chat.addMessageListener(new ChatMessageListener()...);
                }
            }