@Override
  public void connectionLost(Throwable reason) {

    Log.d(TAG, "Connection Lost");

    SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss");

    if (isConnecting || isStopping) {
      return;
    }

    if (!isOnline()) {
      stopReconnect(df);
      return;
    }

    if (reason != null) {
      if (reason.getMessage().contains("There was a problem during connect")) {
        Log.e(TAG, "connection lost", reason);
        return;
      } else if (reason.getMessage().contains("Closed due to user request")) {
        Log.e(TAG, "connection lost", reason);
        return;
      } else if (reason.getMessage().contains("The connect timeout expired")) {
        stopReconnect(df);
        return;
      }
      Log.e(TAG, "connection lost: " + reason.getMessage());
    } else {
      stopReconnect(df);
      return;
    }

    if (profile.isAutoReconnect() && connected) {

      for (int reconNum = 1; reconNum <= RECONNECT_TRIES; reconNum++) {

        Log.d(TAG, "Reconnect tries: " + reconNum);

        onDisconnect();

        if (!connect()) {

          try {
            Thread.sleep(2000 * reconNum);
          } catch (Exception ignore) {
            // Nothing
          }

          continue;
        }

        notifyAlert(
            getString(R.string.reconnect_success) + " " + df.format(new Date()),
            getString(R.string.reconnect_success));
        return;
      }
    }

    stopReconnect(df);
  }