147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby/*
247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * Copyright (C) 2011 The Android Open Source Project
347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby *
447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * you may not use this file except in compliance with the License.
647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * You may obtain a copy of the License at
747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby *
847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby *
1047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * Unless required by applicable law or agreed to in writing, software
1147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
1247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * See the License for the specific language governing permissions and
1447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * limitations under the License.
1547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby */
1647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
1747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambypackage com.android.cellbroadcastreceiver;
1847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
1947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.content.ContentValues;
2047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.content.Context;
2147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.database.Cursor;
2247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.database.sqlite.SQLiteDatabase;
2347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.database.sqlite.SQLiteException;
2447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.database.sqlite.SQLiteOpenHelper;
2547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.provider.Telephony;
2647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.telephony.SmsCbCmasInfo;
2747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.telephony.SmsCbEtwsInfo;
2847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.telephony.SmsCbMessage;
2947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport android.util.Log;
3047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
3147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambyimport com.android.internal.telephony.gsm.SmsCbConstants;
3247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
3347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby/**
3447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * Open, create, and upgrade the cell broadcast SQLite database. Previously an inner class of
3547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * {@code CellBroadcastDatabase}, this is now a top-level class. The column definitions in
3647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * {@code CellBroadcastDatabase} have been moved to {@link Telephony.CellBroadcasts} in the
3747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby * framework, to simplify access to this database from third-party apps.
3847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby */
3947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hambypublic class CellBroadcastDatabaseHelper extends SQLiteOpenHelper {
4047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
4147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final String TAG = "CellBroadcastDatabaseHelper";
4247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
4347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    static final String DATABASE_NAME = "cell_broadcasts.db";
4447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    static final String TABLE_NAME = "broadcasts";
4547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
4647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    /** Temporary table for upgrading the database version. */
4747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    static final String TEMP_TABLE_NAME = "old_broadcasts";
4847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
4947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    /**
5047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     * Database version 1: initial version
5147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     * Database version 2-9: (reserved for OEM database customization)
5247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     * Database version 10: adds ETWS and CMAS columns and CDMA support
5347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     * Database version 11: adds delivery time index
5447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     */
5547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    static final int DATABASE_VERSION = 11;
5647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
5747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    CellBroadcastDatabaseHelper(Context context) {
5847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        super(context, DATABASE_NAME, null, DATABASE_VERSION);
5947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    }
6047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
6147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    @Override
6247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    public void onCreate(SQLiteDatabase db) {
6347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        db.execSQL("CREATE TABLE " + TABLE_NAME + " ("
6447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
6547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.GEOGRAPHICAL_SCOPE + " INTEGER,"
6647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.PLMN + " TEXT,"
6747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.LAC + " INTEGER,"
6847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CID + " INTEGER,"
6947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.SERIAL_NUMBER + " INTEGER,"
7047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.SERVICE_CATEGORY + " INTEGER,"
7147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.LANGUAGE_CODE + " TEXT,"
7247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.MESSAGE_BODY + " TEXT,"
7347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.DELIVERY_TIME + " INTEGER,"
7447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.MESSAGE_READ + " INTEGER,"
7547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.MESSAGE_FORMAT + " INTEGER,"
7647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.MESSAGE_PRIORITY + " INTEGER,"
7747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.ETWS_WARNING_TYPE + " INTEGER,"
7847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CMAS_MESSAGE_CLASS + " INTEGER,"
7947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CMAS_CATEGORY + " INTEGER,"
8047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CMAS_RESPONSE_TYPE + " INTEGER,"
8147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CMAS_SEVERITY + " INTEGER,"
8247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CMAS_URGENCY + " INTEGER,"
8347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + Telephony.CellBroadcasts.CMAS_CERTAINTY + " INTEGER);");
8447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
8547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        createDeliveryTimeIndex(db);
8647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    }
8747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
8847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private void createDeliveryTimeIndex(SQLiteDatabase db) {
8947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        db.execSQL("CREATE INDEX IF NOT EXISTS deliveryTimeIndex ON " + TABLE_NAME
9047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                + " (" + Telephony.CellBroadcasts.DELIVERY_TIME + ");");
9147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    }
9247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
9347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    /** Columns to copy on database upgrade. */
9447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final String[] COLUMNS_V1 = {
9547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.GEOGRAPHICAL_SCOPE,
9647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.SERIAL_NUMBER,
9747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.V1_MESSAGE_CODE,
9847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.V1_MESSAGE_IDENTIFIER,
9947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.LANGUAGE_CODE,
10047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.MESSAGE_BODY,
10147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.DELIVERY_TIME,
10247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            Telephony.CellBroadcasts.MESSAGE_READ,
10347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    };
10447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
10547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_GEOGRAPHICAL_SCOPE   = 0;
10647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_SERIAL_NUMBER        = 1;
10747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_MESSAGE_CODE         = 2;
10847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_MESSAGE_IDENTIFIER   = 3;
10947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_LANGUAGE_CODE        = 4;
11047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_MESSAGE_BODY         = 5;
11147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_DELIVERY_TIME        = 6;
11247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static final int COLUMN_V1_MESSAGE_READ         = 7;
11347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
11447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    @Override
11547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
11647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (oldVersion == newVersion) {
11747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            return;
11847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
11947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        // always log database upgrade
12047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        log("Upgrading DB from version " + oldVersion + " to " + newVersion);
12147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
12247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        // Upgrade from V1 to V10
12347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (oldVersion == 1) {
12447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            db.beginTransaction();
12547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            try {
12647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                // Step 1: rename original table
12747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                db.execSQL("DROP TABLE IF EXISTS " + TEMP_TABLE_NAME);
12847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                db.execSQL("ALTER TABLE " + TABLE_NAME + " RENAME TO " + TEMP_TABLE_NAME);
12947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
13047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                // Step 2: create new table and indices
13147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                onCreate(db);
13247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
13347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                // Step 3: copy each message into the new table
13447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                Cursor cursor = db.query(TEMP_TABLE_NAME, COLUMNS_V1, null, null, null, null,
13547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                        null);
13647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                try {
13747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                    while (cursor.moveToNext()) {
13847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                        upgradeMessageV1ToV2(db, cursor);
13947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                    }
14047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                } finally {
14147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                    cursor.close();
14247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                }
14347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
14447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                // Step 4: drop the original table and commit transaction
14547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                db.execSQL("DROP TABLE " + TEMP_TABLE_NAME);
14647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                db.setTransactionSuccessful();
14747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            } finally {
14847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                db.endTransaction();
14947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            }
15047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            oldVersion = 10;    // skip to version 10
15147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
15247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
15347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        // Note to OEMs: if you have customized the database schema since V1, you will need to
15447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        // add your own code here to convert from your version to version 10.
15547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (oldVersion < 10) {
15647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            throw new SQLiteException("CellBroadcastDatabase doesn't know how to upgrade "
15747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                    + " DB version " + oldVersion + " (customized by OEM?)");
15847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
15947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
16047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (oldVersion == 10) {
16147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            createDeliveryTimeIndex(db);
16247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            oldVersion++;
16347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
16447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    }
16547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
16647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    /**
16747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     * Upgrades a single broadcast message from version 1 to version 2.
16847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby     */
16947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static void upgradeMessageV1ToV2(SQLiteDatabase db, Cursor cursor) {
17047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int geographicalScope = cursor.getInt(COLUMN_V1_GEOGRAPHICAL_SCOPE);
17147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int updateNumber = cursor.getInt(COLUMN_V1_SERIAL_NUMBER);
17247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int messageCode = cursor.getInt(COLUMN_V1_MESSAGE_CODE);
17347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int messageId = cursor.getInt(COLUMN_V1_MESSAGE_IDENTIFIER);
17447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        String languageCode = cursor.getString(COLUMN_V1_LANGUAGE_CODE);
17547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        String messageBody = cursor.getString(COLUMN_V1_MESSAGE_BODY);
17647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        long deliveryTime = cursor.getLong(COLUMN_V1_DELIVERY_TIME);
17747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        boolean isRead = (cursor.getInt(COLUMN_V1_MESSAGE_READ) != 0);
17847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
17947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int serialNumber = ((geographicalScope & 0x03) << 14)
18047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                | ((messageCode & 0x3ff) << 4) | (updateNumber & 0x0f);
18147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
18247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        ContentValues cv = new ContentValues(16);
18347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.GEOGRAPHICAL_SCOPE, geographicalScope);
18447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.SERIAL_NUMBER, serialNumber);
18547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.SERVICE_CATEGORY, messageId);
18647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.LANGUAGE_CODE, languageCode);
18747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_BODY, messageBody);
18847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.DELIVERY_TIME, deliveryTime);
18947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_READ, isRead);
19047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_FORMAT, SmsCbMessage.MESSAGE_FORMAT_3GPP);
19147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
19247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int etwsWarningType = SmsCbEtwsInfo.ETWS_WARNING_TYPE_UNKNOWN;
19347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_UNKNOWN;
19447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN;
19547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN;
19647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        int cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN;
19747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        switch (messageId) {
19847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING:
19947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                etwsWarningType = SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE;
20047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
20147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
20247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_ETWS_TSUNAMI_WARNING:
20347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                etwsWarningType = SmsCbEtwsInfo.ETWS_WARNING_TYPE_TSUNAMI;
20447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
20547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
20647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING:
20747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                etwsWarningType = SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI;
20847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
20947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
21047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE:
21147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                etwsWarningType = SmsCbEtwsInfo.ETWS_WARNING_TYPE_TEST_MESSAGE;
21247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
21347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
21447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE:
21547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                etwsWarningType = SmsCbEtwsInfo.ETWS_WARNING_TYPE_OTHER_EMERGENCY;
21647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
21747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
21847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL:
21947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT;
22047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
22147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
22247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED:
22347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT;
22447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_EXTREME;
22547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE;
22647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED;
22747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
22847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
22947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY:
23047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT;
23147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_EXTREME;
23247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE;
23347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY;
23447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
23547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
23647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED:
237e348e51fedf48b9d07f5f737c0ae2ca10acdd356Anju Mathapati                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
23847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_EXTREME;
23947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_EXPECTED;
24047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED;
24147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
24247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
24347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_LIKELY:
244e348e51fedf48b9d07f5f737c0ae2ca10acdd356Anju Mathapati                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
24547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_EXTREME;
24647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_EXPECTED;
24747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY;
24847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
24947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
25047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_OBSERVED:
25147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
25247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_SEVERE;
25347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE;
25447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED;
25547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
25647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
25747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_IMMEDIATE_LIKELY:
25847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
25947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_SEVERE;
26047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE;
26147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY;
26247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
26347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
26447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_OBSERVED:
26547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
26647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_SEVERE;
26747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_EXPECTED;
26847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED;
26947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
27047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
27147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY:
27247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT;
27347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasSeverity = SmsCbCmasInfo.CMAS_SEVERITY_SEVERE;
27447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasUrgency = SmsCbCmasInfo.CMAS_URGENCY_EXPECTED;
27547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasCertainty = SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY;
27647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
27747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
27847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY:
27947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY;
28047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
28147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
28247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST:
28347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST;
28447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
28547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
28647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXERCISE:
28747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_CMAS_EXERCISE;
28847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
28947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
29047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            case SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE:
29147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                cmasMessageClass = SmsCbCmasInfo.CMAS_CLASS_OPERATOR_DEFINED_USE;
29247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                break;
29347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
29447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
29547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (etwsWarningType != SmsCbEtwsInfo.ETWS_WARNING_TYPE_UNKNOWN
29647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                || cmasMessageClass != SmsCbCmasInfo.CMAS_CLASS_UNKNOWN) {
29747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.MESSAGE_PRIORITY,
29847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                    SmsCbMessage.MESSAGE_PRIORITY_EMERGENCY);
29947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        } else {
30047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.MESSAGE_PRIORITY,
30147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby                    SmsCbMessage.MESSAGE_PRIORITY_NORMAL);
30247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
30347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
30447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (etwsWarningType != SmsCbEtwsInfo.ETWS_WARNING_TYPE_UNKNOWN) {
30547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.ETWS_WARNING_TYPE, etwsWarningType);
30647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
30747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
30847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (cmasMessageClass != SmsCbCmasInfo.CMAS_CLASS_UNKNOWN) {
30947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_MESSAGE_CLASS, cmasMessageClass);
31047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
31147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
31247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (cmasSeverity != SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN) {
31347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_SEVERITY, cmasSeverity);
31447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
31547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
31647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (cmasUrgency != SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN) {
31747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_URGENCY, cmasUrgency);
31847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
31947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
32047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        if (cmasCertainty != SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN) {
32147ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_CERTAINTY, cmasCertainty);
32247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        }
32347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
32447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        db.insert(TABLE_NAME, null, cv);
32547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    }
32647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby
32747ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    private static void log(String msg) {
32847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby        Log.d(TAG, msg);
32947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby    }
33047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby}
331