package xmpp.client.service.user;
import java.util.ArrayList;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.util.Base64;
import org.jivesoftware.smack.util.StringUtils;
import xmpp.client.R;
import xmpp.client.service.user.group.GroupList;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.DynamicDrawableSpan;
import android.text.style.ImageSpan;
public class User implements Parcelable, Comparable<User> {
@SuppressWarnings("unused")
private static final String TAG = User.class.getName();
public static final int TSTATE_DEFAULT = 0;
public static final int TSTATE_IS_TRANSPORT = 1;
public static final int TSTATE_IS_TRANSPORTED = 2;
public static final int TSTATE_IS_MUC = 3;
public static final int TRANSPORT_NONE = 0;
public static final int TRANSPORT_UNKNOWN = -1;
public static final int TRANSPORT_XMPP = 1;
public static final int TRANSPORT_ICQ = 2;
public static final int TRANSPORT_MSN = 3;
public static final int TRANSPORT_AIM = 4;
public static final int TRANSPORT_YAHOO = 5;
public static final int TRANSPORT_IRC = 6;
public static String intToARGB(int i) {
return "#" + intToHex((i >> 24) & 0xFF) + intToHex((i >> 16) & 0xFF)
+ intToHex((i >> 8) & 0xFF) + intToHex(i & 0xFF);
}
public static String intToHex(int i) {
final String s = Integer.toHexString(i);
if (s.length() == 1) {
return "0" + s;
}
return s;
}
private String mUserName;
private String mUserLogin;
private String mRessource;
private UserState mUserState;
private GroupList mGroups;
private int mTransportState;
private int mTransportType;
private String mUserContact;
private ArrayList<String> mAdditionalInfo;
private byte[] mAvatar;
private int mUnreadMessages;
public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
public User() {
}
public User(org.jivesoftware.smack.RosterEntry re, Presence p) {
if (re == null || p == null) {
throw new NullPointerException();
}
mUserName = re.getName();
mUserLogin = StringUtils.parseBareAddress(re.getUser());
mRessource = StringUtils.parseResource(p.getFrom());
mTransportState = TSTATE_DEFAULT;
mTransportType = TRANSPORT_NONE;
if (!mUserLogin.contains("@")) {
mTransportState = TSTATE_IS_TRANSPORT;
mTransportType = TRANSPORT_UNKNOWN;
if (mUserLogin.startsWith("icq")) {
mTransportType = TRANSPORT_ICQ;
} else if (mUserLogin.startsWith("msn")) {
mTransportType = TRANSPORT_MSN;
} else if (mUserLogin.startsWith("irc")) {
mTransportType = TRANSPORT_IRC;
} else if (mUserLogin.startsWith("aim")) {
mTransportType = TRANSPORT_AIM;
} else if (mUserLogin.startsWith("yahoo")) {
mTransportType = TRANSPORT_YAHOO;
} else if (mUserLogin.startsWith("xmpp")) {
mTransportType = TRANSPORT_XMPP;
}
}
mGroups = new GroupList(re.getGroups());
mUserState = new UserState(p);
mAdditionalInfo = new ArrayList<String>();
}
private User(Parcel in) {
mUserLogin = in.readString();
mRessource = in.readString();
mUserName = in.readString();
mUserState = in.readParcelable(UserState.class.getClassLoader());
mGroups = in.readParcelable(GroupList.class.getClassLoader());
mTransportState = in.readInt();
mTransportType = in.readInt();
mUnreadMessages = in.readInt();
final String s = in.readString();
if (s != null && !s.isEmpty()) {
mAvatar = Base64.decode(s);
}
mAdditionalInfo = new ArrayList<String>();
in.readStringList(mAdditionalInfo);
}
public User(String login, String name, ArrayList<String> info, Presence p) {
mUserLogin = login;
mRessource = name;
mUserName = name;
mUserState = new UserState(p);
mGroups = new GroupList();
mTransportState = TSTATE_IS_MUC;
mTransportType = TRANSPORT_NONE;
mAdditionalInfo = new ArrayList<String>();
if (info != null) {
mAdditionalInfo.addAll(info);
}
}
@Override
public int compareTo(User another) {
if (isInvisible() && !another.isInvisible()) {
return 1;
} else if (!isInvisible() && another.isInvisible()) {
return -1;
}
if (getUserState().getStatusPrecedence() < another.getUserState()
.getStatusPrecedence()) {
return 1;
} else if (getUserState().getStatusPrecedence() > another
.getUserState().getStatusPrecedence()) {
return -1;
} else {
int i = getDisplayName().toLowerCase().compareTo(
another.getDisplayName().toLowerCase());
if (i == 0) {
if (isTransported() && !another.isTransported()) {
return 1;
}
if (!isTransported() && another.isTransported()) {
return -1;
}
if (supportsAudio() && !another.supportsAudio()) {
return 1;
}
if (!supportsAudio() && another.supportsAudio()) {
return -1;
}
if (supportsVideo() && !another.supportsVideo()) {
return 1;
}
if (!supportsVideo() && another.supportsVideo()) {
return -1;
}
i = getUserLogin().toLowerCase().compareTo(
another.getUserLogin().toLowerCase());
}
return i;
}
}
@Override
public int describeContents() {
return 0;
}
public boolean equals(User o) {
if (o == null) {
return false;
}
if (o.getFullUserLogin().equalsIgnoreCase(getFullUserLogin())) {
return true;
}
return false;
}
public String getAdditionalInformation(int i) {
if (mAdditionalInfo.size() > i) {
return mAdditionalInfo.get(i);
} else {
return null;
}
}
public Bitmap getAvatar() {
if (mAvatar != null) {
return BitmapFactory.decodeByteArray(mAvatar, 0, mAvatar.length);
}
return null;
}
public Bitmap getBitmap(Context context, boolean showIcon) {
Bitmap ava = null;
if (mAvatar != null) {
ava = getAvatar();
} else {
ava = BitmapFactory.decodeResource(context.getResources(),
R.drawable.ic_contact_picture);
}
if (showIcon) {
final Bitmap icon = BitmapFactory.decodeResource(context
.getResources(), getUserState().getStatusIconResourceID());
final Bitmap bitmap = Bitmap.createBitmap(ava.getWidth(),
ava.getHeight(), Config.ARGB_8888);
final Canvas c = new Canvas(bitmap);
c.drawBitmap(ava, 0, 0, new Paint());
c.drawBitmap(icon, 0, 0, new Paint());
return bitmap;
} else {
return ava;
}
}
public String getDisplayName() {
if (mUserName == null || mUserName.isEmpty()) {
return getNiceUserLogin();
} else {
return mUserName;
}
}
public String getFullUserLogin() {
return getUserLogin() + "/" + getRessource();
}
public GroupList getGroups() {
return mGroups;
}
public String getNiceUserLogin() {
if (!isTransported()) {
return getUserLogin();
} else {
return mUserLogin.split("@")[0].replace("\\40", "@");
}
}
public String getRessource() {
return mRessource;
}
public String getStatusText() {
return mUserState.getStatusText(getNiceUserLogin());
}
public Spannable getStatusTextSpannable(Context context) {
final SpannableStringBuilder builder = new SpannableStringBuilder(" "
+ getStatusText());
final Bitmap b = BitmapFactory.decodeResource(context.getResources(),
getUserState().getStatusIconResourceID());
final Bitmap b2 = Bitmap.createBitmap(b.getWidth(), b.getHeight() + 1,
Config.ARGB_8888);
final Canvas c = new Canvas(b2);
c.drawBitmap(b, 0, 0, new Paint());
builder.setSpan(new ImageSpan(context, b2,
DynamicDrawableSpan.ALIGN_BOTTOM), 0, 1,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return builder;
}
public int getTransportState() {
return mTransportState;
}
public int getTransportType() {
return mTransportType;
}
public int getUnreadMessages() {
return mUnreadMessages;
}
public String getUserContact() {
return mUserContact;
}
public String getUserLogin() {
return mUserLogin;
}
public String getUserName() {
return mUserName;
}
public UserState getUserState() {
return mUserState;
}
public boolean isInvisible() {
if (isTransport() || isMUCUser()) {
return true;
}
return false;
}
public boolean isMUCUser() {
return (mTransportState == TSTATE_IS_MUC);
}
public boolean isTransport() {
return (mTransportState == TSTATE_IS_TRANSPORT);
}
public boolean isTransported() {
return (mTransportState == TSTATE_IS_TRANSPORTED);
}
public void setAvatar(byte[] avatar) {
mAvatar = avatar;
}
public void setGroups(GroupList groups) {
mGroups = groups;
}
public void setRessource(String res) {
mRessource = res;
}
public void setUserContact(String userContact) {
mUserContact = userContact;
}
public void setUserLogin(String userLogin) {
mUserLogin = StringUtils.parseBareAddress(userLogin);
}
public void setUserName(String userName) {
mUserName = userName;
}
public void setUserState(UserState userState) {
mUserState = userState;
}
public boolean supportsAudio() {
return false;
}
public boolean supportsVideo() {
return false;
}
public boolean transportCheck(User transport) {
if (getUserLogin().endsWith(transport.getUserLogin())) {
mTransportState = TSTATE_IS_TRANSPORTED;
mTransportType = transport.getTransportType();
return true;
}
return false;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(mUserLogin);
dest.writeString(mRessource);
dest.writeString(mUserName);
dest.writeParcelable(mUserState, flags);
dest.writeParcelable(mGroups, flags);
dest.writeInt(mTransportState);
dest.writeInt(mTransportType);
dest.writeInt(mUnreadMessages);
if (mAvatar != null) {
dest.writeString(Base64.encodeBytes(mAvatar));
} else {
dest.writeString("");
}
dest.writeStringList(mAdditionalInfo);
}
}