/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the Common Development
* and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at
* src/com/vodafone360/people/VODAFONE.LICENSE.txt or
* http://github.com/360/360-Engine-for-Android
* See the License for the specific language governing permissions and
* limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each file and
* include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt.
* If applicable, add the following below this CDDL HEADER, with the fields
* enclosed by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
* Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved.
* Use is subject to license terms.
*/
package com.vodafone360.people.datatypes;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import android.os.Parcel;
import android.os.Parcelable;
import com.vodafone360.people.utils.LogUtils;
/**
* BaseDataType encapsulating user profile information retrieved from People
* server.
*/
public class UserProfile extends BaseDataType implements Parcelable {
/**
* Tags for fields associated with UserProfile items.
*/
private enum Tags {
USER_ID("userid"),
PROFILE_PATH("profilepath"),
CONTACT_ID("contactid"),
SOURCES("sources"),
GENDER("gender"),
DETAIL_LIST("detaillist"),
DETAIL("detail"),
ME("me"),
FRIEND_OF_FRIEND_LIST("foflist"),
ABOUT_ME("aboutme"),
FRIEND("friend"),
UPDATED("updated");
private final String tag;
/**
* Constructor creating Tags item for specified String.
*
* @param s String value for Tags item.
*/
private Tags(String s) {
tag = s;
}
/**
* String value associated with Tags item.
*
* @return String value for Tags item.
*/
private String tag() {
return tag;
}
}
public Long userID;
public String profilePath;
public Long contactID;
public List<String> sources;
public Integer gender;
public final List<ContactDetail> details = new ArrayList<ContactDetail>();
private Boolean isMe;
private List<Long> fofList;
public String aboutMe;
protected Boolean friendOfMine;
public Long updated;
/**
* Find Tags item for specified String.
*
* @param tag String value to search for in Tag
* @return Tags item for specified String, NULL otherwise.
*/
private Tags findTag(String tag) {
for (Tags tags : Tags.values()) {
if (tag.compareTo(tags.tag()) == 0) {
return tags;
}
}
return null;
}
/** {@inheritDoc} */
@Override
public int getType() {
return USER_PROFILE_DATA_TYPE;
}
/** {@inheritDoc} */
@Override
public String toString() {
Date time = null;
if (updated != null) {
time = new Date(updated * 1000);
} else {
time = new Date(0);
}
final StringBuffer sb = new StringBuffer("--\nUser Profile data:");
sb.append("\n\tUser ID: "); sb.append(userID);
sb.append("\n\tProfile Path: "); sb.append(profilePath);
sb.append("\n\tContact ID: "); sb.append(contactID);
sb.append("\n\tGender: "); sb.append(gender);
sb.append("\n\tIs Me: "); sb.append(isMe);
sb.append("\n\tAbout me: "); sb.append(aboutMe);
sb.append("\n\tFriend of mine: "); sb.append(friendOfMine);
sb.append("\n\tupdated: "); sb.append(updated);
sb.append(" Date: "); sb.append(time.toGMTString());
sb.append("\n");
if (sources != null) {
sb.append("Sources ("); sb.append(sources.size());
sb.append("): ");
for (int i = 0; i < sources.size(); i++) {
sb.append(sources.get(i)); sb.append(",");
}
}
if (fofList != null) {
sb.append("Group id list = [");
for (int i = 0; i < fofList.size(); i++) {
sb.append(fofList.get(i));
if (i < fofList.size() - 1) {
sb.append(",");
}
}
}
sb.append("Contact details ("); sb.append(details.size()); sb.append("):\n");
for (int i = 0; i < details.size(); i++) {
sb.append(details.get(i).toString() + "\n");
}
sb.append("\n--------------------------------------------------");
return sb.toString();
}
/**
* Create UserProfile from Hashtable.
*
* @param hash Hashtable containing User Profile information.
* @return UserProfile generated from Hashtable.
*/
public static UserProfile createFromHashtable(Hashtable<String, Object> hash) {
UserProfile profile = new UserProfile();
Enumeration<String> e = hash.keys();
while (e.hasMoreElements()) {
String key = e.nextElement();
Object value = hash.get(key);
Tags tag = profile.findTag(key);
profile.setValue(tag, value);
}
return profile;
}
/**
* Sets the value of the member data item associated with the specified tag.
*
* @param tag Current tag
* @param value Value associated with the tag
*/
private void setValue(Tags tag, Object value) {
switch (tag) {
case USER_ID:
userID = (Long)value;
break;
case PROFILE_PATH:
profilePath = (String)value.toString();
break;
case CONTACT_ID:
contactID = (Long)value;
break;
case SOURCES:
if (sources == null) {
sources = new ArrayList<String>();
}
@SuppressWarnings("unchecked")
Vector<String> vals = (Vector<String>)value;
for (String source : vals) {
sources.add(source);
}
break;
case GENDER:
if (gender == null) {
gender = (Integer)value;
}
break;
case DETAIL_LIST:
@SuppressWarnings("unchecked")
Vector<Hashtable<String, Object>> detailsList = (Vector<Hashtable<String, Object>>)value;
for (Hashtable<String, Object> detailHashtable : detailsList) {
try {
// let's try to create the ContactDetail
// if failing, the detail will just be skipped
final ContactDetail detail = new ContactDetail();
detail.createFromHashtable(detailHashtable);
details.add(detail);
} catch (Exception e) {
LogUtils.logE("UserProfile.setValue(), the following error occured while adding a detail: "+e);
}
}
break;
case DETAIL:
break;
case ME:
isMe = (Boolean)value;
break;
case FRIEND_OF_FRIEND_LIST:
@SuppressWarnings("unchecked")
Vector<Long> gL = (Vector<Long>)value;
if (fofList == null) {
fofList = new ArrayList<Long>();
}
for (Long l : gL) {
fofList.add(l);
}
break;
case ABOUT_ME:
aboutMe = (String)value;
break;
case FRIEND:
friendOfMine = (Boolean)value;
break;
case UPDATED:
updated = (Long)value;
break;
default:
LogUtils.logW("setValue: Unknown tag - " + tag + "[" + value + "]");
}
}
/**
* Enumeration of items written to UserProfile Parcel.
*/
private enum MemberData {
USERID,
PROFILEPATH,
CONTACTID,
SOURCES,
GENDER,
ISME,
FOFLIST,
ABOUTME,
FRIENDOFMINE,
UPDATED;
}
/** {@inheritDoc} */
@Override
public int describeContents() {
return 1;
}
/** {@inheritDoc} */
@Override
public void writeToParcel(Parcel dest, int flags) {
boolean[] validDataList = new boolean[MemberData.values().length];
int validDataPos = dest.dataPosition();
dest.writeBooleanArray(validDataList); // Placeholder for real array.
if (userID != null) {
validDataList[MemberData.USERID.ordinal()] = true;
dest.writeLong(userID);
}
if (profilePath != null) {
validDataList[MemberData.PROFILEPATH.ordinal()] = true;
dest.writeString(profilePath);
}
if (contactID != null) {
validDataList[MemberData.CONTACTID.ordinal()] = true;
dest.writeLong(contactID);
}
if (sources != null && sources.size() > 0) {
validDataList[MemberData.SOURCES.ordinal()] = true;
dest.writeStringList(sources);
}
if (gender != null) {
validDataList[MemberData.GENDER.ordinal()] = true;
dest.writeInt(gender);
}
if (isMe != null) {
validDataList[MemberData.ISME.ordinal()] = true;
dest.writeByte((byte)(isMe ? 1 : 0));
}
if (fofList != null && fofList.size() > 0) {
validDataList[MemberData.FOFLIST.ordinal()] = true;
long[] fofListArray = new long[fofList.size()];
for (int i = 0; i < fofList.size(); i++) {
fofListArray[i] = fofList.get(i);
}
dest.writeLongArray(fofListArray);
}
if (aboutMe != null) {
validDataList[MemberData.ABOUTME.ordinal()] = true;
dest.writeString(aboutMe);
}
if (friendOfMine != null) {
validDataList[MemberData.FRIENDOFMINE.ordinal()] = true;
dest.writeByte((byte)(friendOfMine ? 1 : 0));
}
if (updated != null) {
validDataList[MemberData.UPDATED.ordinal()] = true;
dest.writeLong(updated);
}
int currentPos = dest.dataPosition();
dest.setDataPosition(validDataPos);
dest.writeBooleanArray(validDataList); // Real array.
dest.setDataPosition(currentPos);
dest.writeInt(details.size());
for (ContactDetail detail : details) {
detail.writeToParcel(dest, 0);
}
}
}