diff --git a/core/src/main/java/org/jivesoftware/spark/PresenceManager.java b/core/src/main/java/org/jivesoftware/spark/PresenceManager.java index 8e2a5c131..d2676efd2 100644 --- a/core/src/main/java/org/jivesoftware/spark/PresenceManager.java +++ b/core/src/main/java/org/jivesoftware/spark/PresenceManager.java @@ -143,7 +143,6 @@ public class PresenceManager { /** * Returns the presence of a user. - */ public static Presence getPresence(BareJid jid) { if (jid.equals(SparkManager.getSessionManager().getUserBareAddress())) { diff --git a/core/src/main/java/org/jivesoftware/spark/ui/ChatContainer.java b/core/src/main/java/org/jivesoftware/spark/ui/ChatContainer.java index d91188c81..371a469ce 100644 --- a/core/src/main/java/org/jivesoftware/spark/ui/ChatContainer.java +++ b/core/src/main/java/org/jivesoftware/spark/ui/ChatContainer.java @@ -322,7 +322,7 @@ public class ChatContainer extends SparkTabbedPane implements MessageListener, C final Resourcepart userid = p.getFrom().getResourceOrNull(); if (p.getType() == Presence.Type.unavailable) { fireUserHasLeft(chatRoom, userid); - } else if (p.getType() == Presence.Type.available) { + } else if (p.isAvailable()) { fireUserHasJoined(chatRoom, userid); } // Change tab icon diff --git a/core/src/main/java/org/jivesoftware/spark/ui/ContactGroup.java b/core/src/main/java/org/jivesoftware/spark/ui/ContactGroup.java index ab8b84f22..9c39c5eae 100644 --- a/core/src/main/java/org/jivesoftware/spark/ui/ContactGroup.java +++ b/core/src/main/java/org/jivesoftware/spark/ui/ContactGroup.java @@ -179,10 +179,7 @@ public class ContactGroup extends CollapsiblePane implements MouseListener { offlineItem.setPresence(offlinePresence); // set offline icon offlineItem.setIcon(PresenceManager.getIconFromPresence(offlinePresence)); - // Set status if applicable. - if (ModelUtil.hasLength(status)) { - offlineItem.setStatusText(status); - } + offlineItem.setStatusText(status); // Add to offline contacts. offlineContacts.add(offlineItem); diff --git a/core/src/main/java/org/jivesoftware/spark/ui/ContactItem.java b/core/src/main/java/org/jivesoftware/spark/ui/ContactItem.java index 1e4ef34cc..63d7dbb15 100644 --- a/core/src/main/java/org/jivesoftware/spark/ui/ContactItem.java +++ b/core/src/main/java/org/jivesoftware/spark/ui/ContactItem.java @@ -25,6 +25,7 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.util.Comparator; +import java.util.List; import javax.swing.Icon; import javax.swing.ImageIcon; @@ -38,7 +39,6 @@ import org.jivesoftware.smack.packet.StanzaBuilder; import org.jivesoftware.smack.roster.Roster; import org.jivesoftware.smack.roster.RosterEntry; import org.jivesoftware.smack.packet.Presence; -import org.jivesoftware.smack.roster.packet.RosterPacket; import org.jivesoftware.spark.ChatManager; import org.jivesoftware.spark.PresenceManager; import org.jivesoftware.spark.SparkManager; @@ -61,6 +61,12 @@ import static org.jivesoftware.smack.roster.packet.RosterPacket.ItemType.none; */ public class ContactItem extends JPanel { public final static Comparator CONTACT_ITEM_COMPARATOR = Comparator.comparing(ContactItem::getDisplayName, String.CASE_INSENSITIVE_ORDER); + private static final List trivialStatusTexts = List.of( + "online", + "available", + Res.getString("status.online"), + Res.getString("available") + ); private final JLabel imageLabel = new JLabel(); private final JLabel displayNameLabel = new JLabel(); @@ -80,10 +86,12 @@ public class ContactItem extends JPanel { private final int fontSize; private final int iconSize; private final boolean avatarsShowing; + private Color nicknameColor = (Color) UIManager.get("ContactItemNickname.foreground"); + private final Color nicknameColorOffline = (Color) UIManager.get("ContactItemOffline.color"); private static final Color COLOR_USER_ONLINE_NICKNAME = new Color(255, 128, 0); - public ContactItem(String alias, String nickname, BareJid jid) { + public ContactItem(String alias, String nickname, BareJid jid) { this.alias = trimToEmpty(alias); this.nickname = trimToEmpty(nickname); this.jid = requireNonNull(jid); @@ -94,6 +102,7 @@ public class ContactItem extends JPanel { fontSize = pref.getContactListFontSize(); iconSize = pref.getContactListIconSize(); avatarsShowing = pref.areAvatarsVisible(); + nicknameColor = pref.isGrayingOutEnabled() ? Color.gray : nicknameColor; // Set default presence presence = StanzaBuilder.buildPresence() @@ -208,7 +217,7 @@ public class ContactItem extends JPanel { } public void setStatus(String status) { - this.status = status; + this.status = trimToEmpty(status); } /** @@ -318,10 +327,10 @@ public class ContactItem extends JPanel { String status = presence.getStatus(); boolean isAvailable = false; if (status == null && presence.isAvailable()) { + isAvailable = presence.getMode() == Presence.Mode.available; switch (presence.getMode()) { case available: - status = Res.getString("status.online"); - isAvailable = true; + status = ""; break; case away: status = Res.getString("status.away"); @@ -345,25 +354,20 @@ public class ContactItem extends JPanel { isAvailable = true; } else { - getNicknameLabel().setFont(new Font("Dialog", Font.PLAIN, fontSize)); - getNicknameLabel().setForeground((Color)UIManager.get("ContactItemOffline.color")); - Roster roster = SparkManager.getRoster(); RosterEntry entry = roster.getEntry(getJid()); if (entry != null && (entry.getType() == none || entry.getType() == from) && entry.isSubscriptionPending()) { // Do not move out of group. setIcon(SparkRes.getImageIcon(SparkRes.Icon.SMALL_QUESTION)); - getNicknameLabel().setFont(new Font("Dialog", Font.PLAIN, fontSize)); setStatusText(Res.getString("status.pending")); } else { //We should keep the offline bullet (not available) instead of putting icon null. setIcon(SparkRes.getImageIcon(SparkRes.Icon.CLEAR_BALL_ICON)); setFont(new Font("Dialog", Font.PLAIN, fontSize)); - getNicknameLabel().setFont(new Font("Dialog", Font.PLAIN, fontSize)); setAvailable(false); - setStatusText(!isBlank(status) ? status : ""); + setStatusText(status); } sideIcon.setIcon(null); @@ -373,39 +377,21 @@ public class ContactItem extends JPanel { Icon sIcon = PresenceManager.getIconFromPresence(presence); setIcon(sIcon); - if (status != null) { - setStatus(status); - } // Always change nickname label to black. - getNicknameLabel().setForeground((Color)UIManager.get("ContactItemNickname.foreground")); - + getNicknameLabel().setFont(new Font("Dialog", Font.PLAIN, fontSize)); if (isAvailable) { - getNicknameLabel().setFont(new Font("Dialog", Font.PLAIN, fontSize)); - if (Res.getString("status.online").equals(status) || Res.getString("available").equalsIgnoreCase(status)) { - setStatusText(""); - } - else { - setStatusText(status); - } + getNicknameLabel().setForeground(nicknameColor); + // Remove obvious "Online" status text. + status = status == null || trivialStatusTexts.contains(status.toLowerCase()) ? "" : status; } else if (presence.isAvailable()) { - LocalPreferences pref = SettingsManager.getLocalPreferences(); - if(pref.isGrayingOutEnabled()) - { - getNicknameLabel().setFont(new Font("Dialog", Font.ITALIC, fontSize)); - getNicknameLabel().setForeground(Color.gray); - } - else - { - getNicknameLabel().setFont(new Font("Dialog", Font.PLAIN, fontSize)); - getNicknameLabel().setForeground(Color.black); - } - if (status != null) { - setStatusText(status); - } + getNicknameLabel().setForeground(nicknameColor); + } else { + getNicknameLabel().setForeground(nicknameColorOffline); } + setStatusText(status); setAvailable(true); } @@ -414,6 +400,7 @@ public class ContactItem extends JPanel { * Sets the status label text based on the users status. */ public void setStatusText(String status) { + status = trimToEmpty(status); setStatus(status); descriptionLabel.setText(!isBlank(status) ? " - " + status : ""); } diff --git a/core/src/main/java/org/jivesoftware/spark/ui/ContactList.java b/core/src/main/java/org/jivesoftware/spark/ui/ContactList.java index 15f918f2a..55f3244e8 100644 --- a/core/src/main/java/org/jivesoftware/spark/ui/ContactList.java +++ b/core/src/main/java/org/jivesoftware/spark/ui/ContactList.java @@ -277,9 +277,9 @@ public class ContactList extends JPanel implements && entry.isSubscriptionPending(); // If online, check to see if they are in the offline group. // If so, remove from an offline group and add to all groups they belong to. - if (presence.getType() == Presence.Type.available && offlineGroup.getContactItemByJID(bareJID) != null || (presence.getFrom().toString().contains("workgroup."))) { + if (presence.isAvailable() && offlineGroup.getContactItemByJID(bareJID) != null || (presence.getFrom().toString().contains("workgroup."))) { changeOfflineToOnline(bareJID, entry, presence); - } else if (presence.getType() == Presence.Type.available) { + } else if (presence.isAvailable()) { updateContactItemsPresence(presence, entry, bareJID); } else if (presence.getType() == Presence.Type.unavailable && !isPending) { // If not available, move to an offline group. @@ -2129,7 +2129,7 @@ public class ContactList extends JPanel implements final Roster roster = SparkManager.getRoster(); for (RosterGroup group : roster.getEntry(jid).getGroups()) { ContactGroup contactGroup = getContactGroup(group.getName()); - if (contactGroup == null && !Objects.equals(group.getName(), "")) { + if (isBlank(group.getName())) { contactGroup = addContactGroup(group.getName()); } if (contactGroup != null) { diff --git a/core/src/main/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java b/core/src/main/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java index da3bad697..cbdf461e1 100644 --- a/core/src/main/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java +++ b/core/src/main/java/org/jivesoftware/spark/ui/conferences/GroupChatParticipantList.java @@ -170,7 +170,7 @@ public class GroupChatParticipantList extends JPanel { Resourcepart displayName = userid.getResourcepart(); userMap.put(displayName, userid); - if (p.getType() == Presence.Type.available) { + if (p.isAvailable()) { addParticipant(userid, p); agentInfoPanel.setVisible(true); groupChatRoom.validate(); diff --git a/core/src/main/java/org/jivesoftware/spark/ui/rooms/ChatRoomImpl.java b/core/src/main/java/org/jivesoftware/spark/ui/rooms/ChatRoomImpl.java index 43cc363c9..5b460276f 100644 --- a/core/src/main/java/org/jivesoftware/spark/ui/rooms/ChatRoomImpl.java +++ b/core/src/main/java/org/jivesoftware/spark/ui/rooms/ChatRoomImpl.java @@ -418,9 +418,7 @@ public class ChatRoomImpl extends ChatRoom { if ( presence1.getType() == Presence.Type.unavailable && contactItem != null ) { getTranscriptWindow().insertNotificationMessage( "*** " + Res.getString( "message.went.offline", participantNickname, time ), ChatManager.NOTIFICATION_COLOR ); - } - else if ( oldType == Presence.Type.unavailable && presence1.getType() == Presence.Type.available ) - { + } else if (oldType == Presence.Type.unavailable && presence1.isAvailable()) { getTranscriptWindow().insertNotificationMessage( "*** " + Res.getString( "message.came.online", participantNickname, time ), ChatManager.NOTIFICATION_COLOR ); } } diff --git a/core/src/main/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java b/core/src/main/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java index d9f03ad6d..a8da6a2b6 100644 --- a/core/src/main/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java +++ b/core/src/main/java/org/jivesoftware/sparkimpl/plugin/gateways/GatewayPlugin.java @@ -319,7 +319,7 @@ public class GatewayPlugin implements Plugin, ContactItemHandler { DomainBareJid domain = from.asDomainBareJid(); Transport transport = TransportUtils.getTransport(domain); if (transport != null) { - if (presence.getType() == Presence.Type.available) { + if (presence.isAvailable()) { item.setSpecialIcon(transport.getIcon()); } else { @@ -336,12 +336,7 @@ public class GatewayPlugin implements Plugin, ContactItemHandler { DomainBareJid domain = jid.asDomainBareJid(); Transport transport = TransportUtils.getTransport(domain); if (transport != null) { - if (PresenceManager.isOnline(jid)) { - return transport.getIcon(); - } - else { - return transport.getInactiveIcon(); - } + return PresenceManager.isOnline(jid) ? transport.getIcon() : transport.getInactiveIcon(); } return null; } diff --git a/core/src/main/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java b/core/src/main/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java index 6e6fa11fb..4bd5073ed 100644 --- a/core/src/main/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java +++ b/core/src/main/java/org/jivesoftware/sparkimpl/settings/local/LocalPreferences.java @@ -714,6 +714,11 @@ public class LocalPreferences { setBoolean("GrayingOut", enabled); } + /** + * SPARK-979 Some users complain about hardly readable nicknames of idle contacts. + * This option makes them look like all other contacts. + * Presence icon should be enough to distinguish idle users. + */ public boolean isGrayingOutEnabled() { return getBoolean("GrayingOut", true); } diff --git a/plugins/fastpath/src/main/java/org/jivesoftware/fastpath/workspace/panes/OnlineAgents.java b/plugins/fastpath/src/main/java/org/jivesoftware/fastpath/workspace/panes/OnlineAgents.java index 141df9399..6a4888735 100644 --- a/plugins/fastpath/src/main/java/org/jivesoftware/fastpath/workspace/panes/OnlineAgents.java +++ b/plugins/fastpath/src/main/java/org/jivesoftware/fastpath/workspace/panes/OnlineAgents.java @@ -313,7 +313,7 @@ public final class OnlineAgents extends JPanel { if (presence.getType() == Presence.Type.unavailable) { contactGroup.removeContactItem(item); } - else if (presence.getType() == Presence.Type.available) { + else if (presence.isAvailable()) { Icon icon = PresenceManager.getIconFromPresence(presence); item.setIcon(icon); }