1ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak/* 2ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * Copyright (c) 2015, Motorola Mobility LLC 3ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * All rights reserved. 4ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * 5ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * Redistribution and use in source and binary forms, with or without 6ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * modification, are permitted provided that the following conditions are met: 7ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * - Redistributions of source code must retain the above copyright 8ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * notice, this list of conditions and the following disclaimer. 9ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * - Redistributions in binary form must reproduce the above copyright 10ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * notice, this list of conditions and the following disclaimer in the 11ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * documentation and/or other materials provided with the distribution. 12ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * - Neither the name of Motorola Mobility nor the 13ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * names of its contributors may be used to endorse or promote products 14ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * derived from this software without specific prior written permission. 15ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * 16ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 18ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MOTOROLA MOBILITY LLC BE LIABLE 20ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 26ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * DAMAGE. 27ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak */ 28ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 29ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakpackage com.android.service.ims.presence; 30ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 31ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport java.io.FileNotFoundException; 32ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 33ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.content.ContentUris; 34ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.content.ContentValues; 35ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.content.Intent; 36ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.content.UriMatcher; 37ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.database.Cursor; 38ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.database.SQLException; 39ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.database.sqlite.SQLiteDatabase; 40ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.database.sqlite.SQLiteQueryBuilder; 41ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.net.Uri; 42ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.os.ParcelFileDescriptor; 43ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.provider.BaseColumns; 44ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.provider.ContactsContract.Contacts; 45ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport android.content.ComponentName; 46ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 478e4834fa676fce0101da34950279b1a2bf8eb81cGao Bingimport com.android.ims.internal.ContactNumberUtils; 48ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport com.android.ims.RcsPresenceInfo; 49ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport com.android.ims.internal.EABContract; 50ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakimport com.android.ims.internal.Logger; 51ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 52ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak/** 53ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * @author Vishal Patil (A22809) 54ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak */ 55ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 56ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiakpublic class EABProvider extends DatabaseContentProvider{ 57ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private Logger logger = Logger.getLogger(this.getClass().getName()); 58ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 59ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final String EAB_DB_NAME = "rcseab.db"; 60ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 61518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger private static final int EAB_DB_VERSION = 4; 62ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 63ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final int EAB_TABLE = 1; 64ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 65ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final int EAB_TABLE_ID = 2; 66ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 67ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final int EAB_GROUPITEMS_TABLE = 3; 68ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 69ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH) { 70ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak { 71ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak addURI(EABContract.AUTHORITY, EABContract.EABColumns.TABLE_NAME, EAB_TABLE); 72ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak addURI(EABContract.AUTHORITY, EABContract.EABColumns.TABLE_NAME + "/#", EAB_TABLE_ID); 73ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak addURI(EABContract.AUTHORITY, EABContract.EABColumns.GROUPITEMS_NAME, 74ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EAB_GROUPITEMS_TABLE); 75ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 76ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak }; 77ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 78ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak /* Statement to create VMM Album table. */ 79ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final String EAB_CREATE_STATEMENT = "create table if not exists " 80ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.TABLE_NAME 81ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + "(" 82ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 83ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.CONTACT_NAME + " TEXT, " 84ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.CONTACT_NUMBER + " TEXT, " 858e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing + EABContract.EABColumns.RAW_CONTACT_ID + " LONG, " 868e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing + EABContract.EABColumns.CONTACT_ID + " LONG, " 878e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing + EABContract.EABColumns.DATA_ID + " LONG, " 88ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.ACCOUNT_TYPE + " TEXT, " 89ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS + " TEXT, " 90ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VOLTE_CALL_CAPABILITY + " INTEGER, " 91ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP + " LONG, " 92ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VOLTE_CALL_AVAILABILITY + " INTEGER, " 93ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP + " LONG, " 94ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS + " TEXT, " 95ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VIDEO_CALL_CAPABILITY + " INTEGER, " 96ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP + " LONG, " 97ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VIDEO_CALL_AVAILABILITY + " INTEGER, " 98ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP + " LONG, " 99ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.CONTACT_LAST_UPDATED_TIMESTAMP + " LONG " 100ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + ");"; 101ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 102ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private static final String EAB_DROP_STATEMENT = "drop table if exists " 103ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.TABLE_NAME + ";"; 104ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 105ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak public EABProvider() { 106ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak super(EAB_DB_NAME, EAB_DB_VERSION); 107ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 108ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 109ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 110ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak public void bootstrapDatabase(SQLiteDatabase db) { 111ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.info("Enter: bootstrapDatabase() Creating new EAB database"); 112ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak upgradeDatabase(db, 0, EAB_DB_VERSION); 113518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: bootstrapDatabase()"); 114ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 115ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 116ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak /* 117ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * In upgradeDatabase, 118ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * oldVersion - the current version of Provider on the phone. 119ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak * newVersion - the version of Provider where the phone will be upgraded to. 120ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak */ 121ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 122ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak public boolean upgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion) { 1238e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.info("Enter: upgradeDatabase() - oldVersion = " + oldVersion + 124ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak " newVersion = " + newVersion); 125ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 126518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger boolean needsEabResetBroadcast = false; 127518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger 128ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (oldVersion == newVersion) { 1298e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.info("upgradeDatabase oldVersion == newVersion, No Upgrade Required"); 130ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return true; 131ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 132ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 133ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak try { 134ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (oldVersion == 0) { 135ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak db.execSQL(EAB_CREATE_STATEMENT); 136ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 137ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak oldVersion++; 138ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("upgradeDatabase : DB has been upgraded to " + oldVersion); 139ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 140ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (oldVersion == 1) { 141ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak addColumn(db, EABContract.EABColumns.TABLE_NAME, 142ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VOLTE_STATUS, "INTEGER NOT NULL DEFAULT -1"); 143ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 144ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak oldVersion++; 145ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("upgradeDatabase : DB has been upgraded to " + oldVersion); 146ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 1478e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing if (oldVersion == 2) { 1488e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // Add new column to EABPresence table to handle special numbers *67 and *82. 1498e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing addColumn(db, EABContract.EABColumns.TABLE_NAME, 1508e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.FORMATTED_NUMBER, "TEXT DEFAULT NULL"); 1518e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing 1528e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // Delete all records from EABPresence table. 1538e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing db.execSQL("DELETE FROM " + EABContract.EABColumns.TABLE_NAME); 154518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger needsEabResetBroadcast = true; 155518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger 156518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger oldVersion++; 157518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("upgradeDatabase : DB has been upgraded to " + oldVersion); 158518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger } 159518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger if (oldVersion == 3) { 160518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger // Delete all records from EABPresence table. A bug in the previous version caused 161518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger // invalid rows to be created. This version removes all rows to allow the DB to 162518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger // repopulate. 163518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger db.execSQL("DELETE FROM " + EABContract.EABColumns.TABLE_NAME); 164518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger needsEabResetBroadcast = true; 1658e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing 1668e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing oldVersion++; 1678e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.debug("upgradeDatabase : DB has been upgraded to " + oldVersion); 1688e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing } 1698e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // add further upgrade code above this 170ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } catch (SQLException exception) { 171ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.error("Exception during upgradeDatabase. " + exception.getMessage()); 1728e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // If exception occured during upgrade database, then drop EABPresence 1738e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // and recreate it. Please note in this case, all information stored in 1748e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // table is lost. 1758e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing db.execSQL(EAB_DROP_STATEMENT); 1768e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing upgradeDatabase(db, 0, EAB_DB_VERSION); 177518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger needsEabResetBroadcast = true; 1788e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.debug("Dropped and created new EABPresence table."); 179ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 180ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 181518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger if (needsEabResetBroadcast) { 182518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger sendEabResetBroadcast(); 183518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger } 184518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger 185ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (oldVersion == newVersion) { 186ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("DB upgrade complete : to " + newVersion); 187ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 188ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 189518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: upgradeDatabase()"); 190ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return true; 191ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 192ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 193ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 194ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak protected boolean downgradeDatabase(SQLiteDatabase db, int oldVersion, int newVersion) { 1958e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.info("Enter: downgradeDatabase()"); 1968e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // Drop and recreate EABPresence table as there should not be a scenario 1978e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // where EAB table version is greater than EAB_DB_VERSION. 1988e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing db.execSQL(EAB_DROP_STATEMENT); 1998e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing upgradeDatabase(db, 0, EAB_DB_VERSION); 2008e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing sendEabResetBroadcast(); 2018e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.debug("Dropped and created new EABPresence table."); 202518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: downgradeDatabase()"); 2038e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing return true; 204ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 205ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 206ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 207ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak protected int deleteInternal(SQLiteDatabase db, Uri uri, String selection, 208ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String[] selectionArgs) { 209518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Enter: deleteInternal()"); 210ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak final int match = URI_MATCHER.match(uri); 211ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String table = null; 212ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 213ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE_ID: 214ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (selection == null) { 215ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak selection = "_id=?"; 216ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak selectionArgs = new String[] {uri.getPathSegments().get(1)}; 217ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 218ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE: 219ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak table = EABContract.EABColumns.TABLE_NAME; 220ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 221ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak default: 222518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("No match for " + uri); 223518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: deleteInternal()"); 224ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return 0; 225ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 226ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("Deleting from the table" + table + " selection= " + selection); 227ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak printDeletingValues(uri, selection, selectionArgs); 228518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: deleteInternal()"); 229ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return db.delete(table, selection, selectionArgs); 230ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 231ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 232ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 233ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak protected Uri insertInternal(SQLiteDatabase db, Uri uri, ContentValues values) { 234518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Enter: insertInternal()"); 235ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak final int match = URI_MATCHER.match(uri); 236ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String table = null; 237ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String nullColumnHack = null; 238ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 239ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE: 240ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak table = EABContract.EABColumns.TABLE_NAME; 241ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 242ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak default: 243ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.warn("No match for " + uri); 244518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: insertInternal() with null"); 245ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return null; 246ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 247ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak values = verifyIfMdnExists(values); 248ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak // Do the insert. 249ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("Inserting to the table" + table + " values=" + values.toString()); 250ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 251ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak final long id = db.insert(table, nullColumnHack, values); 252ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (id > 0) { 253ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String contactNumber = values.getAsString(EABContract.EABColumns.CONTACT_NUMBER); 254ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak sendInsertBroadcast(contactNumber); 255518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: insertInternal()"); 256ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return ContentUris.withAppendedId(uri, id); 257ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } else { 258518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: insertInternal() with null"); 259ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return null; 260ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 261ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 262ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 263ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 264ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak protected Cursor queryInternal(SQLiteDatabase db, Uri uri, String[] projection, 265ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String selection, String[] selectionArgs, String sortOrder) { 266518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Enter: queryInternal()"); 267ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak final int match = URI_MATCHER.match(uri); 268ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 269ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 270ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE_ID: 271ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak long id = ContentUris.parseId(uri); 272ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("queryInternal id=" + id); 273ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String idSelection = BaseColumns._ID + "=" + id; 274ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if(null != selection) { 275ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak selection = "((" + idSelection + ") AND (" + selection + "))"; 276ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } else { 277ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak selection = idSelection; 278ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 279ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 280ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_GROUPITEMS_TABLE: 281ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak SQLiteQueryBuilder sqb = new SQLiteQueryBuilder(); 282ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak sqb.setTables(EABContract.EABColumns.TABLE_NAME); 283ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String rawquery = "select DISTINCT " + EABContract.EABColumns.CONTACT_ID 284ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + " from " + EABContract.EABColumns.TABLE_NAME 285ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + " where " + EABContract.EABColumns.VOLTE_CALL_CAPABILITY + " >'" + 286ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak RcsPresenceInfo.ServiceState.OFFLINE+"' AND " 287ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + EABContract.EABColumns.VIDEO_CALL_CAPABILITY + " >'" 288ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak + RcsPresenceInfo.ServiceState.OFFLINE + "'"; 289ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak StringBuffer sb = new StringBuffer(); 290ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak Cursor cursor = db.rawQuery(rawquery, null); 291ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (cursor != null && cursor.moveToFirst()) { 292ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak do { 293ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (sb.length() != 0) sb.append(","); 294ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String contactId = cursor.getString(cursor 295ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak .getColumnIndex(EABContract.EABColumns.CONTACT_ID)); 296ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak sb.append(contactId); 297ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } while (cursor.moveToNext()); 298ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 299ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (cursor != null) cursor.close(); 300ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String contactSel = Contacts._ID + " IN ( " + sb.toString() + ")"; 301ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return getContext().getContentResolver().query(Contacts.CONTENT_URI, projection, 302ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak contactSel, null, sortOrder); 303ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 304ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 305ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 306ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 307ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String groupBy = uri.getQueryParameter("groupby"); 308ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String having = null; 309ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 310ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 311ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE: 312ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE_ID: 313ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak qb.setTables(EABContract.EABColumns.TABLE_NAME); 314ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 315ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak default: 316ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.warn("No match for " + uri); 317518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: queryInternal()"); 318ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return null; 319ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 320518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: queryInternal()"); 321ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return qb.query(db, projection, selection, selectionArgs, groupBy, having, sortOrder); 322ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 323ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 324ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 325ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak protected int updateInternal(SQLiteDatabase db, Uri uri, ContentValues values, 326ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String selection, String[] selectionArgs) { 327518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Enter: updateInternal()"); 328ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak int result = 0; 329ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak final int match = URI_MATCHER.match(uri); 330ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 331ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 332ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE_ID: 333ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak long id = ContentUris.parseId(uri); 334ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("updateInternal id=" + id); 335ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String idSelection = BaseColumns._ID + "=" + id; 336ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if(null != selection){ 337ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak selection = "((" + idSelection + ") AND (" + selection + "))"; 338ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } else { 339ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak selection = idSelection; 340ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 341ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 342ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 343ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 344ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String table = null; 345ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 346ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE: 347ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE_ID: 348ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak table = EABContract.EABColumns.TABLE_NAME; 349ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 350ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak default: 351ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.warn("No match for " + uri); 352ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak break; 353ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 354ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 355ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (table != null && values != null) { 356ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("Updating the table " + table + " values= " + values.toString()); 357ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak result = db.update(table, values, selection, selectionArgs); 358ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 359518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Exit: updateInternal()"); 360ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return result; 361ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 362ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 363ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 364ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak public String getType(Uri uri) { 365518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger logger.debug("Enter: getType()"); 366ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak final int match = URI_MATCHER.match(uri); 367ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak switch (match) { 368ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE: 369ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return EABContract.EABColumns.CONTENT_TYPE; 370ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak case EAB_TABLE_ID: 371ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return EABContract.EABColumns.CONTENT_ITEM_TYPE; 372ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak default: 373ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak throw (new IllegalArgumentException("EABProvider URI: " + uri)); 374ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 375ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 376ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 377ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak @Override 378ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 379ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return null; 380ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 381ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 382ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private void sendInsertBroadcast(String contactNumber) { 383ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak Intent intent = new Intent(com.android.service.ims.presence.Contacts 384ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak .ACTION_NEW_CONTACT_INSERTED); 385ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak ComponentName component = new ComponentName("com.android.service.ims.presence", 386ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak "com.android.service.ims.presence.AlarmBroadcastReceiver"); 387ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak intent.setComponent(component); 388ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 389ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak intent.putExtra(com.android.service.ims.presence.Contacts.NEW_PHONE_NUMBER, contactNumber); 390ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak getContext().sendBroadcast(intent); 391ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 392ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 3938e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing private void sendEabResetBroadcast() { 3948e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.info("Enter: sendEabResetBroadcast()"); 3958e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing Intent intent = new Intent(com.android.service.ims.presence.Contacts 3968e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing .ACTION_EAB_DATABASE_RESET); 397518a6aa0d7e96379d504e07bb6bd5f5379a08d68Brad Ebinger getContext().sendBroadcast(intent, "com.android.ims.permission.PRESENCE_ACCESS"); 3988e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing } 3998e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing 400ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private ContentValues verifyIfMdnExists(ContentValues cvalues) { 4018e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing String formattedNumber = null; 402ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String phoneNumber = null; 4038e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing if (cvalues.containsKey(EABContract.EABColumns.CONTACT_NUMBER) 4048e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing && cvalues.containsKey(EABContract.EABColumns.FORMATTED_NUMBER)) { 405ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak phoneNumber = cvalues.getAsString(EABContract.EABColumns.CONTACT_NUMBER); 4068e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing formattedNumber = cvalues.getAsString(EABContract.EABColumns.FORMATTED_NUMBER); 407ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } else { 408ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return cvalues; 409ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 4108e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing if (null == formattedNumber) { 411ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return cvalues; 412ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 413ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String[] projection = new String[] { 4148e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.FORMATTED_NUMBER, 415ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, 416ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VOLTE_CALL_CAPABILITY, 417ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP, 418ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VOLTE_CALL_AVAILABILITY, 419ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP, 420ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, 421ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VIDEO_CALL_CAPABILITY, 422ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP, 423ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VIDEO_CALL_AVAILABILITY, 424ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP}; 4258e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing String whereClause = "PHONE_NUMBERS_EQUAL(" 4268e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing + EABContract.EABColumns.FORMATTED_NUMBER + ", ?, 0)"; 4278e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing String[] selectionArgs = new String[] { formattedNumber }; 428ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak Cursor cursor = getContext().getContentResolver().query(EABContract.EABColumns.CONTENT_URI, 4298e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing projection, whereClause, selectionArgs, null); 430ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if ((null != cursor) && (cursor.getCount() > 0)) { 4318e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.debug("Cursor count is " + cursor.getCount()); 4328e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // Update data only from first valid cursor element. 4338e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing while (cursor.moveToNext()) { 4348e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing ContactNumberUtils contactNumberUtils = ContactNumberUtils.getDefault(); 4358e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing String eabFormattedNumber = cursor.getString( 4368e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getColumnIndex(EABContract.EABColumns.FORMATTED_NUMBER)); 4378e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing 4388e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // Use contactNumberUtils.format() to format both formattedNumber and 4398e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing // eabFormattedNumber and then check if they are equal. 4408e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing if(contactNumberUtils.format(formattedNumber).equals( 4418e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing contactNumberUtils.format(eabFormattedNumber))) { 4428e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.debug("phoneNumber : "+ phoneNumber +" is already stored in EAB DB. " 4438e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing + " Hence inserting another copy."); 4448e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS, 4458e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getString(cursor.getColumnIndex( 4468e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VOLTE_CALL_SERVICE_CONTACT_ADDRESS))); 4478e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VOLTE_CALL_CAPABILITY, cursor.getString( 4488e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getColumnIndex( 4498e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VOLTE_CALL_CAPABILITY))); 4508e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP, 4518e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getLong(cursor.getColumnIndex( 4528e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VOLTE_CALL_CAPABILITY_TIMESTAMP))); 4538e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VOLTE_CALL_AVAILABILITY, 4548e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getString(cursor.getColumnIndex( 4558e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VOLTE_CALL_AVAILABILITY))); 4568e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP, 4578e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getLong(cursor.getColumnIndex( 4588e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VOLTE_CALL_AVAILABILITY_TIMESTAMP))); 4598e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS, 4608e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getString(cursor.getColumnIndex( 4618e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VIDEO_CALL_SERVICE_CONTACT_ADDRESS))); 4628e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VIDEO_CALL_CAPABILITY, 4638e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getString(cursor.getColumnIndex( 4648e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VIDEO_CALL_CAPABILITY))); 4658e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP, 4668e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getLong(cursor.getColumnIndex( 4678e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VIDEO_CALL_CAPABILITY_TIMESTAMP))); 4688e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VIDEO_CALL_AVAILABILITY, 4698e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getString(cursor.getColumnIndex( 4708e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VIDEO_CALL_AVAILABILITY))); 4718e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP, 4728e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cursor.getLong(cursor.getColumnIndex( 4738e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing EABContract.EABColumns.VIDEO_CALL_AVAILABILITY_TIMESTAMP))); 4748e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing cvalues.put(EABContract.EABColumns.CONTACT_LAST_UPDATED_TIMESTAMP, 0); 4758e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing break; 4768e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing } 4778e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing } 478ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 479ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (null != cursor) { 480ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak cursor.close(); 481ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 482ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak return cvalues; 483ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 484ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak 485ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak private void printDeletingValues(Uri uri, String selection, String[] selectionArgs) { 486ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String[] projection = new String[] { 487ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.CONTACT_NUMBER, 488ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.CONTACT_NAME, 489ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.RAW_CONTACT_ID, 490ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.CONTACT_ID, 491ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.DATA_ID}; 492ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak Cursor cursor = getContext().getContentResolver().query(EABContract.EABColumns.CONTENT_URI, 493ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak projection, selection, selectionArgs, null); 494ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if ((null != cursor) && (cursor.getCount() > 0)) { 495ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.debug("Before deleting the cursor count is " + cursor.getCount()); 496ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak // Update data only from first cursor element. 497ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak while (cursor.moveToNext()) { 498ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak long dataId = cursor.getLong(cursor.getColumnIndex( 499ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.DATA_ID)); 500ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak long contactId = cursor.getLong(cursor.getColumnIndex( 501ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.CONTACT_ID)); 502ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak long rawContactId = cursor.getLong(cursor.getColumnIndex( 503ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.RAW_CONTACT_ID)); 504ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String phoneNumber = cursor.getString(cursor.getColumnIndex( 505ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.CONTACT_NUMBER)); 506ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak String displayName = cursor.getString(cursor.getColumnIndex( 507ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak EABContract.EABColumns.CONTACT_NAME)); 5088e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing logger.debug("Deleting : dataId : " + dataId + " contactId :" + contactId + 5098e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing " rawContactId :" + rawContactId + " phoneNumber :" + phoneNumber + 5108e4834fa676fce0101da34950279b1a2bf8eb81cGao Bing " displayName :" + displayName); 511ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 512ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } else { 513ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak logger.error("cursor is null!"); 514ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 515ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak if (null != cursor) { 516ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak cursor.close(); 517ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 518ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak } 519ac76c57e7a49d4f1431c751db3c810467a60ca48Pavel Zhamaitsiak} 520