/*
* 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.service.aidl;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;
import com.vodafone360.people.Settings;
import com.vodafone360.people.SettingsManager;
import com.vodafone360.people.database.DatabaseHelper;
import com.vodafone360.people.database.tables.ActivitiesTable;
import com.vodafone360.people.database.tables.ContactChangeLogTable;
import com.vodafone360.people.database.tables.ContactDetailsTable;
import com.vodafone360.people.database.tables.ContactGroupsTable;
import com.vodafone360.people.database.tables.ContactSourceTable;
import com.vodafone360.people.database.tables.ContactSummaryTable;
import com.vodafone360.people.database.tables.ContactsTable;
import com.vodafone360.people.database.tables.ConversationsTable;
import com.vodafone360.people.database.tables.GroupsTable;
import com.vodafone360.people.database.tables.NativeChangeLogTable;
import com.vodafone360.people.database.tables.PresenceTable;
import com.vodafone360.people.database.tables.StateTable;
import com.vodafone360.people.utils.LogUtils;
/***
* This is an experimental AIDL API, which is currently unsupported by Vodafone
* and disabled by default.
*
* This class provides outside access to the entire 360-Engine database
* for 3rd party processes. Currently, the only access control is the
* on/off switch set in config.properties at build time, but we plan
* to implement a new model for this. This is a basic content provider.
*
* Since the DatabaseProvider can be called by any other process
* (and thus any other thread), we need to implement methods accessible
* from outside as thread-safe.
*/
public class DatabaseProvider extends ContentProvider {
/** Content URI. **/
public static final Uri CONTENT_URI = Uri.parse("content://"
+ Intents.DATABASE_URI);
/**
* List of table names, used to check whether the incoming query matches to
* any table in the database.
*/
private static final String [] TABLE_NAMES = {
ActivitiesTable.TABLE_NAME,
ContactChangeLogTable.TABLE_NAME,
ContactDetailsTable.TABLE_NAME,
ContactGroupsTable.TABLE_NAME,
ContactSourceTable.TABLE_NAME,
ContactsTable.TABLE_NAME,
ContactSummaryTable.TABLE_NAME,
ConversationsTable.TABLE_NAME,
GroupsTable.TABLE_NAME,
NativeChangeLogTable.TABLE_NAME,
PresenceTable.TABLE_NAME,
StateTable.TABLE_NAME
};
/** Android context. **/
private Context mContext;
/** Reference to DatabaseHelper. **/
private DatabaseHelper mDatabaseHelper;
/***
* Delete entries in the database. Not yet supported.
*
* @param uri Not yet supported.
* @param selection Not yet supported.
* @param selectionArgs Not yet supported.
* @return Not yet supported.
*/
@Override
public final int delete(final Uri uri, final String selection,
final String[] selectionArgs) {
return 0;
}
@Override
public final String getType(final Uri uri) {
return "unsupported";
}
/***
* Insert entries in the database. Not yet supported.
*
* @param uri Not yet supported.
* @param values Not yet supported.
* @return Not yet supported.
*/
@Override
public final Uri insert(final Uri uri, final ContentValues values) {
return null;
}
/***
* Create the DatabaseProvider.
*
* @return TRUE if creation was successful.
*/
@Override
public final boolean onCreate() {
mContext = getContext();
mDatabaseHelper = new DatabaseHelper(mContext);
return mDatabaseHelper != null;
}
/**
* Allows direct access to the 360 Service database. A properly formulated
* query will allow you to get any data you want from the service. Simply
* use the table name (available from the documentation, or checking the
* array at the top of this class).
*
* Example query:
* "content://com.vodafone360.people.service.aidl.databaseaccess/Activities"
*
* This method is synchronised, as we need it to be thread safe. I.e.
* several concurrent queries could be made from multiple processes.
*
* @param uri Database URI.
* @param projection Database query projection.
* @param selection Database query selection.
* @param selectionArgs Database query selectionArgs.
* @param sortOrder Database query sortOrder.
* @return Cursor containing database query result.
*/
@Override
public final Cursor query(final Uri uri, final String[] projection,
final String selection, final String[] selectionArgs,
final String sortOrder) {
LogUtils.logI("DatabaseProvider.query() Received incoming query uri["
+ uri + "]");
if (!SettingsManager.getBooleanProperty(Settings.ENABLE_AIDL_KEY)) {
LogUtils.logI("DatabaseProvider.query() 360 Engine database not "
+ "available to third parties (set at build time)");
throw new RuntimeException("Looks like you tried to query the "
+ "com.vodafone360.people database, but access was "
+ "disabled at build time.");
}
/**
* Return the result of a direct query to the database on the
* appropriate table (set by URI).
*/
String queriedTable = uri.getPath();
if (queriedTable.startsWith("/")) {
queriedTable = queriedTable.replaceFirst("/", "");
}
final SQLiteQueryBuilder qBuilder = new SQLiteQueryBuilder();
boolean matchedATable = false;
for (String table : TABLE_NAMES) {
if (table.equals(queriedTable)) {
LogUtils.logI("DatabaseProvider.query() Matched incoming URI "
+ "query to the [" + table + "] table.");
qBuilder.setTables(queriedTable);
matchedATable = true;
break;
}
}
/*
* If we found a table, perform the query as expected; otherwise throw
* an exception. This might crash the client process, but
* com.vodafone360.people is safe, i.e. the Exception gets parceled up
* and passed out.
*/
if (matchedATable) {
return qBuilder.query(mDatabaseHelper.getReadableDatabase(),
projection, selection, selectionArgs, null, null,
sortOrder);
} else {
LogUtils.logE("DatabaseProvider.query() Oops! Someone tried to "
+ "query a database table that wasn't there; passing out "
+ "an exception");
throw new IllegalArgumentException("DatabaseProvider.query() "
+ "Couldn't find table [" + queriedTable + "], did you "
+ "properly form your query?");
}
}
/***
* Updates entries in the database. Not yet supported.
*
* @param uri Not yet supported.
* @param values Not yet supported.
* @param selection Not yet supported.
* @param selectionArgs Not yet supported.
* @return Not yet supported.
*/
@Override
public final int update(final Uri uri, final ContentValues values,
final String selection, final String[] selectionArgs) {
return 0;
}
}