/*
* 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 android.os.Parcel;
import android.os.Parcelable;
import com.vodafone360.people.datatypes.ContactDetail.DetailKeyTypes;
/**
* BaseDataType encapsulating ContactSummary.
*/
public class ContactSummary implements Parcelable {
/**
* Enumeration of online (Presence) status values.
*/
public enum OnlineStatus {
/**
* The order of items below is important,
* because the decision upon setting user overall presence status is taken
* based on the "strongest" (biggest) presence status of all user TPC networks.
* I.e. if google=offline, mobile=invisible, hyves=online -> overall: online.
* There's normally a "for" loopto find the max element.
*/
OFFLINE("offline"), // the "lowest" status goes first
INVISIBLE("invisible"),
IDLE("idle"),
ONLINE("online"); // the "highest" status
/** The name of the field as it appears in the database. **/
private String mOnlineStatus;
/**
* Construct OnlineStatus item from supplied String
*
* @param s String value for OnlineStatus item.
*/
private OnlineStatus(String field) {
mOnlineStatus = field;
}
/** {@inheritDoc} */
@Override
public String toString() {
return mOnlineStatus;
}
/**
* Obtain OnlineStatus value for supplied String.
*
* @param String identifying online status.
* @return OnlineStatus value for supplied String, null if OnlineStatus
* does not exist.
*/
public static OnlineStatus getValue(String value) {
try {
return valueOf(value.toUpperCase());
} catch (Exception e) {
return null;
}
}
/**
* Obtain OnlineStatus value for supplied index.
*
* @index Index of item in array array of OnlineStatus items.
* @return OnlineStatus value for supplied index, null if OnlineStatus
* does not exist.
*/
public static OnlineStatus getValue(int index) {
try {
return values()[index];
} catch (Exception e) {
return null;
}
}
}
/**
* Enumeration of types available for ContactSummary's 'alt' field.
*/
public enum AltFieldType {
UNUSED,
NAME,
STATUS
}
public Long summaryID = null;
public Long localContactID = null;
public String formattedName = null;
public String statusText = null;
public AltFieldType altFieldType = null;
public DetailKeyTypes altDetailType = null;
public Integer nativeContactId = null;
public OnlineStatus onlineStatus = null;
public boolean friendOfMine = false;
public boolean pictureLoaded = false;
/** Name of Social Networking Site this Contact is associated with. */
public String sns = null;
/**
* Sync to phone flag indicates whether Contact is sync'ed to Phonebook
* (i.e. Native)
*/
public boolean synctophone = false;
/** {@inheritDoc} */
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("SummaryID: ");
sb.append(summaryID);
sb.append("ContactID: "); sb.append(localContactID);
sb.append("\nName: "); sb.append(formattedName);
sb.append("\nStatus: "); sb.append(statusText);
sb.append("\nAlt Field Type: "); sb.append(altFieldType);
sb.append("\nAlt Detail Type: "); sb.append(altDetailType);
sb.append("\nNative Contact ID: "); sb.append(nativeContactId);
sb.append("\nOnline status: "); sb.append(onlineStatus);
sb.append("\nFriend of mine: "); sb.append(friendOfMine);
sb.append("\nProfile picture loaded: "); sb.append(pictureLoaded);
sb.append("\nSocial Networking Site: "); sb.append(sns);
sb.append("\nSynctophone: "); sb.append(synctophone);
return sb.toString();
}
/**
* Enumeration of items written to ContactSummmary Parcel.
*/
private enum MemberData {
LOCAL_CONTACT_ID,
FORMATTED_NAME,
STATUS_TEXT,
ALT_FIELD_TYPE,
ALT_DETAIL_TYPE,
NATIVE_ID,
ONLINE_STATUS,
SNS;
}
private final static int NO_OF_BOOLEANS = 3;
/**
* Read ContactSummary from Parcel
*
* @param in Parcel containing ContactSummary.
*/
private void readFromParcel(Parcel in) {
localContactID = null;
formattedName = null;
statusText = null;
altFieldType = null;
altDetailType = null;
nativeContactId = null;
friendOfMine = false;
pictureLoaded = false;
synctophone = false;
boolean[] validDataList = new boolean[MemberData.values().length];
in.readBooleanArray(validDataList);
if (validDataList[MemberData.LOCAL_CONTACT_ID.ordinal()]) {
localContactID = in.readLong();
}
if (validDataList[MemberData.FORMATTED_NAME.ordinal()]) {
formattedName = in.readString();
}
if (validDataList[MemberData.STATUS_TEXT.ordinal()]) {
statusText = in.readString();
}
if (validDataList[MemberData.ALT_FIELD_TYPE.ordinal()]) {
final int val = in.readInt();
if (val < AltFieldType.values().length) {
altFieldType = AltFieldType.values()[val];
}
}
if (validDataList[MemberData.ALT_DETAIL_TYPE.ordinal()]) {
final int val = in.readInt();
if (val < ContactDetail.DetailKeyTypes.values().length) {
altDetailType = ContactDetail.DetailKeyTypes.values()[val];
}
}
if (validDataList[MemberData.NATIVE_ID.ordinal()]) {
nativeContactId = in.readInt();
}
if (validDataList[MemberData.ONLINE_STATUS.ordinal()]) {
final int val = in.readInt();
if (val < OnlineStatus.values().length) {
onlineStatus = OnlineStatus.values()[val];
}
}
boolean[] boolArray = new boolean[NO_OF_BOOLEANS];
in.readBooleanArray(boolArray);
friendOfMine = boolArray[0];
pictureLoaded = boolArray[1];
synctophone = boolArray[2];
if (validDataList[MemberData.SNS.ordinal()]) {
sns = in.readString();
}
}
/** {@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 (localContactID != null) {
validDataList[MemberData.LOCAL_CONTACT_ID.ordinal()] = true;
dest.writeLong(localContactID);
}
if (formattedName != null) {
validDataList[MemberData.FORMATTED_NAME.ordinal()] = true;
dest.writeString(formattedName);
}
if (statusText != null) {
validDataList[MemberData.STATUS_TEXT.ordinal()] = true;
dest.writeString(statusText);
}
if (altFieldType != null) {
validDataList[MemberData.ALT_FIELD_TYPE.ordinal()] = true;
dest.writeInt(altFieldType.ordinal());
}
if (altDetailType != null) {
validDataList[MemberData.ALT_DETAIL_TYPE.ordinal()] = true;
dest.writeInt(altDetailType.ordinal());
}
if (nativeContactId != null) {
validDataList[MemberData.NATIVE_ID.ordinal()] = true;
dest.writeInt(nativeContactId);
}
if (onlineStatus != null) {
validDataList[MemberData.ONLINE_STATUS.ordinal()] = true;
dest.writeInt(onlineStatus.ordinal());
}
boolean[] boolArray = {
friendOfMine, pictureLoaded, synctophone
};
dest.writeBooleanArray(boolArray);
if (sns != null) {
validDataList[MemberData.SNS.ordinal()] = true;
dest.writeString(sns);
}
int currentPos = dest.dataPosition();
dest.setDataPosition(validDataPos);
dest.writeBooleanArray(validDataList); // real array
dest.setDataPosition(currentPos);
}
/**
* Make a copy of supplied ContactSummary
*
* @param source ContactSummary item to copy.
*/
public void copy(ContactSummary source) {
android.os.Parcel _data = android.os.Parcel.obtain();
source.writeToParcel(_data, 0);
_data.setDataPosition(0);
readFromParcel(_data);
}
}