/**
* $RCSfile: ,v $
* $Revision: $
* $Date: $
*
* Copyright (C) 2004-2011 Jive Software. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jivesoftware.spark;
import org.jivesoftware.resource.Res;
import org.jivesoftware.resource.SparkRes;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.util.StringUtils;
import org.jivesoftware.smackx.packet.MUCUser;
import javax.swing.Icon;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Handles the most common presence checks.
*
* @author Derek DeMoro
*/
public class PresenceManager {
private static final List<Presence> PRESENCES = new ArrayList<Presence>();
static {
// Add Available Presence
final Presence availablePresence = new Presence(Presence.Type.available, Res.getString("status.online"), 1, Presence.Mode.available);
final Presence freeToChatPresence = new Presence(Presence.Type.available, Res.getString("status.free.to.chat"), 1, Presence.Mode.chat);
final Presence awayPresence = new Presence(Presence.Type.available, Res.getString("status.away"), 0, Presence.Mode.away);
final Presence phonePresence = new Presence(Presence.Type.available, Res.getString("status.on.phone"), 0, Presence.Mode.away);
final Presence dndPresence = new Presence(Presence.Type.available, Res.getString("status.do.not.disturb"), 0, Presence.Mode.dnd);
final Presence extendedAway = new Presence(Presence.Type.available, Res.getString("status.extended.away"), 0, Presence.Mode.xa);
PRESENCES.add(freeToChatPresence);
PRESENCES.add(availablePresence);
PRESENCES.add(awayPresence);
PRESENCES.add(extendedAway);
PRESENCES.add(phonePresence);
PRESENCES.add(dndPresence);
}
/**
* Building Presence related data.
*/
private PresenceManager() {
}
/**
* Returns true if the user is online.
*
* @param jid the jid of the user.
* @return true if online.
*/
public static boolean isOnline(String jid) {
final Roster roster = SparkManager.getConnection().getRoster();
Presence presence = roster.getPresence(jid);
return presence.isAvailable();
}
/**
* Returns true if the user is online and their status is available or free to chat.
*
* @param jid the jid of the user.
* @return true if the user is online and available.
*/
public static boolean isAvailable(String jid) {
final Roster roster = SparkManager.getConnection().getRoster();
Presence presence = roster.getPresence(jid);
return presence.isAvailable() && !presence.isAway();
}
/**
* Returns true if the user is online and their mode is available or free to chat.
*
* @param presence the users presence.
* @return true if the user is online and their mode is available or free to chat.
*/
public static boolean isAvailable(Presence presence) {
return presence.isAvailable() && !presence.isAway();
}
/**
* Returns the presence of a user.
*
* @param jid the users jid.
* @return the users presence.
*/
public static Presence getPresence(String jid) {
if (jid!= null && jid.equals(SparkManager.getSessionManager().getBareAddress())) {
return SparkManager.getWorkspace().getStatusBar().getPresence();
} else {
final Roster roster = SparkManager.getConnection().getRoster();
return roster.getPresence(jid);
}
}
/**
* Returns the fully qualified jid of a user.
*
* @param jid the users bare jid (ex. derek@jivesoftware.com)
* @return the fully qualified jid of a user (ex. derek@jivesoftware.com --> derek@jivesoftware.com/spark)
*/
public static String getFullyQualifiedJID(String jid) {
final Roster roster = SparkManager.getConnection().getRoster();
Presence presence = roster.getPresence(jid);
return presence.getFrom();
}
public static String getJidFromMUCPresence(Presence presence) {
Collection<PacketExtension> extensions = presence.getExtensions();
for (PacketExtension pe : extensions) {
if (pe instanceof MUCUser) {
final MUCUser mucUser = (MUCUser) pe;
String fullJid = mucUser.getItem().getJid();
String userJid = StringUtils.parseBareAddress(fullJid);
return userJid;
}
}
return null;
}
/**
* Returns the icon associated with a users presence.
*
* @param presence the users presence.
* @return the icon associated with it.
*/
public static Icon getIconFromPresence(Presence presence) {
// Handle offline presence
if (!presence.isAvailable()) {
return SparkRes.getImageIcon(SparkRes.CLEAR_BALL_ICON);
}
Presence.Mode presenceMode = presence.getMode();
if (presenceMode == null) {
presenceMode = Presence.Mode.available;
}
Icon icon = null;
if (presenceMode.equals(Presence.Mode.available)) {
icon = SparkRes.getImageIcon(SparkRes.GREEN_BALL);
}
else if (presenceMode.equals(Presence.Mode.chat)) {
icon = SparkRes.getImageIcon(SparkRes.FREE_TO_CHAT_IMAGE);
}
else if (isOnPhone(presence)) {
icon = SparkRes.getImageIcon(SparkRes.ON_PHONE_IMAGE);
}
else if (presenceMode.equals(Presence.Mode.away)) {
icon = SparkRes.getImageIcon(SparkRes.IM_AWAY);
}
else if (presenceMode.equals(Presence.Mode.dnd)) {
icon = SparkRes.getImageIcon(SparkRes.IM_DND);
}
else if (presenceMode.equals(Presence.Mode.xa)) {
icon = SparkRes.getImageIcon(SparkRes.IM_AWAY);
}
// Check For ContactItem handlers
Icon handlerIcon = SparkManager.getChatManager().getTabIconForContactHandler(presence);
if (handlerIcon != null) {
icon = handlerIcon;
}
return icon;
}
/**
* Returns the Presence Map.
*
* @return the Presence Map.
*/
public static List<Presence> getPresences() {
return PRESENCES;
}
public static boolean isOnPhone(Presence presence) {
Presence.Mode presenceMode = presence.getMode();
if (presenceMode == null) {
presenceMode = Presence.Mode.available;
}
if (presence.getStatus() != null &&
presence.getStatus().contains(Res.getString("status.on.phone")) &&
presenceMode.equals(Presence.Mode.away)) {
return true;
}
return false;
}
}