public void leaveRoom(String account, String room) { final MultiUserChat multiUserChat; RoomChat roomChat = getRoomChat(account, room); if (roomChat == null) return; multiUserChat = roomChat.getMultiUserChat(); roomChat.setState(RoomState.unavailable); roomChat.setRequested(false); roomChat.newAction(roomChat.getNickname(), null, ChatAction.leave); requestToWriteRoom(account, room, roomChat.getNickname(), roomChat.getPassword(), false); if (multiUserChat != null) { Thread thread = new Thread("Leave to room " + room + " from " + account) { @Override public void run() { try { multiUserChat.leave(); } catch (IllegalStateException e) { // Do nothing } } }; thread.setDaemon(true); thread.start(); } RosterManager.getInstance().onContactChanged(account, room); }
/** * Sends invitation. * * @param account * @param room * @param user * @throws NetworkException */ public void invite(String account, String room, String user) throws NetworkException { RoomChat roomChat = getRoomChat(account, room); if (roomChat == null || roomChat.getState() != RoomState.available) { Application.getInstance().onError(R.string.NOT_CONNECTED); return; } Message message = new Message(room); MUCUser mucUser = new MUCUser(); MUCUser.Invite invite = new MUCUser.Invite(); invite.setTo(user); invite.setReason(""); mucUser.setInvite(invite); message.addExtension(mucUser); ConnectionManager.getInstance().sendPacket(account, message); roomChat.putInvite(message.getPacketID(), user); roomChat.newAction(roomChat.getNickname(), user, ChatAction.invite_sent); }
/** * Requests to join to the room. * * @param account * @param room * @param requested Whether user request to join the room. */ public void joinRoom(final String account, final String room, boolean requested) { final Connection xmppConnection; final RoomChat roomChat; final String nickname; final String password; final Thread thread; roomChat = getRoomChat(account, room); if (roomChat == null) { Application.getInstance().onError(R.string.ENTRY_IS_NOT_FOUND); return; } RoomState state = roomChat.getState(); if (state == RoomState.available || state == RoomState.occupation) { Application.getInstance().onError(R.string.ALREADY_JOINED); return; } if (state == RoomState.creating || state == RoomState.joining) { Application.getInstance().onError(R.string.ALREADY_IN_PROGRESS); return; } nickname = roomChat.getNickname(); password = roomChat.getPassword(); requestToWriteRoom(account, room, nickname, password, true); ConnectionThread connectionThread = AccountManager.getInstance().getAccount(account).getConnectionThread(); if (connectionThread == null) { Application.getInstance().onError(R.string.NOT_CONNECTED); return; } xmppConnection = connectionThread.getXMPPConnection(); if (xmppConnection == null) { Application.getInstance().onError(R.string.NOT_CONNECTED); return; } final MultiUserChat multiUserChat; try { multiUserChat = new MultiUserChat(xmppConnection, room); } catch (IllegalStateException e) { Application.getInstance().onError(R.string.NOT_CONNECTED); return; } roomChat.setState(RoomState.joining); roomChat.setMultiUserChat(multiUserChat); roomChat.setRequested(requested); thread = new Thread("Join to room " + room + " from " + account) { @Override public void run() { try { if (roomChat.getMultiUserChat() != multiUserChat) return; multiUserChat.join(nickname, password); Application.getInstance() .runOnUiThread( new Runnable() { @Override public void run() { if (roomChat.getMultiUserChat() != multiUserChat) return; if (roomChat.getState() == RoomState.joining) roomChat.setState(RoomState.occupation); removeAuthorizationError(account, room); RosterManager.getInstance().onContactChanged(account, room); } }); return; } catch (final XMPPException e) { Application.getInstance() .runOnUiThread( new Runnable() { @Override public void run() { if (roomChat.getMultiUserChat() != multiUserChat) return; roomChat.setState(RoomState.error); addAuthorizationError(account, room); if (e.getXMPPError() != null && e.getXMPPError().getCode() == 409) Application.getInstance().onError(R.string.NICK_ALREADY_USED); else if (e.getXMPPError() != null && e.getXMPPError().getCode() == 401) Application.getInstance().onError(R.string.AUTHENTICATION_FAILED); else Application.getInstance().onError(R.string.NOT_CONNECTED); RosterManager.getInstance().onContactChanged(account, room); } }); return; } catch (IllegalStateException e) { } catch (RuntimeException e) { LogManager.exception(this, e); } catch (Exception e) { LogManager.exception(this, e); } Application.getInstance() .runOnUiThread( new Runnable() { @Override public void run() { if (roomChat.getMultiUserChat() != multiUserChat) return; roomChat.setState(RoomState.waiting); Application.getInstance().onError(R.string.NOT_CONNECTED); RosterManager.getInstance().onContactChanged(account, room); } }); } }; thread.setDaemon(true); thread.start(); }
/** * @param account * @param room * @return nickname or empty string if room does not exists. */ public String getNickname(String account, String room) { RoomChat roomChat = getRoomChat(account, room); if (roomChat == null) return ""; return roomChat.getNickname(); }