Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ref: Simplify ChatRoomImpl, remove ChatRoomRoleAndPresence.' #753

Merged
merged 10 commits into from Jun 23, 2021
Expand Up @@ -276,7 +276,7 @@ void processPresence(Presence presence)
boolean[] startMuted = { ext.getAudioMuted(), ext.getVideoMuted() };

// XXX Is this intended to be allowed for moderators or not?
if (getRole().hasAdministratorRights())
if (MemberRoleKt.hasAdministratorRights(getRole()))
{
chatRoom.setStartMuted(startMuted);
}
Expand Down
33 changes: 0 additions & 33 deletions src/main/java/org/jitsi/impl/protocol/xmpp/ChatRoom.java
Expand Up @@ -68,39 +68,6 @@ void join()
*/
MemberRole getUserRole();

/**
* Adds a listener that will be notified of changes in our participation in
* the room such as us being kicked, join, left...
*
* @param listener a member participation listener.
*/
void addMemberPresenceListener(ChatRoomMemberPresenceListener listener);

/**
* Removes a listener that was being notified of changes in the
* participation of other chat room participants such as users being kicked,
* join, left.
*
* @param listener a member participation listener.
*/
void removeMemberPresenceListener(ChatRoomMemberPresenceListener listener);

/**
* Adds a listener that will be notified of changes in our role in the room
* such as us being granded operator.
*
* @param listener a local user role listener.
*/
void addLocalUserRoleListener(ChatRoomLocalUserRoleListener listener);

/**
* Removes a listener that was being notified of changes in our role in this
* chat room such as us being granded operator.
*
* @param listener a local user role listener.
*/
void removeLocalUserRoleListener(ChatRoomLocalUserRoleListener listener);

/**
* Returns a <tt>List</tt> of <tt>ChatRoomMember</tt>s corresponding to all
* members currently participating in this room.
Expand Down
177 changes: 20 additions & 157 deletions src/main/java/org/jitsi/impl/protocol/xmpp/ChatRoomImpl.java
Expand Up @@ -39,8 +39,6 @@
import java.util.concurrent.*;
import java.util.function.*;

import static org.jitsi.impl.protocol.xmpp.ChatRoomMemberPresenceChangeEvent.*;

/**
* Stripped implementation of <tt>ChatRoom</tt> using Smack library.
*
Expand All @@ -54,12 +52,6 @@ public class ChatRoomImpl
*/
private final Logger logger;

/**
* Constant used to return empty presence list from
* {@link #getPresenceExtensions()} in case there's no presence available.
*/
private final static Collection<ExtensionElement> EMPTY_PRESENCE_LIST = Collections.emptyList();

/**
* Parent MUC operation set.
*/
Expand Down Expand Up @@ -100,17 +92,6 @@ public class ChatRoomImpl
*/
private final Consumer<ChatRoomImpl> leaveCallback;

/**
* Member presence listeners.
*/
private final CopyOnWriteArrayList<ChatRoomMemberPresenceListener> listeners = new CopyOnWriteArrayList<>();

/**
* Local user role listeners.
*/
private final CopyOnWriteArrayList<ChatRoomLocalUserRoleListener> localUserRoleListeners
= new CopyOnWriteArrayList<>();

private final Map<EntityFullJid, ChatMemberImpl> members = new HashMap<>();

/**
Expand All @@ -135,7 +116,7 @@ public class ChatRoomImpl

private Map<String, List<String>> whitelists = new HashMap<>();

private List<ChatRoomListener> chatRoomListeners = new CopyOnWriteArrayList<>();
private final List<ChatRoomListener> chatRoomListeners = new CopyOnWriteArrayList<>();

/**
* Creates new instance of <tt>ChatRoomImpl</tt>.
Expand Down Expand Up @@ -271,7 +252,7 @@ public void leave()
// we get NotConnectedException, this is expected (skip log)
if (connection.isConnected() || e instanceof InterruptedException)
{
logger.error("Failed to properly leave " + muc.toString(), e);
logger.error("Failed to properly leave " + muc, e);
}
}
finally
Expand Down Expand Up @@ -347,64 +328,17 @@ private void resetRoleForOccupant(EntityFullJid occupantJid)
}
}

/**
* Creates the corresponding ChatRoomLocalUserRoleChangeEvent and notifies
* all <tt>ChatRoomLocalUserRoleListener</tt>s that local user's role has
* been changed in this <tt>ChatRoom</tt>.
*
* @param newRole the new role the local user gets
* @param isInitial if <tt>true</tt> this is initial role set.
*/
private void fireLocalUserRoleEvent(MemberRole newRole, boolean isInitial)
{
ChatRoomLocalUserRoleChangeEvent evt = new ChatRoomLocalUserRoleChangeEvent(newRole, isInitial);

if (logger.isTraceEnabled())
{
logger.trace("Will dispatch the following ChatRoom event: " + evt);
}

localUserRoleListeners.forEach(listener -> listener.localUserRoleChanged(evt));
}

/**
* Sets the new role for the local user in the context of this chat room.
*
* @param role the new role to be set for the local user
* @param isInitial if <tt>true</tt> this is initial role set.
*/
public void setLocalUserRole(MemberRole role, boolean isInitial)
private void setLocalUserRole(@NotNull MemberRole newRole)
{
fireLocalUserRoleEvent(role, isInitial);
if (this.role != role)
MemberRole oldRole = role;
this.role = newRole;
if (oldRole != newRole)
{
chatRoomListeners.forEach(listener -> listener.localRoleChanged(role));
chatRoomListeners.forEach(listener -> listener.localRoleChanged(newRole, this.role));
}
this.role = role;
}

