/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * 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 net.java.sip.communicator.service.gui; import java.util.*; import net.java.sip.communicator.service.protocol.*; /** * The <tt>UIContactDetail</tt> corresponds to a particular contact detail, * phone number, IM identifier, email, etc. which has it's preferred mode of * transport <tt>ProtocolProviderService</tt>. * * @author Yana Stamcheva */ public abstract class UIContactDetail { /** * The prefix to be used when calling this contact detail. */ private String prefix; /** * The address of this detail. */ private final String address; /** * The display name of this detail. */ private final String displayName; /** * The <tt>ProtocolProviderService</tt> corresponding to this detail. */ private Map<Class<? extends OperationSet>, ProtocolProviderService> preferredProviders; /** * The protocol to be used for this contact detail if no protocol provider * is set. */ private Map<Class<? extends OperationSet>, String> preferredProtocols; /** * The collection of labels associated with this detail. */ private final Collection<String> labels; /** * The category of the underlying contact detail. */ private final String category; /** * The underlying object that this class is wrapping */ private final Object descriptor; /** * Creates a <tt>UIContactDetail</tt> by specifying the contact * <tt>address</tt>, the <tt>displayName</tt> and <tt>preferredProvider</tt>. * * @param address the contact address * @param displayName the contact display name * @param descriptor the underlying object that this class is wrapping */ public UIContactDetail( String address, String displayName, Object descriptor) { this( address, displayName, null, null, null, null, descriptor); } /** * Creates a <tt>UIContactDetail</tt> by specifying the contact * <tt>address</tt>, the <tt>displayName</tt> and <tt>preferredProvider</tt>. * * @param address the contact address * @param displayName the contact display name * @param category the category of the underlying contact detail * @param labels the collection of labels associated with this detail * @param preferredProviders the preferred protocol provider * @param preferredProtocols the preferred protocol if no protocol provider * is set * @param descriptor the underlying object that this class is wrapping */ public UIContactDetail( String address, String displayName, String category, Collection<String> labels, Map<Class<? extends OperationSet>, ProtocolProviderService> preferredProviders, Map<Class<? extends OperationSet>, String> preferredProtocols, Object descriptor) { this.address = address; this.displayName = displayName; this.category = category; this.labels = labels; this.preferredProviders = preferredProviders; this.preferredProtocols = preferredProtocols; this.descriptor = descriptor; } /** * Returns the display name of this detail. * @return the display name of this detail */ public String getDisplayName() { return displayName; } /** * Returns the address of this detail. * @return the address of this detail */ public String getAddress() { if (prefix != null && prefix.trim().length() >= 0) return prefix + address; return address; } /** * Returns the category of the underlying detail. * * @return the category of the underlying detail */ public String getCategory() { return category; } /** * Returns an iterator over the collection of labels associated with this * detail. * * @return an iterator over the collection of labels associated with this * detail */ public Iterator<String> getLabels() { if (labels != null) return labels.iterator(); return null; } /** * Returns the protocol provider preferred for contacting this detail for * the given <tt>OperationSet</tt> class. * @param opSetClass the <tt>OperationSet</tt> class for which we're looking * for provider * @return the protocol provider preferred for contacting this detail */ public ProtocolProviderService getPreferredProtocolProvider( Class<? extends OperationSet> opSetClass) { if (preferredProviders != null) return preferredProviders.get(opSetClass); return null; } /** * Adds a preferred protocol provider for a given OperationSet class. * * @param opSetClass the <tt>OperationSet</tt> class for which we're looking * for protocol * @param protocolProvider the preferred protocol provider to add */ public void addPreferredProtocolProvider( Class<? extends OperationSet> opSetClass, ProtocolProviderService protocolProvider) { if (preferredProviders == null) preferredProviders = new HashMap< Class<? extends OperationSet>, ProtocolProviderService>(); preferredProviders.put(opSetClass, protocolProvider); } /** * Returns the name of the protocol preferred for contacting this detail for * the given <tt>OperationSet</tt> class if no preferred protocol provider * is set. * @param opSetClass the <tt>OperationSet</tt> class for which we're looking * for protocol * @return the name of the protocol preferred for contacting this detail */ public String getPreferredProtocol(Class<? extends OperationSet> opSetClass) { if (preferredProtocols != null) return preferredProtocols.get(opSetClass); return null; } /** * Adds a preferred protocol for a given OperationSet class. * * @param opSetClass the <tt>OperationSet</tt> class for which we're looking * for protocol * @param protocol the preferred protocol to add */ public void addPreferredProtocol( Class<? extends OperationSet> opSetClass, String protocol) { if (preferredProtocols == null) preferredProtocols = new HashMap< Class<? extends OperationSet>, String>(); preferredProtocols.put(opSetClass, protocol); } /** * Returns the prefix to be used when calling this contact detail. * * @return the prefix to be used when calling this contact detail */ public String getPrefix() { return prefix; } /** * Sets the prefix to be used when calling this contact detail. * * @param prefix the prefix to be used when calling this contact detail */ public void setPrefix(String prefix) { this.prefix = prefix; } /** * Returns the underlying object that this class is wrapping * * @return the underlying object that this class is wrapping */ public Object getDescriptor() { return descriptor; } /** * Returns the <tt>PresenceStatus</tt> of this <tt>ContactDetail</tt> or * null if the detail doesn't support presence. * @return the <tt>PresenceStatus</tt> of this <tt>ContactDetail</tt> or * null if the detail doesn't support presence */ public abstract PresenceStatus getPresenceStatus(); }