/******************************************************************************* * Software Name : RCS IMS Stack * * Copyright (C) 2010 France Telecom S.A. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.orangelabs.rcs.provider.eventlogs; import com.orangelabs.rcs.provider.RichProviderHelper; import com.orangelabs.rcs.provider.ipcall.IPCallData; import com.orangelabs.rcs.provider.ipcall.IPCallProvider; import com.orangelabs.rcs.provider.messaging.RichMessagingData; import com.orangelabs.rcs.provider.messaging.RichMessagingProvider; import com.orangelabs.rcs.provider.sharing.RichCallData; import com.orangelabs.rcs.provider.sharing.RichCallProvider; import com.orangelabs.rcs.service.api.client.eventslog.EventsLogApi; import com.orangelabs.rcs.utils.MimeManager; import com.orangelabs.rcs.utils.PhoneUtils; import com.orangelabs.rcs.utils.logger.Logger; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.MatrixCursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteQueryBuilder; import android.net.Uri; import android.net.Uri.Builder; import android.provider.BaseColumns; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Virtual provider that enables EventLogs queries to be done in Core with access to SQLiteDatabase object. * * Events are from : SMS, MMS, File Transfer, Chat, Content Sharing tables * * @author mhsm6403 */ public class EventLogProvider extends ContentProvider { private Logger logger = Logger.getLogger(this.getClass().getName()); private SQLiteOpenHelper openHelper; /** * The uriMatcher that define all cases to be treated. Requests are not made on an unique table in an unique database so we define Uris to implement * each cases of filters. */ private static final UriMatcher uriMatcher; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_SPAM_BOX), EventsLogApi.MODE_SPAM_BOX); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_ONE_TO_ONE_CHAT), EventsLogApi.MODE_ONE_TO_ONE_CHAT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_GROUP_CHAT), EventsLogApi.MODE_GROUP_CHAT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_CHAT_FT_SMS), EventsLogApi.MODE_IPCALL_RC_CHAT_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_CHAT_FT), EventsLogApi.MODE_IPCALL_RC_CHAT_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_CHAT_SMS), EventsLogApi.MODE_IPCALL_RC_CHAT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_CHAT), EventsLogApi.MODE_IPCALL_RC_CHAT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_FT_SMS), EventsLogApi.MODE_IPCALL_RC_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_FT), EventsLogApi.MODE_IPCALL_RC_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC_SMS), EventsLogApi.MODE_IPCALL_RC_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_RC), EventsLogApi.MODE_IPCALL_RC); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_CHAT_FT_SMS), EventsLogApi.MODE_IPCALL_CHAT_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_CHAT_FT), EventsLogApi.MODE_IPCALL_CHAT_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_CHAT_SMS), EventsLogApi.MODE_IPCALL_CHAT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_CHAT), EventsLogApi.MODE_IPCALL_CHAT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_FT_SMS), EventsLogApi.MODE_IPCALL_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_FT), EventsLogApi.MODE_IPCALL_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL_SMS), EventsLogApi.MODE_IPCALL_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_IPCALL), EventsLogApi.MODE_IPCALL); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_CHAT_FT_SMS), EventsLogApi.MODE_RC_CHAT_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_CHAT_FT), EventsLogApi.MODE_RC_CHAT_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_CHAT_SMS), EventsLogApi.MODE_RC_CHAT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_CHAT), EventsLogApi.MODE_RC_CHAT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_FT_SMS), EventsLogApi.MODE_RC_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_FT), EventsLogApi.MODE_RC_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC_SMS), EventsLogApi.MODE_RC_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_RC), EventsLogApi.MODE_RC); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_CHAT_FT_SMS), EventsLogApi.MODE_CHAT_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_CHAT_FT), EventsLogApi.MODE_CHAT_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_CHAT_SMS), EventsLogApi.MODE_CHAT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_CHAT), EventsLogApi.MODE_CHAT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_FT_SMS), EventsLogApi.MODE_FT_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_FT), EventsLogApi.MODE_FT); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_SMS), EventsLogApi.MODE_SMS); uriMatcher.addURI("com.orangelabs.rcs.eventlogs", Integer.toString(EventsLogApi.MODE_NONE), EventsLogApi.MODE_NONE); } @Override public boolean onCreate() { if (logger.isActivated()){ logger.debug("onCreate()"); } if(RichProviderHelper.getInstance()==null){ RichProviderHelper.createInstance(getContext()); } this.openHelper = RichProviderHelper.getInstance(); return true; } /** * Not used */ @Override public String getType(Uri uri) { return null; } /** * Not used */ @Override public Uri insert(Uri uri, ContentValues values) { return null; } /** * Build a Date sorted Cursor which contains event logs of the mobile for a specific contact. * * This method is only called with uris from uriMatcher. * Each one defines a state of the eventlog filter and therefore aggregates events of selected types. * * selection parameter is specially build : " IN ('phonenumber1','phonenumber2'...)" Must not be null * sortOrder must be (EventLogData.KEY_EVENT_SESSION_ID+ " DESC , "+EventLogData.KEY_EVENT_DATE + " DESC ") */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrderOriginal) { SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); SQLiteDatabase db = openHelper.getWritableDatabase(); String limit = null; String sortOrder = EventLogData.KEY_EVENT_SESSION_ID + " DESC , " + EventLogData.KEY_EVENT_DATE + " DESC "; Cursor sortCursor = null; Cursor unionCursor = null; Cursor callCursor = null; Cursor smsCursor = null; String unionQuery = null; String richMessagingSelectQuery = null; String richCallSelectQuery = null; String ipCallSelectQuery = null; int match = uriMatcher.match(uri); switch (match) { case EventsLogApi.MODE_SPAM_BOX: String extraSelection = ""; if (selection != null && selection.length() > 0) { extraSelection += " AND "; } else { selection = ""; } // Do not take the "terminated" entries extraSelection += "NOT ((type = " + EventsLogApi.TYPE_CHAT_SYSTEM_MESSAGE + ") AND ((status = " + EventsLogApi.STATUS_TERMINATED + " ) OR (status = " + EventsLogApi.STATUS_TERMINATED_BY_REMOTE + ") OR (status = " + EventsLogApi.STATUS_TERMINATED_BY_USER + ")))"; // Filter the logs where this contact was involved in a group chat // with us extraSelection += " AND NOT ( type = " + EventsLogApi.TYPE_GROUP_CHAT_SYSTEM_MESSAGE + " OR type = " + EventsLogApi.TYPE_INCOMING_GROUP_CHAT_MESSAGE + " OR type = " + EventsLogApi.TYPE_OUTGOING_GROUP_CHAT_MESSAGE + " )"; // Take only the spam messages extraSelection += " AND ( " + RichMessagingData.KEY_IS_SPAM + "=" + EventsLogApi.MESSAGE_IS_SPAM + " )"; if (sortOrderOriginal != null && sortOrderOriginal.length() > 0) { sortOrder = sortOrderOriginal; } else { sortOrder = EventLogData.KEY_EVENT_SESSION_ID + " DESC , " + EventLogData.KEY_EVENT_DATE + " DESC "; } richMessagingSelectQuery = buildChatQuery(selection + extraSelection, false, true); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_ONE_TO_ONE_CHAT: // Do not take the "terminated" entries extraSelection = " AND NOT ((type = " + EventsLogApi.TYPE_CHAT_SYSTEM_MESSAGE + ") AND ((status = " + EventsLogApi.STATUS_TERMINATED + ") OR (status = " + EventsLogApi.STATUS_TERMINATED_BY_REMOTE + ") OR (status = " + EventsLogApi.STATUS_TERMINATED_BY_USER + ")))"; // Filter the logs where this contact was involved in a group chat // with us extraSelection += " AND NOT ( type = " + EventsLogApi.TYPE_GROUP_CHAT_SYSTEM_MESSAGE + " OR type = " + EventsLogApi.TYPE_INCOMING_GROUP_CHAT_MESSAGE + " OR type = " + EventsLogApi.TYPE_OUTGOING_GROUP_CHAT_MESSAGE + " )"; // Do not take the spam messages extraSelection += " AND NOT( " + RichMessagingData.KEY_IS_SPAM + "=" + EventsLogApi.MESSAGE_IS_SPAM + " )"; if (sortOrderOriginal != null) { sortOrder = sortOrderOriginal; } else { sortOrder = EventLogData.KEY_EVENT_SESSION_ID + " ASC , " + EventLogData.KEY_EVENT_DATE + " ASC "; } richMessagingSelectQuery = buildChatQuery(selection + extraSelection, false, false); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_GROUP_CHAT: extraSelection = " AND NOT type = " + EventsLogApi.TYPE_GROUP_CHAT_SYSTEM_MESSAGE; if (sortOrderOriginal != null) sortOrder = sortOrderOriginal; else sortOrder = EventLogData.KEY_EVENT_SESSION_ID + " ASC , " + EventLogData.KEY_EVENT_DATE + " ASC "; richMessagingSelectQuery = buildChatQuery(selection + extraSelection, false, false); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_NONE: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Build a SortCursor with all cursors sorted by Date */ sortCursor = new SortCursor(new Cursor[] { unionCursor, callCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_RC_CHAT_FT_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_RC_CHAT_FT: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_RC_CHAT_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_RC_CHAT: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_RC_FT_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_RC_FT: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_RC_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_RC: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richCallSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_CHAT_FT_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_CHAT_FT: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_CHAT_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_CHAT: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_FT_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL_FT: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); // Union Query unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_IPCALL_SMS: /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); // Union Query unionQuery = builder.buildUnionQuery( new String[] { ipCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_IPCALL: logger.debug("case IPCall"); /* Query for IPCall */ ipCallSelectQuery = buildIPCallQuery(selection); unionQuery = builder.buildUnionQuery( new String[] { ipCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_RC_CHAT_FT_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_RC_CHAT_FT: /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_RC_CHAT_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_RC_CHAT: /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_RC_FT_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_RC_FT: /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery(new String[] { richMessagingSelectQuery, richCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_RC_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery( new String[] { richCallSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_RC: /* Query for RichCALL */ richCallSelectQuery = buildRichCallQuery(selection); unionQuery = builder.buildUnionQuery( new String[] { richCallSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_CHAT_FT_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_CHAT_FT: /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, false); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_CHAT_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_CHAT: richMessagingSelectQuery = buildRichMessagingQuery(selection, false, true); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_FT_SMS: /* Query the sms/mms table */ smsCursor = queryMmsSmsTable(selection, sortOrder); /* Query for Rich Messaging */ richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); unionCursor = db.rawQuery(unionQuery, null); sortCursor = new SortCursor( new Cursor[] { unionCursor, smsCursor }, EventLogData.KEY_EVENT_DATE, SortCursor.TYPE_NUMERIC, false); break; case EventsLogApi.MODE_FT: richMessagingSelectQuery = buildRichMessagingQuery(selection, true, false); unionQuery = builder .buildUnionQuery(new String[] { richMessagingSelectQuery }, sortOrder, limit); sortCursor = db.rawQuery(unionQuery, null); break; case EventsLogApi.MODE_SMS: /* Query the sms/mms table */ sortCursor = queryMmsSmsTable(selection, sortOrder); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } // Register the contexts ContentResolver to be notified if // the cursor result set changes. if (sortCursor != null) { sortCursor.setNotificationUri(getContext().getContentResolver(), uri); } // Return a cursor to the query result return sortCursor; } /** * Not used */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } private static String KEY_SMS_ADDRESS = "address"; private static String KEY_SMS_DATE = "date"; private static String KEY_SMS_BODY = "body"; private static String KEY_SMS_TYPE = "type"; private static String KEY_SMS_STATUS = "status"; private static String[] smsProjection = new String[]{ BaseColumns._ID+" AS "+EventLogData.KEY_EVENT_ROW_ID, "("+EventsLogApi.TYPE_INCOMING_SMS+"-1+"+KEY_SMS_TYPE+")"+ " AS "+ EventLogData.KEY_EVENT_TYPE, BaseColumns._ID+" AS "+EventLogData.KEY_EVENT_SESSION_ID, KEY_SMS_DATE+ " AS "+ EventLogData.KEY_EVENT_DATE, KEY_SMS_ADDRESS+" AS "+EventLogData.KEY_EVENT_CONTACT, KEY_SMS_STATUS+ " AS "+ EventLogData.KEY_EVENT_STATUS, KEY_SMS_BODY+ " AS "+ EventLogData.KEY_EVENT_DATA, KEY_SMS_ADDRESS+" AS "+EventLogData.KEY_EVENT_MESSAGE_ID, "\'"+EventLogData.SMS_MIMETYPE+ "\' AS "+ EventLogData.KEY_EVENT_MIMETYPE, KEY_SMS_ADDRESS+" AS "+EventLogData.KEY_EVENT_NAME, KEY_SMS_ADDRESS+" AS "+EventLogData.KEY_EVENT_SIZE, KEY_SMS_ADDRESS+" AS "+EventLogData.KEY_EVENT_TOTAL_SIZE, KEY_SMS_ADDRESS+" AS "+EventLogData.KEY_EVENT_IS_SPAM }; /* RCS projections */ private static String [] unionRichMessagingColumns = new String[]{ RichMessagingData.KEY_ID+" AS "+EventLogData.KEY_EVENT_ROW_ID, RichMessagingData.KEY_TYPE+" AS "+EventLogData.KEY_EVENT_TYPE, RichMessagingData.KEY_CHAT_SESSION_ID+" AS "+EventLogData.KEY_EVENT_SESSION_ID, RichMessagingData.KEY_TIMESTAMP+" AS "+EventLogData.KEY_EVENT_DATE, RichMessagingData.KEY_CONTACT+" AS "+EventLogData.KEY_EVENT_CONTACT, RichMessagingData.KEY_STATUS+" AS "+EventLogData.KEY_EVENT_STATUS, RichMessagingData.KEY_DATA+" AS "+EventLogData.KEY_EVENT_DATA, RichMessagingData.KEY_MESSAGE_ID+" AS "+EventLogData.KEY_EVENT_MESSAGE_ID, RichMessagingData.KEY_MIME_TYPE+" AS "+EventLogData.KEY_EVENT_MIMETYPE, RichMessagingData.KEY_NAME+" AS "+EventLogData.KEY_EVENT_NAME, RichMessagingData.KEY_SIZE+" AS "+EventLogData.KEY_EVENT_SIZE, RichMessagingData.KEY_TOTAL_SIZE+" AS "+EventLogData.KEY_EVENT_TOTAL_SIZE, RichMessagingData.KEY_IS_SPAM+" AS "+EventLogData.KEY_EVENT_IS_SPAM, RichMessagingData.KEY_CHAT_ID + " AS " + EventLogData.KEY_EVENT_CHAT_ID }; private static Set<String> columnsPresentInRichMessagingTable = new HashSet<String>(Arrays.asList(new String[]{ // Fields for chat RichMessagingData.KEY_ID, RichMessagingData.KEY_TYPE, RichMessagingData.KEY_CHAT_SESSION_ID, RichMessagingData.KEY_TIMESTAMP, RichMessagingData.KEY_CONTACT, RichMessagingData.KEY_STATUS, RichMessagingData.KEY_DATA, RichMessagingData.KEY_MESSAGE_ID, // Fields for file transfer RichMessagingData.KEY_MIME_TYPE, RichMessagingData.KEY_NAME, RichMessagingData.KEY_SIZE, RichMessagingData.KEY_TOTAL_SIZE, RichMessagingData.KEY_IS_SPAM, // Additional fields for chat RichMessagingData.KEY_CHAT_ID })); private static String [] unionRichCallColumns = new String[]{ RichCallData.KEY_ID+" AS "+EventLogData.KEY_EVENT_ROW_ID, "("+EventsLogApi.TYPE_INCOMING_RICH_CALL+"-1+"+RichCallData.KEY_DESTINATION+")"+" AS "+EventLogData.KEY_EVENT_TYPE, //TODO direction according to EventsLogApi.TYPE_INCOMING_SMS RichCallData.KEY_SESSION_ID+" AS "+EventLogData.KEY_EVENT_SESSION_ID, RichCallData.KEY_TIMESTAMP+" AS "+EventLogData.KEY_EVENT_DATE, RichCallData.KEY_CONTACT+" AS "+EventLogData.KEY_EVENT_CONTACT, RichCallData.KEY_STATUS+" AS "+EventLogData.KEY_EVENT_STATUS, RichCallData.KEY_DATA+" AS "+EventLogData.KEY_EVENT_DATA, RichCallData.KEY_ID+" AS "+EventLogData.KEY_EVENT_MESSAGE_ID, RichCallData.KEY_MIME_TYPE+" AS "+EventLogData.KEY_EVENT_MIMETYPE, RichCallData.KEY_NAME+" AS "+EventLogData.KEY_EVENT_NAME, RichCallData.KEY_SIZE+" AS "+EventLogData.KEY_EVENT_SIZE, RichCallData.KEY_SIZE+" AS "+EventLogData.KEY_EVENT_TOTAL_SIZE, RichCallData.KEY_SIZE+" AS "+EventLogData.KEY_EVENT_IS_SPAM, RichCallData.KEY_SIZE+" AS "+EventLogData.KEY_EVENT_CHAT_ID }; private static Set<String> columnsPresentInRichCallTable = new HashSet<String>(Arrays.asList(new String []{ RichCallData.KEY_ID, RichCallData.KEY_ID, RichCallData.KEY_SESSION_ID, RichCallData.KEY_TIMESTAMP, RichCallData.KEY_CONTACT, RichCallData.KEY_STATUS, RichCallData.KEY_DATA, RichCallData.KEY_ID, RichCallData.KEY_MIME_TYPE, RichCallData.KEY_NAME, RichCallData.KEY_SIZE, RichCallData.KEY_SIZE, RichCallData.KEY_SIZE, RichCallData.KEY_SIZE })); //******************************** //******************************** // ****** IP CALL SECTION ******** //******************************** //******************************** private static String [] unionIPCallColumns = new String[]{ IPCallData.KEY_ID+" AS "+EventLogData.KEY_EVENT_ROW_ID, IPCallData.KEY_EVENT_TYPE+" AS "+EventLogData.KEY_EVENT_TYPE, IPCallData.KEY_SESSION_ID+" AS "+EventLogData.KEY_EVENT_SESSION_ID, IPCallData.KEY_TIMESTAMP+" AS "+EventLogData.KEY_EVENT_DATE, IPCallData.KEY_CONTACT+" AS "+EventLogData.KEY_EVENT_CONTACT, IPCallData.KEY_STATUS+" AS "+EventLogData.KEY_EVENT_STATUS, IPCallData.KEY_EVENT_TYPE+" AS "+EventLogData.KEY_EVENT_DATA, IPCallData.KEY_SESSION_ID+" AS "+EventLogData.KEY_EVENT_MESSAGE_ID, IPCallData.KEY_AUDIO_MIME_TYPE+" AS "+EventLogData.KEY_EVENT_MIMETYPE, IPCallData.KEY_VIDEO_MIME_TYPE+" AS "+EventLogData.KEY_EVENT_NAME, IPCallData.KEY_EVENT_TYPE+" AS "+EventLogData.KEY_EVENT_SIZE, IPCallData.KEY_EVENT_TYPE+" AS "+EventLogData.KEY_EVENT_TOTAL_SIZE, IPCallData.KEY_EVENT_TYPE+" AS "+EventLogData.KEY_EVENT_IS_SPAM, IPCallData.KEY_EVENT_TYPE+" AS "+EventLogData.KEY_EVENT_CHAT_ID }; private static Set<String> columnsPresentInIPCallTable = new HashSet<String>(Arrays.asList(new String []{ IPCallData.KEY_ID, IPCallData.KEY_EVENT_TYPE, IPCallData.KEY_SESSION_ID, IPCallData.KEY_TIMESTAMP, IPCallData.KEY_CONTACT, IPCallData.KEY_STATUS, IPCallData.KEY_EVENT_TYPE, IPCallData.KEY_SESSION_ID, IPCallData.KEY_AUDIO_MIME_TYPE, IPCallData.KEY_VIDEO_MIME_TYPE, IPCallData.KEY_EVENT_TYPE, IPCallData.KEY_EVENT_TYPE, IPCallData.KEY_EVENT_TYPE, IPCallData.KEY_EVENT_TYPE, })); //******************************** //******************************** //**** End of IP CALL SECTION **** //******************************** //******************************** /** * Query the Android MmsSms table to get all message for the specified Numbers in selection * @param selection * @param sortOrder * @return */ private Cursor queryMmsSmsTable(String selection, String sortOrder) { selection = getThreadIdSelection(selection); Cursor smsCursor = getContext().getContentResolver().query(EventLogData.SMS_URI,smsProjection, selection , null, sortOrder); Cursor mmsCursor = getMMSCursor(selection); Cursor sortCursor = new SortCursor(new Cursor[]{smsCursor,mmsCursor},EventLogData.KEY_EVENT_DATE,SortCursor.TYPE_NUMERIC,false); return sortCursor; } private String getThreadIdSelection(String selection){ /* Unbuild selection */ selection = selection.substring(5,selection.length()-1); String[] numbers; StringBuffer buf = new StringBuffer(); if(selection!=null){ numbers = selection.split(","); /* Get the threadIds of each number for the contacts */ Uri.Builder builder; Cursor cThreadId; List<Integer> threadIds = new ArrayList<Integer>(); for(int i = 0; i < numbers.length; i++){ builder = new Builder(); builder.scheme("content"); builder.authority("mms-sms"); builder.path("threadID"); builder.appendQueryParameter("recipient", numbers[i].substring(1,numbers[i].length()-1)); cThreadId = getContext().getContentResolver().query(builder.build(),null, null, null, null); while(cThreadId.moveToNext()){ threadIds.add(cThreadId.getInt(0)); } cThreadId.close(); } /* Get SMS and MMS from those ThreadIds */ buf.append("thread_id IN ("); for(int i = 0; i <threadIds.size();i++){ buf.append(threadIds.get(i)+","); } buf.replace(buf.length()-1, buf.length(), ")"); } return buf.toString(); } /** * Get MMS messages info from MMS tables according to the selection. * @param selection, selection must be constructed around thread_id parameter. See getThreadIdSelection(). * @return */ private Cursor getMMSCursor(String selection) { MatrixCursor matrixCursor = new MatrixCursor(new String[]{ EventLogData.KEY_EVENT_ROW_ID, EventLogData.KEY_EVENT_DATE, EventLogData.KEY_EVENT_MIMETYPE, EventLogData.KEY_EVENT_DATA, EventLogData.KEY_EVENT_TYPE, EventLogData.KEY_EVENT_STATUS, EventLogData.KEY_EVENT_CONTACT, EventLogData.KEY_EVENT_TYPE, EventLogData.KEY_EVENT_SESSION_ID}); Cursor curPdu = getContext().getContentResolver().query(EventLogData.MMS_URI, null, selection, null, null); String id = null; int dest; String status = null; String date = null; String mmsText = null; String fileName = null; String address = null; while (curPdu.moveToNext()) { id = curPdu.getString(curPdu.getColumnIndex("_id")); dest = curPdu.getInt(curPdu.getColumnIndex("msg_box")); date = curPdu.getString(curPdu.getColumnIndex("date")); status = curPdu.getString(curPdu.getColumnIndex("st")); /** * Find addresses related to the message. * In Addr table, type is represented by PduHeader Constant FROM TO CC etc.. which have different type * FROM = 137 * TO = 151 */ Uri uriAddr = Uri.parse("content://mms/" + id + "/addr"); Cursor curAddr = getContext().getContentResolver().query(uriAddr, null,null, null, null); while (curAddr.moveToNext()) { int type = curAddr.getInt(curAddr.getColumnIndex("type")); if((dest==EventLogData.VALUE_EVENT_DEST_INCOMING && type == 137) || (dest==EventLogData.VALUE_EVENT_DEST_OUTGOING && type == 151)) { address = curAddr.getString(curAddr.getColumnIndex("address")); break; } } curAddr.close(); /** * Find all parts according to the id of the mms in the Pdu table. */ Cursor curPart = getContext().getApplicationContext().getContentResolver().query(Uri.parse("content://mms/"+id+"/part"), null, null,null, null); String mimeType = null ,dataMimeType = null; while (curPart.moveToNext()) { mimeType = curPart.getString(3); if (MimeManager.isTextType(mimeType)) { mmsText = curPart.getString(13); } if (MimeManager.isImageType(mimeType) || MimeManager.isVideoType(mimeType)) { fileName = curPart.getString(9); dataMimeType = mimeType; } } curPart.close(); int type = EventsLogApi.TYPE_INCOMING_SMS; if (dest==EventLogData.VALUE_EVENT_DEST_OUTGOING){ type = EventsLogApi.TYPE_OUTGOING_SMS; } /** * Build a cursor with all mms entries for the specifics numbers */ matrixCursor.addRow(new Object[]{ id, date+"000", EventLogData.MMS_MIMETYPE, mmsText+";"+fileName+";"+dataMimeType, dest, status, PhoneUtils.formatNumberToInternational(address), type, id}); } curPdu.close(); return matrixCursor; } /** * Build a Sql query for chat * * @param selection * @param chatFiltered True if we do not want chat entries * @param fileTransferFiltered True if we do not want file transfer entries * @return */ private String buildChatQuery(String selection, boolean chatFiltered, boolean fileTransferFiltered){ String selectionFilter = ""; if (chatFiltered){ selectionFilter+=" AND NOT ("+RichMessagingData.KEY_TYPE+">="+EventsLogApi.TYPE_INCOMING_CHAT_MESSAGE +" AND "+RichMessagingData.KEY_TYPE+"<=" + EventsLogApi.TYPE_GROUP_CHAT_SYSTEM_MESSAGE+")"; } if (fileTransferFiltered){ selectionFilter+=" AND NOT ("+RichMessagingData.KEY_TYPE+"=="+EventsLogApi.TYPE_INCOMING_FILE_TRANSFER +" OR "+RichMessagingData.KEY_TYPE+"==" + EventsLogApi.TYPE_OUTGOING_FILE_TRANSFER+")"; } SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables("\""+RichMessagingProvider.TABLE+"\""); return builder.buildUnionSubQuery( EventLogData.KEY_EVENT_TYPE, unionRichMessagingColumns, columnsPresentInRichMessagingTable, unionRichMessagingColumns.length, EventLogData.KEY_EVENT_TYPE, (selection!=null? selection + selectionFilter : selectionFilter), null, null, null); } /** * Build a Sql query to be part of a union query on the rcs Table * Get all RichMessaging of type 'type' for the specified Numbers in selection * If no type is specified, get all RichMessaging. * @param selection * @param chatFiltered True if we do not want chat entries * @param fileTransferFiltered True if we do not want file transfer entries * @return */ private String buildRichMessagingQuery(String selection, boolean chatFiltered, boolean fileTransferFiltered){ // Do not take the "terminated" rows for chat sessions String selectionFilter = " NOT ("+RichMessagingData.KEY_TYPE+">="+EventsLogApi.TYPE_INCOMING_CHAT_MESSAGE + " AND "+ RichMessagingData.KEY_TYPE+"<="+EventsLogApi.TYPE_GROUP_CHAT_SYSTEM_MESSAGE+" AND ("+ RichMessagingData.KEY_STATUS+" == "+EventsLogApi.STATUS_TERMINATED + " OR "+ RichMessagingData.KEY_STATUS+" == "+EventsLogApi.STATUS_TERMINATED_BY_REMOTE +" OR "+ RichMessagingData.KEY_STATUS+" == "+EventsLogApi.STATUS_TERMINATED_BY_USER + "))"; // Do not take the spam messages selectionFilter +=" AND NOT( "+RichMessagingData.KEY_IS_SPAM+"="+EventsLogApi.MESSAGE_IS_SPAM+ " )"; if (chatFiltered){ selectionFilter+=" AND NOT ("+RichMessagingData.KEY_TYPE+">="+EventsLogApi.TYPE_INCOMING_CHAT_MESSAGE +" AND "+RichMessagingData.KEY_TYPE+"<=" + EventsLogApi.TYPE_GROUP_CHAT_SYSTEM_MESSAGE+")"; } if (fileTransferFiltered){ selectionFilter+=" AND NOT ("+RichMessagingData.KEY_TYPE+"=="+EventsLogApi.TYPE_INCOMING_FILE_TRANSFER +" OR "+RichMessagingData.KEY_TYPE+"==" + EventsLogApi.TYPE_OUTGOING_FILE_TRANSFER+")"; } SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables("\""+RichMessagingProvider.TABLE+"\""); // Group the result so we have just one row per session String groupBy=EventLogData.KEY_EVENT_SESSION_ID; return builder.buildUnionSubQuery( EventLogData.KEY_EVENT_TYPE, unionRichMessagingColumns, columnsPresentInRichMessagingTable, unionRichMessagingColumns.length, EventLogData.KEY_EVENT_TYPE, (selection!=null? RichMessagingData.KEY_CONTACT + selection + " AND "+ selectionFilter : selectionFilter), null, groupBy, null); } /** * Build a Sql query to be part of a union query on the rcs Table * Get all RichCall for the specified Numbers in selection * @param selection * @return */ private String buildRichCallQuery(String selection){ SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables("\""+RichCallProvider.TABLE+"\""); return builder.buildUnionSubQuery( EventLogData.KEY_EVENT_TYPE, unionRichCallColumns, columnsPresentInRichCallTable, unionRichCallColumns.length, "("+Integer.toString(EventsLogApi.TYPE_OUTGOING_RICH_CALL) + "||" + Integer.toString(EventsLogApi.TYPE_INCOMING_RICH_CALL) +")", (selection!=null?RichCallData.KEY_CONTACT+selection:null), null, null, null); } /** * Build a Sql query to be part of a union query on the rcs Table * Get all RichCall for the specified Numbers in selection * @param selection * @return */ private String buildIPCallQuery(String selection){ SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables("\""+IPCallProvider.TABLE+"\""); return builder.buildUnionSubQuery( EventLogData.KEY_EVENT_TYPE, unionIPCallColumns, columnsPresentInIPCallTable, unionIPCallColumns.length, "("+Integer.toString(EventsLogApi.TYPE_INCOMING_IPCALL) + "||" + Integer.toString(EventsLogApi.TYPE_OUTGOING_IPCALL)+")", (selection!=null?IPCallData.KEY_CONTACT+selection:null), null, null, null); } /** * Delete all events from the selected mode. * selection parameter is specially build : " IN ('phonenumber1','phonenumber2'...)" Must not be null */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int deletedRows = 0; // Generate the body of the query int match = uriMatcher.match(uri); switch(match) { case EventsLogApi.MODE_NONE: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteRichMessaging(selection); deletedRows+=deleteSMSMMS(selection); break; //********************************************* //********************************************* //*************** IP Call ********************* //********************************************* //********************************************* case EventsLogApi.MODE_IPCALL_RC_CHAT_FT_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteRichMessaging(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_RC_CHAT_FT: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteRichMessaging(selection); break; case EventsLogApi.MODE_IPCALL_RC_CHAT_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteChat(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_RC_CHAT: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteChat(selection); break; case EventsLogApi.MODE_IPCALL_RC_FT_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteFT(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_RC_FT: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteFT(selection); break; case EventsLogApi.MODE_IPCALL_RC_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_RC: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichCalls(selection); break; case EventsLogApi.MODE_IPCALL_CHAT_FT_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichMessaging(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_CHAT_FT: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteRichMessaging(selection); break; case EventsLogApi.MODE_IPCALL_CHAT_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteChat(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_CHAT: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteIPCalls(selection); deletedRows+=deleteChat(selection); break; case EventsLogApi.MODE_IPCALL_FT_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteFT(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL_FT: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteFT(selection); break; case EventsLogApi.MODE_IPCALL_SMS: deletedRows+=deleteIPCalls(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_IPCALL: deletedRows+=deleteIPCalls(selection); break; //********************************************* //********************************************* //********** End of IP Call Section *********** //********************************************* //********************************************* case EventsLogApi.MODE_RC_CHAT_FT_SMS: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteRichMessaging(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_RC_CHAT_FT: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteRichMessaging(selection); break; case EventsLogApi.MODE_RC_CHAT_SMS: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteChat(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_RC_CHAT: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteChat(selection); break; case EventsLogApi.MODE_RC_FT_SMS: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteFT(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_RC_FT: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteFT(selection); break; case EventsLogApi.MODE_RC_SMS: deletedRows+=deleteRichCalls(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_RC: deletedRows+=deleteRichCalls(selection); break; case EventsLogApi.MODE_CHAT_FT_SMS: deletedRows+=deleteRichMessaging(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_CHAT_FT: deletedRows+=deleteRichMessaging(selection); break; case EventsLogApi.MODE_CHAT_SMS: deletedRows+=deleteChat(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_CHAT: deletedRows+=deleteChat(selection); break; case EventsLogApi.MODE_FT_SMS: deletedRows+=deleteFT(selection); deletedRows+=deleteSMSMMS(selection); break; case EventsLogApi.MODE_FT: deletedRows+=deleteFT(selection); break; case EventsLogApi.MODE_SMS: deletedRows+=deleteSMSMMS(selection); break; default: throw new IllegalArgumentException("Unknown URI " + uri); } return deletedRows; } private int deleteChat(String selection){ String chatSelection = " AND (("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_INCOMING_CHAT_MESSAGE + "OR ("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_OUTGOING_CHAT_MESSAGE + ")" + "OR ("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_CHAT_SYSTEM_MESSAGE + ")" + "OR ("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_INCOMING_GROUP_CHAT_MESSAGE + ")" + "OR ("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_OUTGOING_GROUP_CHAT_MESSAGE + "))"; return getContext().getContentResolver().delete( RichMessagingData.CONTENT_URI, (selection!=null? RichMessagingData.KEY_CONTACT+selection+chatSelection :chatSelection) ,null); } private int deleteFT(String selection){ String ftSelection = " AND (("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_INCOMING_FILE_TRANSFER + "OR ("+RichMessagingData.KEY_TYPE+" = "+EventsLogApi.TYPE_OUTGOING_FILE_TRANSFER + "))"; return getContext().getContentResolver().delete( RichMessagingData.CONTENT_URI, (selection!=null? RichMessagingData.KEY_CONTACT+selection+ftSelection :ftSelection) ,null); } private int deleteSMSMMS(String selection){ int deletedRows = 0; deletedRows+=getContext().getContentResolver().delete(EventLogData.SMS_URI,(selection!=null?KEY_SMS_ADDRESS+selection:null),null); deletedRows+=getContext().getContentResolver().delete(EventLogData.MMS_URI,(selection!=null?getThreadIdSelection(selection):null),null); return deletedRows; } private int deleteRichCalls(String selection){ return getContext().getContentResolver().delete(RichCallData.CONTENT_URI,(selection!=null?RichCallData.KEY_CONTACT+selection:null),null); } private int deleteIPCalls(String selection){ return getContext().getContentResolver().delete(IPCallData.CONTENT_URI,(selection!=null?IPCallData.KEY_CONTACT+selection:null),null); } private int deleteRichMessaging(String selection){ return getContext().getContentResolver().delete(RichMessagingData.CONTENT_URI,(selection!=null?RichMessagingData.KEY_CONTACT+selection:null),null); } }