Commit ccccd253 authored by Grigory Fedorov's avatar Grigory Fedorov

extension/muc: light code formatting and refactoring.

parent 743096a8
...@@ -66,10 +66,8 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -66,10 +66,8 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
private final EntityNotificationProvider<RoomAuthorizationError> authorizationErrorProvider; private final EntityNotificationProvider<RoomAuthorizationError> authorizationErrorProvider;
private MUCManager() { private MUCManager() {
inviteProvider = new EntityNotificationProvider<RoomInvite>( inviteProvider = new EntityNotificationProvider<>(R.drawable.ic_stat_add_circle);
R.drawable.ic_stat_add_circle); authorizationErrorProvider = new EntityNotificationProvider<>(R.drawable.ic_stat_error);
authorizationErrorProvider = new EntityNotificationProvider<RoomAuthorizationError>(
R.drawable.ic_stat_error);
} }
public static MUCManager getInstance() { public static MUCManager getInstance() {
...@@ -78,19 +76,18 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -78,19 +76,18 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
@Override @Override
public void onLoad() { public void onLoad() {
final Collection<RoomChat> roomChats = new ArrayList<RoomChat>(); final Collection<RoomChat> roomChats = new ArrayList<>();
final Collection<RoomChat> needJoins = new ArrayList<RoomChat>(); final Collection<RoomChat> needJoins = new ArrayList<>();
Cursor cursor = RoomTable.getInstance().list(); Cursor cursor = RoomTable.getInstance().list();
try { try {
if (cursor.moveToFirst()) { if (cursor.moveToFirst()) {
do { do {
RoomChat roomChat = new RoomChat( RoomChat roomChat = new RoomChat(
RoomTable.getAccount(cursor), RoomTable.getAccount(cursor), RoomTable.getRoom(cursor),
RoomTable.getRoom(cursor), RoomTable.getNickname(cursor), RoomTable.getPassword(cursor));
RoomTable.getNickname(cursor), if (RoomTable.needJoin(cursor)) {
RoomTable.getPassword(cursor));
if (RoomTable.needJoin(cursor))
needJoins.add(roomChat); needJoins.add(roomChat);
}
roomChats.add(roomChat); roomChats.add(roomChat);
} while (cursor.moveToNext()); } while (cursor.moveToNext());
} }
...@@ -105,38 +102,34 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -105,38 +102,34 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
}); });
} }
private void onLoaded(Collection<RoomChat> roomChats, private void onLoaded(Collection<RoomChat> roomChats, Collection<RoomChat> needJoins) {
Collection<RoomChat> needJoins) {
for (RoomChat roomChat : roomChats) { for (RoomChat roomChat : roomChats) {
AbstractChat abstractChat = MessageManager.getInstance().getChat( AbstractChat abstractChat = MessageManager.getInstance().getChat(
roomChat.getAccount(), roomChat.getUser()); roomChat.getAccount(), roomChat.getUser());
if (abstractChat != null) if (abstractChat != null) {
MessageManager.getInstance().removeChat(abstractChat); MessageManager.getInstance().removeChat(abstractChat);
}
MessageManager.getInstance().addChat(roomChat); MessageManager.getInstance().addChat(roomChat);
if (needJoins.contains(roomChat)) if (needJoins.contains(roomChat)) {
roomChat.setState(RoomState.waiting); roomChat.setState(RoomState.waiting);
} }
NotificationManager.getInstance().registerNotificationProvider( }
inviteProvider); NotificationManager.getInstance().registerNotificationProvider(inviteProvider);
NotificationManager.getInstance().registerNotificationProvider( NotificationManager.getInstance().registerNotificationProvider(authorizationErrorProvider);
authorizationErrorProvider);
} }
/** /**
* @param account
* @param room
* @return <code>null</code> if does not exists. * @return <code>null</code> if does not exists.
*/ */
private RoomChat getRoomChat(String account, String room) { private RoomChat getRoomChat(String account, String room) {
AbstractChat chat = MessageManager.getInstance().getChat(account, room); AbstractChat chat = MessageManager.getInstance().getChat(account, room);
if (chat != null && chat instanceof RoomChat) if (chat != null && chat instanceof RoomChat) {
return (RoomChat) chat; return (RoomChat) chat;
}
return null; return null;
} }
/** /**
* @param account
* @param room
* @return Whether there is such room. * @return Whether there is such room.
*/ */
public boolean hasRoom(String account, String room) { public boolean hasRoom(String account, String room) {
...@@ -144,14 +137,13 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -144,14 +137,13 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
} }
/** /**
* @param account
* @param room
* @return nickname or empty string if room does not exists. * @return nickname or empty string if room does not exists.
*/ */
public String getNickname(String account, String room) { public String getNickname(String account, String room) {
RoomChat roomChat = getRoomChat(account, room); RoomChat roomChat = getRoomChat(account, room);
if (roomChat == null) if (roomChat == null) {
return ""; return "";
}
return roomChat.getNickname(); return roomChat.getNickname();
} }
...@@ -162,26 +154,24 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -162,26 +154,24 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
*/ */
public String getPassword(String account, String room) { public String getPassword(String account, String room) {
RoomChat roomChat = getRoomChat(account, room); RoomChat roomChat = getRoomChat(account, room);
if (roomChat == null) if (roomChat == null) {
return ""; return "";
}
return roomChat.getPassword(); return roomChat.getPassword();
} }
/** /**
* @param account
* @param room
* @return list of occupants or empty list. * @return list of occupants or empty list.
*/ */
public Collection<Occupant> getOccupants(String account, String room) { public Collection<Occupant> getOccupants(String account, String room) {
RoomChat roomChat = getRoomChat(account, room); RoomChat roomChat = getRoomChat(account, room);
if (roomChat == null) if (roomChat == null) {
return Collections.emptyList(); return Collections.emptyList();
}
return roomChat.getOccupants(); return roomChat.getOccupants();
} }
/** /**
* @param account
* @param room
* @return <code>null</code> if there is no such invite. * @return <code>null</code> if there is no such invite.
*/ */
public RoomInvite getInvite(String account, String room) { public RoomInvite getInvite(String account, String room) {
...@@ -195,8 +185,9 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -195,8 +185,9 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
public void removeRoom(final String account, final String room) { public void removeRoom(final String account, final String room) {
removeInvite(getInvite(account, room)); removeInvite(getInvite(account, room));
RoomChat roomChat = getRoomChat(account, room); RoomChat roomChat = getRoomChat(account, room);
if (roomChat == null) if (roomChat == null) {
return; return;
}
leaveRoom(account, room); leaveRoom(account, room);
MessageManager.getInstance().removeChat(roomChat); MessageManager.getInstance().removeChat(roomChat);
RosterManager.getInstance().onContactChanged(account, room); RosterManager.getInstance().onContactChanged(account, room);
...@@ -211,10 +202,6 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -211,10 +202,6 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
/** /**
* Creates or updates existed room. * Creates or updates existed room.
* *
* @param account
* @param room
* @param nickname
* @param password
*/ */
public void createRoom(String account, String room, String nickname, public void createRoom(String account, String room, String nickname,
String password, boolean join) { String password, boolean join) {
...@@ -222,8 +209,9 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -222,8 +209,9 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
AbstractChat chat = MessageManager.getInstance().getChat(account, room); AbstractChat chat = MessageManager.getInstance().getChat(account, room);
RoomChat roomChat; RoomChat roomChat;
if (chat == null || !(chat instanceof RoomChat)) { if (chat == null || !(chat instanceof RoomChat)) {
if (chat != null) if (chat != null) {
MessageManager.getInstance().removeChat(chat); MessageManager.getInstance().removeChat(chat);
}
roomChat = new RoomChat(account, room, nickname, password); roomChat = new RoomChat(account, room, nickname, password);
MessageManager.getInstance().addChat(roomChat); MessageManager.getInstance().addChat(roomChat);
} else { } else {
...@@ -232,9 +220,10 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -232,9 +220,10 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
roomChat.setPassword(password); roomChat.setPassword(password);
} }
requestToWriteRoom(account, room, nickname, password, join); requestToWriteRoom(account, room, nickname, password, join);
if (join) if (join) {
joinRoom(account, room, true); joinRoom(account, room, true);
} }
}
private void requestToWriteRoom(final String account, final String room, private void requestToWriteRoom(final String account, final String room,
final String nickname, final String password, final boolean join) { final String nickname, final String password, final boolean join) {
...@@ -248,8 +237,6 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -248,8 +237,6 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
} }
/** /**
* @param account
* @param room
* @return Whether room is disabled. * @return Whether room is disabled.
*/ */
public boolean isDisabled(final String account, final String room) { public boolean isDisabled(final String account, final String room) {
...@@ -258,8 +245,6 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -258,8 +245,6 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
} }
/** /**
* @param account
* @param room
* @return Whether connected is establish or connection is in progress. * @return Whether connected is establish or connection is in progress.
*/ */
public boolean inUse(final String account, final String room) { public boolean inUse(final String account, final String room) {
...@@ -270,12 +255,9 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -270,12 +255,9 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
/** /**
* Requests to join to the room. * Requests to join to the room.
* *
* @param account
* @param room
* @param requested Whether user request to join the room. * @param requested Whether user request to join the room.
*/ */
public void joinRoom(final String account, final String room, public void joinRoom(final String account, final String room, boolean requested) {
boolean requested) {
final XMPPConnection xmppConnection; final XMPPConnection xmppConnection;
final RoomChat roomChat; final RoomChat roomChat;
final String nickname; final String nickname;
...@@ -323,19 +305,21 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -323,19 +305,21 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
@Override @Override
public void run() { public void run() {
try { try {
if (roomChat.getMultiUserChat() != multiUserChat) if (roomChat.getMultiUserChat() != multiUserChat) {
return; return;
}
multiUserChat.join(nickname, password); multiUserChat.join(nickname, password);
Application.getInstance().runOnUiThread(new Runnable() { Application.getInstance().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (roomChat.getMultiUserChat() != multiUserChat) if (roomChat.getMultiUserChat() != multiUserChat) {
return; return;
if (roomChat.getState() == RoomState.joining) }
if (roomChat.getState() == RoomState.joining) {
roomChat.setState(RoomState.occupation); roomChat.setState(RoomState.occupation);
}
removeAuthorizationError(account, room); removeAuthorizationError(account, room);
RosterManager.getInstance().onContactChanged( RosterManager.getInstance().onContactChanged(account, room);
account, room);
} }
}); });
return; return;
...@@ -343,42 +327,35 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -343,42 +327,35 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
Application.getInstance().runOnUiThread(new Runnable() { Application.getInstance().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (roomChat.getMultiUserChat() != multiUserChat) if (roomChat.getMultiUserChat() != multiUserChat) {
return; return;
}
roomChat.setState(RoomState.error); roomChat.setState(RoomState.error);
addAuthorizationError(account, room); addAuthorizationError(account, room);
if (e.getXMPPError() != null if (e.getXMPPError() != null && e.getXMPPError().getCode() == 409) {
&& e.getXMPPError().getCode() == 409) Application.getInstance().onError(R.string.NICK_ALREADY_USED);
Application.getInstance().onError( } else if (e.getXMPPError() != null && e.getXMPPError().getCode() == 401) {
R.string.NICK_ALREADY_USED); Application.getInstance().onError(R.string.AUTHENTICATION_FAILED);
else if (e.getXMPPError() != null } else {
&& e.getXMPPError().getCode() == 401) Application.getInstance().onError(R.string.NOT_CONNECTED);
Application.getInstance().onError( }
R.string.AUTHENTICATION_FAILED); RosterManager.getInstance().onContactChanged(account, room);
else
Application.getInstance().onError(
R.string.NOT_CONNECTED);
RosterManager.getInstance().onContactChanged(
account, room);
} }
}); });
return; return;
} catch (IllegalStateException e) { } catch (IllegalStateException e) {
} catch (RuntimeException e) {
LogManager.exception(this, e);
} catch (Exception e) { } catch (Exception e) {
LogManager.exception(this, e); LogManager.exception(this, e);
} }
Application.getInstance().runOnUiThread(new Runnable() { Application.getInstance().runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (roomChat.getMultiUserChat() != multiUserChat) if (roomChat.getMultiUserChat() != multiUserChat) {
return; return;
}
roomChat.setState(RoomState.waiting); roomChat.setState(RoomState.waiting);
Application.getInstance().onError( Application.getInstance().onError(R.string.NOT_CONNECTED);
R.string.NOT_CONNECTED); RosterManager.getInstance().onContactChanged(account, room);
RosterManager.getInstance().onContactChanged(account,
room);
} }
}); });
} }
...@@ -390,17 +367,16 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -390,17 +367,16 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
public void leaveRoom(String account, String room) { public void leaveRoom(String account, String room) {
final MultiUserChat multiUserChat; final MultiUserChat multiUserChat;
RoomChat roomChat = getRoomChat(account, room); RoomChat roomChat = getRoomChat(account, room);
if (roomChat == null) if (roomChat == null) {
return; return;
}
multiUserChat = roomChat.getMultiUserChat(); multiUserChat = roomChat.getMultiUserChat();
roomChat.setState(RoomState.unavailable); roomChat.setState(RoomState.unavailable);
roomChat.setRequested(false); roomChat.setRequested(false);
roomChat.newAction(roomChat.getNickname(), null, ChatAction.leave); roomChat.newAction(roomChat.getNickname(), null, ChatAction.leave);
requestToWriteRoom(account, room, roomChat.getNickname(), requestToWriteRoom(account, room, roomChat.getNickname(), roomChat.getPassword(), false);
roomChat.getPassword(), false);
if (multiUserChat != null) { if (multiUserChat != null) {
Thread thread = new Thread("Leave to room " + room + " from " Thread thread = new Thread("Leave to room " + room + " from " + account) {
+ account) {
@Override @Override
public void run() { public void run() {
try { try {
...@@ -417,41 +393,39 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -417,41 +393,39 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
} }
@Override @Override
public void onPacket(ConnectionItem connection, String bareAddress, public void onPacket(ConnectionItem connection, String bareAddress, Packet packet) {
Packet packet) { if (!(connection instanceof AccountItem)) {
if (!(connection instanceof AccountItem))
return; return;
}
String account = ((AccountItem) connection).getAccount(); String account = ((AccountItem) connection).getAccount();
if (bareAddress == null || !(packet instanceof Message)) if (bareAddress == null || !(packet instanceof Message)) {
return; return;
}
Message message = (Message) packet; Message message = (Message) packet;
if (message.getType() != Message.Type.normal if (message.getType() != Message.Type.normal && message.getType() != Message.Type.chat) {
&& message.getType() != Message.Type.chat)
return; return;
}
MUCUser mucUser = MUC.getMUCUserExtension(packet); MUCUser mucUser = MUC.getMUCUserExtension(packet);
if (mucUser == null || mucUser.getInvite() == null) if (mucUser == null || mucUser.getInvite() == null) {
return; return;
}
RoomChat roomChat = getRoomChat(account, bareAddress); RoomChat roomChat = getRoomChat(account, bareAddress);
if (roomChat == null || !roomChat.getState().inUse()) { if (roomChat == null || !roomChat.getState().inUse()) {
String inviter = mucUser.getInvite().getFrom(); String inviter = mucUser.getInvite().getFrom();
if (inviter == null) if (inviter == null) {
inviter = bareAddress; inviter = bareAddress;
}
inviteProvider.add(new RoomInvite(account, bareAddress, inviter, inviteProvider.add(new RoomInvite(account, bareAddress, inviter,
mucUser.getInvite().getReason(), mucUser.getPassword()), mucUser.getInvite().getReason(), mucUser.getPassword()), true);
true);
} }
} }
/** /**
* Sends invitation. * Sends invitation.
* *
* @param account
* @param room
* @param user
* @throws NetworkException * @throws NetworkException
*/ */
public void invite(String account, String room, String user) public void invite(String account, String room, String user) throws NetworkException {
throws NetworkException {
RoomChat roomChat = getRoomChat(account, room); RoomChat roomChat = getRoomChat(account, room);
if (roomChat == null || roomChat.getState() != RoomState.available) { if (roomChat == null || roomChat.getState() != RoomState.available) {
Application.getInstance().onError(R.string.NOT_CONNECTED); Application.getInstance().onError(R.string.NOT_CONNECTED);
...@@ -474,8 +448,7 @@ public class MUCManager implements OnLoadListener, OnPacketListener { ...@@ -474,8 +448,7 @@ public class MUCManager implements OnLoadListener, OnPacketListener {
} }
public void addAuthorizationError(String account, String room) { public void addAuthorizationError(String account, String room) {
authorizationErrorProvider.add( authorizationErrorProvider.add(new RoomAuthorizationError(account, room), null);
new RoomAuthorizationError(account, room), null);
} }
} }
...@@ -91,8 +91,9 @@ public class Occupant implements Comparable<Occupant> { ...@@ -91,8 +91,9 @@ public class Occupant implements Comparable<Occupant> {
@Override @Override
public int compareTo(Occupant another) { public int compareTo(Occupant another) {
int result = another.role.ordinal() - role.ordinal(); int result = another.role.ordinal() - role.ordinal();
if (result != 0) if (result != 0) {
return result; return result;
}
return nickname.compareTo(another.nickname); return nickname.compareTo(another.nickname);
} }
......
...@@ -22,8 +22,7 @@ import com.xabber.android.data.entity.BaseEntity; ...@@ -22,8 +22,7 @@ import com.xabber.android.data.entity.BaseEntity;
import com.xabber.android.data.notification.EntityNotificationItem; import com.xabber.android.data.notification.EntityNotificationItem;
import com.xabber.android.ui.ConferenceAdd; import com.xabber.android.ui.ConferenceAdd;
public class RoomAuthorizationError extends BaseEntity implements public class RoomAuthorizationError extends BaseEntity implements EntityNotificationItem {
EntityNotificationItem {
public RoomAuthorizationError(String account, String user) { public RoomAuthorizationError(String account, String user) {
super(account, user); super(account, user);
...@@ -31,8 +30,7 @@ public class RoomAuthorizationError extends BaseEntity implements ...@@ -31,8 +30,7 @@ public class RoomAuthorizationError extends BaseEntity implements
@Override @Override
public Intent getIntent() { public Intent getIntent() {
return ConferenceAdd.createIntent(Application.getInstance(), return ConferenceAdd.createIntent(Application.getInstance(), account, user);
account, user);
} }
@Override @Override
...@@ -42,8 +40,7 @@ public class RoomAuthorizationError extends BaseEntity implements ...@@ -42,8 +40,7 @@ public class RoomAuthorizationError extends BaseEntity implements
@Override @Override
public String getText() { public String getText() {
return Application.getInstance().getString( return Application.getInstance().getString(R.string.AUTHENTICATION_FAILED);
R.string.AUTHENTICATION_FAILED);
} }
} }
...@@ -85,8 +85,8 @@ public class RoomChat extends AbstractChat { ...@@ -85,8 +85,8 @@ public class RoomChat extends AbstractChat {
state = RoomState.unavailable; state = RoomState.unavailable;
subject = ""; subject = "";
multiUserChat = null; multiUserChat = null;
occupants = new HashMap<String, Occupant>(); occupants = new HashMap<>();
invites = new HashMap<String, String>(); invites = new HashMap<>();
} }
@Override @Override
...@@ -138,9 +138,10 @@ public class RoomChat extends AbstractChat { ...@@ -138,9 +138,10 @@ public class RoomChat extends AbstractChat {
occupants.clear(); occupants.clear();
invites.clear(); invites.clear();
} }
if (state == RoomState.available) if (state == RoomState.available) {
sendMessages(); sendMessages();
} }
}
Collection<Occupant> getOccupants() { Collection<Occupant> getOccupants() {
return Collections.unmodifiableCollection(occupants.values()); return Collections.unmodifiableCollection(occupants.values());
...@@ -164,15 +165,12 @@ public class RoomChat extends AbstractChat { ...@@ -164,15 +165,12 @@ public class RoomChat extends AbstractChat {
@Override @Override
protected MessageItem newMessage(String text) { protected MessageItem newMessage(String text) {
return newMessage(nickname, text, null, null, false, false, false, return newMessage(nickname, text, null, null, false, false, false, false, true);
false, true);
} }
@Override @Override
protected boolean canSendMessage() { protected boolean canSendMessage() {
if (super.canSendMessage()) return super.canSendMessage() && state == RoomState.available;
return state == RoomState.available;
return false;
} }
@Override @Override
...@@ -182,8 +180,9 @@ public class RoomChat extends AbstractChat { ...@@ -182,8 +180,9 @@ public class RoomChat extends AbstractChat {
@Override @Override
protected boolean onPacket(String bareAddress, Packet packet) { protected boolean onPacket(String bareAddress, Packet packet) {
if (!super.onPacket(bareAddress, packet)) if (!super.onPacket(bareAddress, packet)) {
return false; return false;
}
final String from = packet.getFrom(); final String from = packet.getFrom();
final String resource = StringUtils.parseResource(from); final String resource = StringUtils.parseResource(from);
if (packet instanceof Message) { if (packet instanceof Message) {
...@@ -197,38 +196,40 @@ public class RoomChat extends AbstractChat { ...@@ -197,38 +196,40 @@ public class RoomChat extends AbstractChat {
} }
MUCUser mucUser = MUC.getMUCUserExtension(packet); MUCUser mucUser = MUC.getMUCUserExtension(packet);
if (mucUser != null && mucUser.getDecline() != null) { if (mucUser != null && mucUser.getDecline() != null) {
onInvitationDeclined(mucUser.getDecline().getFrom(), mucUser onInvitationDeclined(mucUser.getDecline().getFrom(), mucUser.getDecline().getReason());
.getDecline().getReason());
return true; return true;
} }
final String text = message.getBody(); final String text = message.getBody();
final String subject = message.getSubject(); final String subject = message.getSubject();
if (text == null && subject == null) if (text == null && subject == null) {
return true; return true;
if (isSelf(resource)) // Own message }
if (isSelf(resource)) { // Own message
return true; return true;
}
if (subject != null) { if (subject != null) {
if (this.subject.equals(subject)) if (this.subject.equals(subject)) {
return true; return true;
}
this.subject = subject; this.subject = subject;
RosterManager.getInstance().onContactChanged(account, RosterManager.getInstance().onContactChanged(account, bareAddress);
bareAddress);
newAction(resource, subject, ChatAction.subject); newAction(resource, subject, ChatAction.subject);
} else { } else {
String packetID = message.getPacketID(); String packetID = message.getPacketID();
Date delay = Delay.getDelay(message); Date delay = Delay.getDelay(message);
for (MessageItem messageItem : messages) { for (MessageItem messageItem : messages) {
// Search for duplicates // Search for duplicates
if (packetID != null if (packetID != null && packetID.equals(messageItem.getPacketID())) {
&& packetID.equals(messageItem.getPacketID()))
return true; return true;
}
if (delay != null) { if (delay != null) {
if (delay.equals(messageItem.getDelayTimestamp()) if (delay.equals(messageItem.getDelayTimestamp())
&& resource.equals(messageItem.getResource()) && resource.equals(messageItem.getResource())
&& text.equals(messageItem.getText())) && text.equals(messageItem.getText())) {
return true; return true;
} }
} }
}
updateThreadId(message.getThread()); updateThreadId(message.getThread());
MessageItem messageItem = newMessage(resource, text, null, MessageItem messageItem = newMessage(resource, text, null,
delay, true, true, false, false, true); delay, true, true, false, false, true);
...@@ -246,30 +247,24 @@ public class RoomChat extends AbstractChat { ...@@ -246,30 +247,24 @@ public class RoomChat extends AbstractChat {
RosterManager.getInstance().onContactChanged(account, user); RosterManager.getInstance().onContactChanged(account, user);
} else { } else {
boolean changed = false; boolean changed = false;
if (oldOccupant.getAffiliation() != newOccupant if (oldOccupant.getAffiliation() != newOccupant.getAffiliation()) {
.getAffiliation()) {
changed = true; changed = true;
onAffiliationChanged(resource, onAffiliationChanged(resource, newOccupant.getAffiliation());
newOccupant.getAffiliation());
} }
if (oldOccupant.getRole() != newOccupant.getRole()) { if (oldOccupant.getRole() != newOccupant.getRole()) {
changed = true; changed = true;
onRoleChanged(resource, newOccupant.getRole()); onRoleChanged(resource, newOccupant.getRole());
} }
if (oldOccupant.getStatusMode() != newOccupant if (oldOccupant.getStatusMode() != newOccupant.getStatusMode()
.getStatusMode() || !oldOccupant.getStatusText().equals(newOccupant.getStatusText())) {
|| !oldOccupant.getStatusText().equals(
newOccupant.getStatusText())) {
changed = true; changed = true;
onStatusChanged(resource, newOccupant.getStatusMode(), onStatusChanged(resource, newOccupant.getStatusMode(), newOccupant.getStatusText());
newOccupant.getStatusText()); }
if (changed) {
RosterManager.getInstance().onContactChanged(account, user);
} }
if (changed)
RosterManager.getInstance().onContactChanged(account,
user);
} }
} else if (presence.getType() == Presence.Type.unavailable } else if (presence.getType() == Presence.Type.unavailable && state == RoomState.available) {
&& state == RoomState.available) {
occupants.remove(stringPrep); occupants.remove(stringPrep);
MUCUser mucUser = MUC.getMUCUserExtension(presence); MUCUser mucUser = MUC.getMUCUserExtension(presence);
if (mucUser != null && mucUser.getStatus() != null) { if (mucUser != null && mucUser.getStatus() != null) {
...@@ -280,8 +275,9 @@ public class RoomChat extends AbstractChat { ...@@ -280,8 +275,9 @@ public class RoomChat extends AbstractChat {
onBan(resource, mucUser.getItem().getActor()); onBan(resource, mucUser.getItem().getActor());
} else if ("303".equals(code)) { } else if ("303".equals(code)) {
String newNick = mucUser.getItem().getNick(); String newNick = mucUser.getItem().getNick();
if (newNick == null) if (newNick == null) {
return true; return true;
}
onRename(resource, newNick); onRename(resource, newNick);
Occupant occupant = createOccupant(newNick, presence); Occupant occupant = createOccupant(newNick, presence);
occupants.put(Jid.getStringPrep(newNick), occupant); occupants.put(Jid.getStringPrep(newNick), occupant);
...@@ -305,7 +301,6 @@ public class RoomChat extends AbstractChat { ...@@ -305,7 +301,6 @@ public class RoomChat extends AbstractChat {
} }
/** /**
* @param resource
* @return Whether resource is own nickname. * @return Whether resource is own nickname.
*/ */
private boolean isSelf(String resource) { private boolean isSelf(String resource) {
...@@ -314,9 +309,6 @@ public class RoomChat extends AbstractChat { ...@@ -314,9 +309,6 @@ public class RoomChat extends AbstractChat {
/** /**
* Informs that the invitee has declined the invitation. * Informs that the invitee has declined the invitation.
*
* @param from
* @param reason
*/ */
private void onInvitationDeclined(String from, String reason) { private void onInvitationDeclined(String from, String reason) {
// TODO // TODO
...@@ -324,38 +316,35 @@ public class RoomChat extends AbstractChat { ...@@ -324,38 +316,35 @@ public class RoomChat extends AbstractChat {
/** /**
* A occupant becomes available. * A occupant becomes available.
*
* @param resource
*/ */
private void onAvailable(String resource) { private void onAvailable(String resource) {
if (isSelf(resource)) { if (isSelf(resource)) {
setState(RoomState.available); setState(RoomState.available);
if (isRequested()) { if (isRequested()) {
if (showStatusChange()) if (showStatusChange()) {
newMessage( newMessage(resource, Application.getInstance().getString(
resource,
Application.getInstance().getString(
R.string.action_join_complete_to, user), R.string.action_join_complete_to, user),
ChatAction.complete, null, true, true, false, ChatAction.complete, null, true, true, false, false, true);
false, true); }
active = true; active = true;
setRequested(false); setRequested(false);
} else { } else {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, null, ChatAction.complete); newAction(resource, null, ChatAction.complete);
} }
}
} else { } else {
if (state == RoomState.available) if (state == RoomState.available) {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, null, ChatAction.join); newAction(resource, null, ChatAction.join);
} }
} }
}
}
/** /**
* Warning: this method should be placed with packet provider. * Warning: this method should be placed with packet provider.
* *
* @param resource
* @param presence
* @return New occupant based on presence information. * @return New occupant based on presence information.
*/ */
private Occupant createOccupant(String resource, Presence presence) { private Occupant createOccupant(String resource, Presence presence) {
...@@ -382,8 +371,9 @@ public class RoomChat extends AbstractChat { ...@@ -382,8 +371,9 @@ public class RoomChat extends AbstractChat {
statusText = presence.getStatus(); statusText = presence.getStatus();
} }
} }
if (statusText == null) if (statusText == null) {
statusText = ""; statusText = "";
}
occupant.setJid(jid); occupant.setJid(jid);
occupant.setAffiliation(affiliation); occupant.setAffiliation(affiliation);
occupant.setRole(role); occupant.setRole(role);
...@@ -398,18 +388,16 @@ public class RoomChat extends AbstractChat { ...@@ -398,18 +388,16 @@ public class RoomChat extends AbstractChat {
private void onRoleChanged(String resource, Role role) { private void onRoleChanged(String resource, Role role) {
} }
private void onStatusChanged(String resource, StatusMode statusMode, private void onStatusChanged(String resource, StatusMode statusMode, String statusText) {
String statusText) {
} }
/** /**
* A occupant leaves room. * A occupant leaves room.
*
* @param resource
*/ */
private void onLeave(String resource) { private void onLeave(String resource) {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, null, ChatAction.leave); newAction(resource, null, ChatAction.leave);
}
if (isSelf(resource)) { if (isSelf(resource)) {
setState(RoomState.waiting); setState(RoomState.waiting);
RosterManager.getInstance().onContactChanged(account, user); RosterManager.getInstance().onContactChanged(account, user);
...@@ -419,65 +407,66 @@ public class RoomChat extends AbstractChat { ...@@ -419,65 +407,66 @@ public class RoomChat extends AbstractChat {
/** /**
* A occupant was kicked. * A occupant was kicked.
* *
* @param resource
* @param actor
*/ */
private void onKick(String resource, String actor) { private void onKick(String resource, String actor) {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, actor, ChatAction.kick); newAction(resource, actor, ChatAction.kick);
if (isSelf(resource)) }
if (isSelf(resource)) {
MUCManager.getInstance().leaveRoom(account, user); MUCManager.getInstance().leaveRoom(account, user);
} }
}
/** /**
* A occupant was banned. * A occupant was banned.
* *
* @param resource
* @param actor
*/ */
private void onBan(String resource, String actor) { private void onBan(String resource, String actor) {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, actor, ChatAction.ban); newAction(resource, actor, ChatAction.ban);
if (isSelf(resource)) }
if (isSelf(resource)) {
MUCManager.getInstance().leaveRoom(account, user); MUCManager.getInstance().leaveRoom(account, user);
} }
}
/** /**
* A occupant has changed his nickname in the room. * A occupant has changed his nickname in the room.
* *
* @param resource
* @param newNick
*/ */
private void onRename(String resource, String newNick) { private void onRename(String resource, String newNick) {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, newNick, ChatAction.nickname); newAction(resource, newNick, ChatAction.nickname);
} }
}
/** /**
* A user's membership was revoked from the room * A user's membership was revoked from the room
* *
* @param resource
* @param actor
*/ */
private void onRevoke(String resource, String actor) { private void onRevoke(String resource, String actor) {
if (showStatusChange()) if (showStatusChange()) {
newAction(resource, actor, ChatAction.kick); newAction(resource, actor, ChatAction.kick);
if (isSelf(resource)) }
if (isSelf(resource)) {
MUCManager.getInstance().leaveRoom(account, user); MUCManager.getInstance().leaveRoom(account, user);
} }
}
@Override @Override
protected void onComplete() { protected void onComplete() {
super.onComplete(); super.onComplete();
if (getState() == RoomState.waiting) if (getState() == RoomState.waiting) {
MUCManager.getInstance().joinRoom(account, user, false); MUCManager.getInstance().joinRoom(account, user, false);
} }
}
@Override @Override
protected void onDisconnect() { protected void onDisconnect() {
super.onDisconnect(); super.onDisconnect();
if (state != RoomState.unavailable) if (state != RoomState.unavailable) {
setState(RoomState.waiting); setState(RoomState.waiting);
} }
}
} }
\ No newline at end of file
...@@ -46,8 +46,7 @@ public class RoomInvite extends BaseEntity implements EntityNotificationItem { ...@@ -46,8 +46,7 @@ public class RoomInvite extends BaseEntity implements EntityNotificationItem {
*/ */
private final String password; private final String password;
public RoomInvite(String account, String user, String inviter, public RoomInvite(String account, String user, String inviter, String reason, String password) {
String reason, String password) {
super(account, user); super(account, user);
this.inviter = inviter; this.inviter = inviter;
this.reason = reason == null ? "" : reason; this.reason = reason == null ? "" : reason;
...@@ -73,19 +72,18 @@ public class RoomInvite extends BaseEntity implements EntityNotificationItem { ...@@ -73,19 +72,18 @@ public class RoomInvite extends BaseEntity implements EntityNotificationItem {
* @return Text for the confirmation. * @return Text for the confirmation.
*/ */
public String getConfirmation() { public String getConfirmation() {
String accountName = AccountManager.getInstance().getVerboseName( String accountName = AccountManager.getInstance().getVerboseName(account);
account); String inviterName = RosterManager.getInstance().getName(account, inviter);
String inviterName = RosterManager.getInstance().getName(account, if (reason == null || "".equals(reason)) {
inviter);
if (reason == null || "".equals(reason))
return Application.getInstance() return Application.getInstance()
.getString(R.string.muc_invite_confirm, accountName, .getString(R.string.muc_invite_confirm, accountName,
inviterName, user); inviterName, user);
else } else {
return Application.getInstance().getString( return Application.getInstance().getString(
R.string.muc_invite_confirm_reason, accountName, R.string.muc_invite_confirm_reason, accountName,
inviterName, user, reason); inviterName, user, reason);
} }
}
public String getInviter() { public String getInviter() {
return inviter; return inviter;
......
...@@ -62,29 +62,40 @@ public enum RoomState { ...@@ -62,29 +62,40 @@ public enum RoomState {
* @return Status mode used in contact list. * @return Status mode used in contact list.
*/ */
StatusMode toStatusMode() { StatusMode toStatusMode() {
if (this == RoomState.available) switch (this) {
case available:
return StatusMode.available; return StatusMode.available;
else if (this == RoomState.occupation) case occupation:
case joining:
case creating:
case waiting:
return StatusMode.connection; return StatusMode.connection;
else if (this == RoomState.joining) case unavailable:
return StatusMode.connection;
else if (this == RoomState.creating)
return StatusMode.connection;
else if (this == RoomState.unavailable)
return StatusMode.unavailable; return StatusMode.unavailable;
else if (this == RoomState.waiting) case error:
return StatusMode.connection;
else if (this == RoomState.error)
return StatusMode.unsubscribed; return StatusMode.unsubscribed;
else default:
throw new IllegalStateException(); throw new IllegalStateException();
} }
}
/** /**
* @return Connected is establish or connection is in progress. * @return Connected is establish or connection is in progress.
*/ */
boolean inUse() { boolean inUse() {
return this == RoomState.available || this == RoomState.occupation switch (this) {
|| this == RoomState.creating || this == RoomState.joining;
case available:
case occupation:
case joining:
case creating:
return true;
case unavailable:
case waiting:
case error:
default:
return false;
}
} }
} }
...@@ -56,9 +56,8 @@ class RoomTable extends AbstractAccountTable { ...@@ -56,9 +56,8 @@ class RoomTable extends AbstractAccountTable {
} }
private static final String NAME = "rooms"; private static final String NAME = "rooms";
private static final String[] PROJECTION = new String[]{Fields._ID, private static final String[] PROJECTION = new String[]{ Fields._ID,
Fields.ACCOUNT, Fields.ROOM, Fields.NICKNAME, Fields.PASSWORD, Fields.ACCOUNT, Fields.ROOM, Fields.NICKNAME, Fields.PASSWORD, Fields.NEED_JOIN };
Fields.NEED_JOIN,};
private final DatabaseManager databaseManager; private final DatabaseManager databaseManager;
private SQLiteStatement writeStatement; private SQLiteStatement writeStatement;
...@@ -123,20 +122,12 @@ class RoomTable extends AbstractAccountTable { ...@@ -123,20 +122,12 @@ class RoomTable extends AbstractAccountTable {
/** /**
* Adds or updates room. * Adds or updates room.
*
* @param account
* @param room
* @param nickname
* @param password
* @param join
*/ */
void write(String account, String room, String nickname, String password, void write(String account, String room, String nickname, String password, boolean join) {
boolean join) {
synchronized (writeLock) { synchronized (writeLock) {
if (writeStatement == null) { if (writeStatement == null) {
SQLiteDatabase db = databaseManager.getWritableDatabase(); SQLiteDatabase db = databaseManager.getWritableDatabase();
writeStatement = db writeStatement = db.compileStatement("INSERT OR REPLACE INTO " + NAME
.compileStatement("INSERT OR REPLACE INTO " + NAME
+ " (" + Fields.ACCOUNT + ", " + Fields.ROOM + " (" + Fields.ACCOUNT + ", " + Fields.ROOM
+ ", " + Fields.NICKNAME + ", " + ", " + Fields.NICKNAME + ", "
+ Fields.PASSWORD + ", " + Fields.NEED_JOIN + Fields.PASSWORD + ", " + Fields.NEED_JOIN
...@@ -153,14 +144,10 @@ class RoomTable extends AbstractAccountTable { ...@@ -153,14 +144,10 @@ class RoomTable extends AbstractAccountTable {
/** /**
* Removes room. * Removes room.
*
* @param account
* @param room
*/ */
void remove(String account, String room) { void remove(String account, String room) {
SQLiteDatabase db = databaseManager.getWritableDatabase(); SQLiteDatabase db = databaseManager.getWritableDatabase();
db.delete(NAME, Fields.ACCOUNT + " = ? AND " + Fields.ROOM + " = ?", db.delete(NAME, Fields.ACCOUNT + " = ? AND " + Fields.ROOM + " = ?", new String[]{account, room});
new String[]{account, room});
} }
@Override @Override
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment