public void interceptPacket(Packet packet) {
   Message message = (Message) packet;
   Chat chat = connection.getChatManager().getThreadChat(message.getThread());
   if (chat == null) {
     return;
   }
   if (updateChatState(chat, ChatState.active)) {
     message.addExtension(new ChatStateExtension(ChatState.active));
   }
 }
  /**
   * Sets the current state of the provided chat. This method will send an empty bodied Message
   * packet with the state attached as a {@link z.org.jivesoftware.smack.packet.PacketExtension}, if
   * and only if the new chat state is different than the last state.
   *
   * @param newState the new state of the chat
   * @param chat the chat.
   * @throws z.org.jivesoftware.smack.XMPPException when there is an error sending the message
   *     packet.
   */
  public void setCurrentState(ChatState newState, Chat chat) throws XMPPException {
    if (chat == null || newState == null) {
      throw new IllegalArgumentException("Arguments cannot be null.");
    }
    if (!updateChatState(chat, newState)) {
      return;
    }
    Message message = new Message();
    ChatStateExtension extension = new ChatStateExtension(newState);
    message.addExtension(extension);

    chat.sendMessage(message);
  }
    public void processMessage(Chat chat, Message message) {
      PacketExtension extension = message.getExtension("http://jabber.org/protocol/chatstates");
      if (extension == null) {
        return;
      }

      ChatState state;
      try {
        state = ChatState.valueOf(extension.getElementName());
      } catch (Exception ex) {
        return;
      }

      fireNewChatState(chat, state);
    }