/*
* 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.contactsource;
import java.util.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
/**
* Implements a generic <tt>SourceContact</tt> for the purposes of the support
* for the OS-specific Address Book.
*
* @author Lyubomir Marinov
*/
public class GenericSourceContact
extends DataObject
implements SourceContact
{
/**
* The <tt>ContactDetail</tt>s of this <tt>SourceContact</tt>.
*/
protected final List<ContactDetail> contactDetails;
/**
* The <tt>ContactSourceService</tt> which has created this
* <tt>SourceContact</tt>.
*/
private final ContactSourceService contactSource;
/**
* The display name of this <tt>SourceContact</tt>.
*/
private String displayName;
/**
* The display details of this contact.
*/
private String displayDetails;
/**
* The presence status of this contact.
*/
private PresenceStatus presenceStatus;
/**
* The image/avatar of this <tt>SourceContact</tt>
*/
private byte[] image;
/**
* The address of the contact.
*/
private String contactAddress = null;
/**
* Initializes a new <tt>AddrBookSourceContact</tt> instance.
*
* @param contactSource the <tt>ContactSourceService</tt> which is creating
* the new instance
* @param displayName the display name of the new instance
* @param contactDetails the <tt>ContactDetail</tt>s of the new instance
*/
public GenericSourceContact(
ContactSourceService contactSource,
String displayName,
List<ContactDetail> contactDetails)
{
this.contactSource = contactSource;
this.displayName = displayName;
this.contactDetails = contactDetails;
}
/**
* Returns the address of the contact.
*
* @return the contact address.
*/
public String getContactAddress()
{
return contactAddress;
}
/**
* Gets the <tt>ContactDetail</tt>s of this <tt>SourceContact</tt>.
*
* @return the <tt>ContactDetail</tt>s of this <tt>SourceContact</tt>
* @see SourceContact#getContactDetails()
*/
public List<ContactDetail> getContactDetails()
{
return Collections.unmodifiableList(contactDetails);
}
/**
* Gets the <tt>ContactDetail</tt>s of this <tt>SourceContact</tt> which
* support a specific <tt>OperationSet</tt>.
*
* @param operationSet the <tt>OperationSet</tt> the supporting
* <tt>ContactDetail</tt>s of which are to be returned
* @return the <tt>ContactDetail</tt>s of this <tt>SourceContact</tt> which
* support the specified <tt>operationSet</tt>
* @see SourceContact#getContactDetails(Class)
*/
public List<ContactDetail> getContactDetails(
Class<? extends OperationSet> operationSet)
{
List<ContactDetail> contactDetails = new LinkedList<ContactDetail>();
for (ContactDetail contactDetail : getContactDetails())
{
List<Class<? extends OperationSet>> supportedOperationSets
= contactDetail.getSupportedOperationSets();
if ((supportedOperationSets != null)
&& supportedOperationSets.contains(operationSet))
contactDetails.add(contactDetail);
}
return contactDetails;
}
/**
* Returns a list of all <tt>ContactDetail</tt>s corresponding to the given
* category.
* @param category the <tt>OperationSet</tt> class we're looking for
* @return a list of all <tt>ContactDetail</tt>s corresponding to the given
* category
*/
public List<ContactDetail> getContactDetails(
ContactDetail.Category category)
{
List<ContactDetail> contactDetails = new LinkedList<ContactDetail>();
for (ContactDetail contactDetail : getContactDetails())
{
if(contactDetail != null)
{
ContactDetail.Category detailCategory
= contactDetail.getCategory();
if (detailCategory != null && detailCategory.equals(category))
contactDetails.add(contactDetail);
}
}
return contactDetails;
}
/**
* Gets the <tt>ContactSourceService</tt> which has created this
* <tt>SourceContact</tt>.
*
* @return the <tt>ContactSourceService</tt> which has created this
* <tt>SourceContact</tt>
* @see SourceContact#getContactSource()
*/
public ContactSourceService getContactSource()
{
return contactSource;
}
/**
* Gets the display details of this <tt>SourceContact</tt>.
*
* @return the display details of this <tt>SourceContact</tt>
* @see SourceContact#getDisplayDetails()
*/
public String getDisplayDetails()
{
return displayDetails;
}
/**
* Sets the address of the contact.
*
* @param contactAddress the address to set.
*/
public void setContactAddress(String contactAddress)
{
this.contactAddress = contactAddress;
}
/**
* Sets the display details of this <tt>SourceContact</tt>.
*
* @param displayDetails the display details of this <tt>SourceContact</tt>
*/
public String setDisplayDetails(String displayDetails)
{
return this.displayDetails = displayDetails;
}
/**
* Gets the display name of this <tt>SourceContact</tt>.
*
* @return the display name of this <tt>SourceContact</tt>
* @see SourceContact#getDisplayName()
*/
public String getDisplayName()
{
return displayName;
}
/**
* Sets the display name of this <tt>SourceContact</tt>.
*
* @param displayName The display name of this <tt>SourceContact</tt>
*/
public void setDisplayName(String displayName)
{
this.displayName = displayName;
}
/**
* Gets the image/avatar of this <tt>SourceContact</tt>.
*
* @return the image/avatar of this <tt>SourceContact</tt>
* @see SourceContact#getImage()
*/
public byte[] getImage()
{
return image;
}
/**
* Gets the preferred <tt>ContactDetail</tt> for a specific
* <tt>OperationSet</tt>.
*
* @param operationSet the <tt>OperationSet</tt> to get the preferred
* <tt>ContactDetail</tt> for
* @return the preferred <tt>ContactDetail</tt> for the specified
* <tt>operationSet</tt>
* @see SourceContact#getPreferredContactDetail(Class)
*/
public ContactDetail getPreferredContactDetail(
Class<? extends OperationSet> operationSet)
{
List<ContactDetail> contactDetails = getContactDetails(operationSet);
return contactDetails.isEmpty() ? null : contactDetails.get(0);
}
/**
* Sets the image/avatar of this <tt>SourceContact</tt>.
*
* @param image the image/avatar to be set on this <tt>SourceContact</tt>
*/
public void setImage(byte[] image)
{
this.image = image;
}
/**
* Whether the current image returned by @see #getImage() is the one
* provided by the SourceContact by default, or is a one used and obtained
* from external source.
*
* @return whether this is the default image for this SourceContact.
*/
@Override
public boolean isDefaultImage()
{
// in this SourceContact we always show an externally set image or null
return false;
}
/**
* Returns the status of the source contact. And null if such information
* is not available.
* @return the PresenceStatus representing the state of this source contact.
*/
public PresenceStatus getPresenceStatus()
{
return presenceStatus;
}
/**
* Sets the status of the source contact.
*
* @param presenceStatus the status of this contact
*/
public void setPresenceStatus(PresenceStatus presenceStatus)
{
this.presenceStatus = presenceStatus;
}
/**
* Returns the index of this source contact in its parent.
*
* @return the index of this source contact in its parent
*/
public int getIndex()
{
return -1;
}
}