package xmpp.client.service.user; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.packet.Presence; import org.jivesoftware.smack.packet.Presence.Mode; import org.jivesoftware.smack.packet.Presence.Type; import xmpp.client.R; import android.content.Context; import android.os.Parcel; import android.os.Parcelable; import android.provider.ContactsContract; public class UserState implements Parcelable { public static int modeToStatus(Presence.Mode mode) { switch (mode) { case away: return STATUS_IDLE; case dnd: return STATUS_DO_NOT_DISTURB; case xa: return STATUS_AWAY; case chat: case available: default: return STATUS_AVAILABLE; } } private final boolean mOnline; private String mStatusText; private String mAvatarSHA; private int mStatus; public final static int STATUS_INVALID = Integer.MIN_VALUE; public final static int STATUS_INITIALIZING = -4; public final static int STATUS_CONNECTING = -3; public final static int STATUS_LOGGING_IN = -2; public final static int STATUS_LOADING_ROSTER = -1; public final static int STATUS_OFFLINE = ContactsContract.StatusUpdates.OFFLINE; public final static int STATUS_AVAILABLE = ContactsContract.StatusUpdates.AVAILABLE; public final static int STATUS_IDLE = ContactsContract.StatusUpdates.IDLE; public final static int STATUS_DO_NOT_DISTURB = ContactsContract.StatusUpdates.DO_NOT_DISTURB; public final static int STATUS_AWAY = ContactsContract.StatusUpdates.AWAY; public final static int STATUS_INVISIBLE = 10; public static UserState Invalid = new UserState(STATUS_INVALID, null); public static final Parcelable.Creator<UserState> CREATOR = new Parcelable.Creator<UserState>() { @Override public UserState createFromParcel(Parcel in) { return new UserState(in); } @Override public UserState[] newArray(int size) { return new UserState[size]; } }; public static int getStatusIconResourceID(int status) { if (status == STATUS_INVISIBLE || status < 0) { return ContactsContract.StatusUpdates .getPresenceIconResourceId(STATUS_OFFLINE); } return ContactsContract.StatusUpdates.getPresenceIconResourceId(status); } public static int getStatusTextResourceID(int status) { switch (status) { case STATUS_INVISIBLE: return R.string.status_invisible; case STATUS_INITIALIZING: return R.string.process_initializing; case STATUS_LOGGING_IN: return R.string.process_logging_in; case STATUS_LOADING_ROSTER: return R.string.process_loading_roster; case STATUS_CONNECTING: return R.string.process_connecting; case STATUS_AVAILABLE: return R.string.status_available; case STATUS_AWAY: return R.string.status_away; case STATUS_IDLE: return R.string.status_idle; case STATUS_DO_NOT_DISTURB: return R.string.status_busy; case STATUS_OFFLINE: default: return R.string.status_offline; } } public static Presence.Mode statusToMode(int status) { switch (status) { case STATUS_AVAILABLE: return Mode.available; case STATUS_AWAY: return Mode.xa; case STATUS_IDLE: return Mode.away; case STATUS_DO_NOT_DISTURB: return Mode.dnd; } return null; } public UserState(int status, String statusText) { mOnline = (status != STATUS_OFFLINE); if (mOnline) { mStatusText = statusText; mStatus = status; } } private UserState(Parcel in) { mOnline = (Boolean) in.readValue(null); mStatusText = in.readString(); mStatus = in.readInt(); mAvatarSHA = in.readString(); } public UserState(Presence p) { mOnline = (p.getType() == Type.available); if (mOnline) { mStatusText = p.getStatus(); try { mStatus = modeToStatus(p.getMode()); } catch (final NullPointerException ex) { mStatus = STATUS_AVAILABLE; } mAvatarSHA = null; final PacketExtension pe = p.getExtension("vcard-temp:x:update"); if (pe != null) { final String[] sp = pe.toXML().split("<[\\/]*photo>"); if (sp.length >= 3 && !sp[1].isEmpty()) { mAvatarSHA = sp[1]; } } } else { mStatus = STATUS_OFFLINE; } } @Override public int describeContents() { // TODO Auto-generated method stub return 0; } public String getAvatarSHA() { return mAvatarSHA; } public String getCustomStatusText() { return mStatusText; } public int getRealStatus() { return mStatus; } public int getStatus() { if (mStatus == STATUS_LOADING_ROSTER) { return STATUS_AVAILABLE; } if (isTemporaryStatus()) { return STATUS_OFFLINE; } return getRealStatus(); } public int getStatusColorRessourceID() { switch (mStatus) { case STATUS_AVAILABLE: return android.R.color.holo_green_light; case STATUS_IDLE: case STATUS_AWAY: return android.R.color.holo_orange_dark; case STATUS_DO_NOT_DISTURB: return android.R.color.holo_red_light; } return R.color.roster_offline; } public int getStatusIconResourceID() { return getStatusIconResourceID(getStatus()); } public int getStatusPrecedence() { return ContactsContract.StatusUpdates .getPresencePrecedence(getStatus()); } public CharSequence getStatusText(Context context) { if (mStatusText == null || mStatusText.isEmpty() || isTemporaryStatus()) { return context.getText(getStatusTextResourceID()); } return mStatusText; } public String getStatusText(String altText) { if (isTemporaryStatus()) { return "Loading..."; // TODO This should be done better! } else if (mStatusText == null || mStatusText.isEmpty()) { return altText; } else { return mStatusText; } } public int getStatusTextResourceID() { return getStatusTextResourceID(mStatus); } public boolean isOnline() { return mOnline; } public boolean isTemporaryStatus() { if (mStatus < 0) { return true; } else { return false; } } public Presence toPresence() { final Presence presence = new Presence(Type.available); if (isOnline() && !isTemporaryStatus()) { presence.setMode(statusToMode(mStatus)); } if (mStatusText != null) { presence.setStatus(mStatusText); } presence.setPriority(1); return presence; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeValue(mOnline); dest.writeString(mStatusText); dest.writeInt(mStatus); dest.writeString(mAvatarSHA); } }