/* * 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.database.tables; import java.util.ArrayList; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.vodafone360.people.database.DatabaseHelper; import com.vodafone360.people.datatypes.Identity; import com.vodafone360.people.datatypes.IdentityCapability; import com.vodafone360.people.datatypes.IdentityCapability.CapabilityID; /** * The MyIdentitiesCacheTable class implements a persistent cache of the identities that were * registered by the user. Using it allows to display these identities if the device is restarted * and no network connection is available. */ public class MyIdentitiesCacheTable { /** * The identities cache table name. */ public final static String TABLE_NAME = "MyIndentitiesCache"; /** * Capability flag: no capability. */ public final static int FLAG_CAPABILITY_NONE = 0x0; /** * Capability flag: chat capability. */ public final static int FLAG_CAPABILITY_CHAT = 0x1; /** * Capability flag: mail capability. */ public final static int FLAG_CAPABILITY_MAIL = 0x2; /** * Table fields. */ private static enum Fields { _ID("_id"), NAME("Name"), NETWORK_ID("NetworkId"), USER_NAME("UserName"), CAPABILITIES("Capabilities"); /** * The name of the field as it appears in the database */ private String mField; /** * Constructor * * @param field - The name of the field (see list above) */ private Fields(String field) { mField = field; } /** * @return the name of the field as it appears in the database. */ public String toString() { return mField; } } /** * Creates the table in the database. * * @param database the database where to create the table * @return true if creation is successful, false otherwise */ public static boolean create(SQLiteDatabase database) { DatabaseHelper.trace(true, "MyIdentitiesCacheTable.create()"); StringBuffer buffer = new StringBuffer(); buffer.append("CREATE TABLE IF NOT EXISTS "); buffer.append(TABLE_NAME); buffer.append(" ("); buffer.append(Fields._ID); buffer.append(" INTEGER PRIMARY KEY AUTOINCREMENT, "); buffer.append(Fields.NAME); buffer.append(" TEXT, "); buffer.append(Fields.USER_NAME); buffer.append(" TEXT, "); buffer.append(Fields.NETWORK_ID); buffer.append(" TEXT, "); buffer.append(Fields.CAPABILITIES); buffer.append(" INTEGER);"); try { database.execSQL(buffer.toString()); return true; } catch(Exception e) { DatabaseHelper.trace(true, "MyIdentitiesCacheTable.create() - Exception: "+e); } return false; } /** * Populates the provided ContentValues object with the Identity data. * * Note: the ContentValues object is first cleared before being filled. * * @param values the ContentValues object to populate * @param identity the identity to extract the data from * @return the provided ContentValues object */ private static ContentValues getContentValues(ContentValues values, Identity identity) { int capabilities = FLAG_CAPABILITY_NONE; values.clear(); values.put(Fields.NAME.toString(), identity.mName); values.put(Fields.USER_NAME.toString(), identity.mUserName); values.put(Fields.NETWORK_ID.toString(), identity.mNetwork); if (identity.mCapabilities != null) { for (IdentityCapability cap : identity.mCapabilities) { if (cap.mCapability != null) { switch(cap.mCapability) { case chat: if (cap.mValue) capabilities |= FLAG_CAPABILITY_CHAT; break; case mail: if (cap.mValue) capabilities |= FLAG_CAPABILITY_MAIL; break; // TODO: add the other cases when needed } } } } values.put(Fields.CAPABILITIES.toString(), capabilities); return values; } /** * Persists the provided identities into the client database. * * @param database the database where to save the values * @param identities the identities to save */ public static void setCachedIdentities(SQLiteDatabase database, ArrayList<Identity> identities) { final ContentValues contentValues = new ContentValues(); database.delete(TABLE_NAME, null, null); for (Identity identity : identities) { database.insert(TABLE_NAME, null, getContentValues(contentValues, identity)); } } /** * Retrieves the saved identities. * * @param database the database where to read the values * @param identities the identities array to fill */ public static void getCachedIdentities(SQLiteDatabase database, ArrayList<Identity> identities) { final String[] COLUMNS = { /* 0 */Fields.NAME.toString(), /* 1 */Fields.USER_NAME.toString(), /* 2 */Fields.NETWORK_ID.toString(), /* 3 */Fields.CAPABILITIES.toString() }; Cursor cursor = null; try { cursor = database.query(TABLE_NAME, COLUMNS, null, null, null, null, null); while (cursor.moveToNext()) { final Identity identity = new Identity(); final int capabilities = cursor.getInt(3); identity.mName = cursor.getString(0); identity.mUserName = cursor.getString(1); identity.mNetwork = cursor.getString(2); identity.mCapabilities = getCapabilities(capabilities); identities.add(identity); } } catch(Exception e) { DatabaseHelper.trace(true, "MyIdentitiesCacheTable.getCachedIdentities() - Exception: "+e); } finally { if (cursor != null) { cursor.close(); cursor = null; } } } /** * Gets an array of IdentityCapability from capability flags. * * @param capabilities the capability flags * @return an array of IdentityCapability */ private static ArrayList<IdentityCapability> getCapabilities(int capabilities) { ArrayList<IdentityCapability> capabilitiesList = null; if (capabilities != FLAG_CAPABILITY_NONE) { IdentityCapability cap; capabilitiesList = new ArrayList<IdentityCapability>(); if ((capabilities & FLAG_CAPABILITY_CHAT) == FLAG_CAPABILITY_CHAT) { cap = new IdentityCapability(); cap.mCapability = CapabilityID.chat; cap.mValue = true; capabilitiesList.add(cap); } if ((capabilities & FLAG_CAPABILITY_MAIL) == FLAG_CAPABILITY_MAIL) { cap = new IdentityCapability(); cap.mCapability = CapabilityID.chat; cap.mValue = true; capabilitiesList.add(cap); } } return capabilitiesList; } }