@Override
public void addMemberPresenceListener(ChatRoomMemberPresenceListener listener)
{
listeners.add(listener);
}

@Override
public void removeMemberPresenceListener(ChatRoomMemberPresenceListener listener)
{
listeners.remove(listener);
}

@Override
public void addLocalUserRoleListener(ChatRoomLocalUserRoleListener listener)
{
localUserRoleListeners.add(listener);
}

@Override
public void removeLocalUserRoleListener(ChatRoomLocalUserRoleListener listener)
{
localUserRoleListeners.remove(listener);
}

@Override
Expand Down Expand Up @@ -519,27 +453,6 @@ public boolean destroy(String reason, String alternateAddress)
return false;
}

private void fireMemberPresenceEvent(ChatRoomMemberPresenceChangeEvent event)
{
listeners.forEach(l -> l.memberPresenceChanged(event));
if (event instanceof Joined)
{
chatRoomListeners.forEach(listener -> listener.memberJoined(event.getChatRoomMember()));
}
else if (event instanceof Left)
{
chatRoomListeners.forEach(listener -> listener.memberLeft(event.getChatRoomMember()));
}
else if (event instanceof Kicked)
{
chatRoomListeners.forEach(listener -> listener.memberKicked(event.getChatRoomMember()));
}
else if (event instanceof PresenceUpdated)
{
chatRoomListeners.forEach(listener -> listener.memberPresenceChanged(event.getChatRoomMember()));
}
}

Occupant getOccupant(ChatMemberImpl chatMember)
{
return muc.getOccupant(chatMember.getOccupantJid());
Expand Down Expand Up @@ -602,7 +515,7 @@ public Collection<ExtensionElement> getPresenceExtensions()
{
return lastPresenceSent != null
? new ArrayList<>(lastPresenceSent.getExtensions())
: EMPTY_PRESENCE_LIST;
: Collections.emptyList();
}

/**
Expand Down Expand Up @@ -728,7 +641,7 @@ private void processOwnPresence(Presence presence)
}
else
{
setLocalUserRole(jitsiRole, ChatRoomImpl.this.role == null);
setLocalUserRole(jitsiRole);
}
}
}
Expand All @@ -740,12 +653,10 @@ private void processOwnPresence(Presence presence)
*/
private void processOtherPresence(Presence presence)
{
EntityFullJid jid
= presence.getFrom().asEntityFullJidIfPossible();
EntityFullJid jid = presence.getFrom().asEntityFullJidIfPossible();
if (jid == null)
{
logger.warn("Presence without a valid jid: "
+ presence.getFrom());
logger.warn("Presence without a valid jid: " + presence.getFrom());
return;
}

Expand Down Expand Up @@ -791,7 +702,8 @@ else if (presence.getType().equals(Presence.Type.unavailable))
if (memberJoined)
{
// Trigger member "joined"
fireMemberPresenceEvent(new Joined(chatMember));
ChatRoomMember finalMember = chatMember;
chatRoomListeners.forEach(listener -> listener.memberJoined(finalMember));
}
else if (memberLeft)
{
Expand All @@ -802,7 +714,8 @@ else if (memberLeft)

if (!memberLeft)
{
fireMemberPresenceEvent(new PresenceUpdated(chatMember));
ChatRoomMember finalMember = chatMember;
chatRoomListeners.forEach(listener -> listener.memberPresenceChanged(finalMember));
}
}
}
Expand All @@ -817,8 +730,7 @@ public void processPresence(Presence presence)
{
if (presence == null || presence.getError() != null)
{
logger.warn("Unable to handle packet: " +
(presence == null ? "null" : presence.toXML()));
logger.warn("Unable to handle packet: " + (presence == null ? "null" : presence.toXML()));
return;
}

Expand All @@ -830,8 +742,7 @@ public void processPresence(Presence presence)
// Should never happen, but log if something is broken
if (myOccupantJid == null)
{
logger.error(
"Processing presence when we're not aware of our address");
logger.error("Processing presence when we're not aware of our address");
}

if (myOccupantJid != null && myOccupantJid.equals(presence.getFrom()))
Expand Down Expand Up @@ -944,7 +855,7 @@ public void left(EntityFullJid occupantJid)

if (member != null)
{
fireMemberPresenceEvent(new Left(member));
chatRoomListeners.forEach(listener -> listener.memberLeft(member));
}
else
{
Expand Down Expand Up @@ -976,7 +887,7 @@ public void kicked(EntityFullJid occupantJid, Jid actor, String reason)
return;
}

fireMemberPresenceEvent(new Kicked(member));
chatRoomListeners.forEach(listener -> listener.memberKicked(member));
}

@Override
Expand Down Expand Up @@ -1129,56 +1040,8 @@ public void nicknameChanged(EntityFullJid oldNickname,
* Listens for room destroyed and pass it to the conference.
*/
class LocalUserStatusListener
implements UserStatusListener
extends DefaultUserStatusListener
{
@Override
public void kicked(Jid actor, String reason)
{}

@Override
public void voiceGranted()
{}

@Override
public void voiceRevoked()
{}

@Override
public void banned(Jid actor, String reason)
{}

@Override
public void membershipGranted()
{}

@Override
public void membershipRevoked()
{}

@Override
public void moderatorGranted()
{}

@Override
public void moderatorRevoked()
{}

@Override
public void ownershipGranted()
{}

@Override
public void ownershipRevoked()
{}

@Override
public void adminGranted()
{}

@Override
public void adminRevoked()
{}

@Override
public void roomDestroyed(MultiUserChat alternateMUC, String reason)
{
Expand Down