package com.xabber.android.data.connection;
import com.xabber.android.data.Application;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.connection.listeners.OnConnectedListener;
import com.xabber.android.data.connection.listeners.OnDisconnectListener;
import com.xabber.android.data.extension.blocking.BlockingManager;
import com.xabber.android.data.extension.carbons.CarbonManager;
import com.xabber.android.data.extension.httpfileupload.HttpFileUploadManager;
import com.xabber.android.data.extension.mam.MamManager;
import com.xabber.android.data.log.LogManager;
import com.xabber.android.data.roster.PresenceManager;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.sasl.SASLErrorException;
class ConnectionListener implements org.jivesoftware.smack.ConnectionListener {
@SuppressWarnings("WeakerAccess")
ConnectionItem connectionItem;
ConnectionListener(ConnectionItem connectionItem) {
this.connectionItem = connectionItem;
}
private String getLogTag() {
StringBuilder logTag = new StringBuilder();
logTag.append(getClass().getSimpleName());
if (connectionItem != null) {
logTag.append(": ");
logTag.append(connectionItem.getAccount());
}
return logTag.toString();
}
@Override
public void connected(XMPPConnection connection) {
LogManager.i(getLogTag(), "connected");
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
connectionItem.updateState(ConnectionState.authentication);
for (OnConnectedListener listener : Application.getInstance().getManagers(OnConnectedListener.class)) {
listener.onConnected(connectionItem);
}
}
});
}
@Override
public void authenticated(XMPPConnection connection, final boolean resumed) {
LogManager.i(getLogTag(), "authenticated. resumed: " + resumed);
connectionItem.updateState(ConnectionState.connected);
// just to see the order of call
CarbonManager.getInstance().onAuthorized(connectionItem);
MamManager.getInstance().onAuthorized(connectionItem);
BlockingManager.getInstance().onAuthorized(connectionItem);
HttpFileUploadManager.getInstance().onAuthorized(connectionItem);
PresenceManager.getInstance().onAuthorized(connectionItem);
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
AccountManager.getInstance().removeAccountError(connectionItem.getAccount());
}
});
}
@Override
public void connectionClosed() {
LogManager.i(getLogTag(), "connectionClosed");
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
connectionItem.updateState(ConnectionState.offline);
for (OnDisconnectListener listener
: Application.getInstance().getManagers(OnDisconnectListener.class)) {
listener.onDisconnect(connectionItem);
}
}
});
}
// going to reconnect with Smack Reconnection manager
@Override
public void connectionClosedOnError(final Exception e) {
LogManager.i(getLogTag(), "connectionClosedOnError " + e + " " + e.getMessage());
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
connectionItem.updateState(ConnectionState.waiting);
if (e instanceof SASLErrorException) {
AccountManager.getInstance().setEnabled(connectionItem.getAccount(), false);
}
}
});
}
@Override
public void reconnectionSuccessful() {
LogManager.i(getLogTag(), "reconnectionSuccessful");
}
@Override
public void reconnectingIn(final int seconds) {
LogManager.i(getLogTag(), "reconnectionSuccessful");
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
if (connectionItem.getState() != ConnectionState.waiting && !connectionItem.getConnection().isAuthenticated()
&& !connectionItem.getConnection().isConnected()) {
connectionItem.updateState(ConnectionState.waiting);
}
}
});
}
@Override
public void reconnectionFailed(final Exception e) {
LogManager.i(getLogTag(), "reconnectionFailed " + e + " " + e.getMessage());
Application.getInstance().runOnUiThread(new Runnable() {
@Override
public void run() {
connectionItem.updateState(ConnectionState.offline);
}
});
}
}