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