1c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby/*
2c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * Copyright (C) 2011 The Android Open Source Project
3c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby *
4c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * use this file except in compliance with the License. You may obtain a copy of
6c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * the License at
7c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby *
8c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0
9c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby *
10c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * Unless required by applicable law or agreed to in writing, software
11c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * License for the specific language governing permissions and limitations under
14c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * the License.
15c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby */
16c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
17c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambypackage android.telephony;
18c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
19c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.content.ContentValues;
20c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.content.Context;
21c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.database.Cursor;
22c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.graphics.Typeface;
23c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.os.Parcel;
24c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.os.Parcelable;
25c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.provider.Telephony;
26c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.telephony.SmsCbCmasInfo;
27c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.telephony.SmsCbEtwsInfo;
28c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.telephony.SmsCbLocation;
29c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.telephony.SmsCbMessage;
30c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.text.Spannable;
31c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.text.SpannableStringBuilder;
32c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.text.format.DateUtils;
33c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambyimport android.text.style.StyleSpan;
34c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
35c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby/**
36c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * Application wrapper for {@link SmsCbMessage}. This is Parcelable so that
37c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * decoded broadcast message objects can be passed between running Services.
38c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * New broadcasts are received by the CellBroadcastReceiver app, which exports
39c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * the database of previously received broadcasts at "content://cellbroadcasts/".
40c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * The "android.permission.READ_CELL_BROADCASTS" permission is required to read
41c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * from the ContentProvider, and writes to the database are not allowed.<p>
42c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby *
43c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * Use {@link #createFromCursor} to create CellBroadcastMessage objects from rows
44c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * in the database cursor returned by the ContentProvider.
45c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby *
46c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby * {@hide}
47c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby */
48c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hambypublic class CellBroadcastMessage implements Parcelable {
49c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
50c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /** Identifier for getExtra() when adding this object to an Intent. */
51c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public static final String SMS_CB_MESSAGE_EXTRA =
52c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            "com.android.cellbroadcastreceiver.SMS_CB_MESSAGE";
53c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
54c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /** SmsCbMessage. */
55c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    private final SmsCbMessage mSmsCbMessage;
56c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
57c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    private final long mDeliveryTime;
58c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    private boolean mIsRead;
59c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
60c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public CellBroadcastMessage(SmsCbMessage message) {
61c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mSmsCbMessage = message;
62c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mDeliveryTime = System.currentTimeMillis();
63c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mIsRead = false;
64c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
65c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
66c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    private CellBroadcastMessage(SmsCbMessage message, long deliveryTime, boolean isRead) {
67c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mSmsCbMessage = message;
68c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mDeliveryTime = deliveryTime;
69c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mIsRead = isRead;
70c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
71c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
72c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    private CellBroadcastMessage(Parcel in) {
73c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mSmsCbMessage = new SmsCbMessage(in);
74c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mDeliveryTime = in.readLong();
75c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mIsRead = (in.readInt() != 0);
76c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
77c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
78c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /** Parcelable: no special flags. */
79c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public int describeContents() {
80c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return 0;
81c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
82c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
83c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public void writeToParcel(Parcel out, int flags) {
84c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mSmsCbMessage.writeToParcel(out, flags);
85c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        out.writeLong(mDeliveryTime);
86c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        out.writeInt(mIsRead ? 1 : 0);
87c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
88c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
89c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public static final Parcelable.Creator<CellBroadcastMessage> CREATOR
90c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            = new Parcelable.Creator<CellBroadcastMessage>() {
91c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        public CellBroadcastMessage createFromParcel(Parcel in) {
92c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            return new CellBroadcastMessage(in);
93c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
94c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
95c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        public CellBroadcastMessage[] newArray(int size) {
96c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            return new CellBroadcastMessage[size];
97c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
98c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    };
99c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
100c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
101c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Create a CellBroadcastMessage from a row in the database.
102c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @param cursor an open SQLite cursor pointing to the row to read
103c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return the new CellBroadcastMessage
104c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @throws IllegalArgumentException if one of the required columns is missing
105c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
106c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public static CellBroadcastMessage createFromCursor(Cursor cursor) {
107c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int geoScope = cursor.getInt(
108c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.GEOGRAPHICAL_SCOPE));
109c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int serialNum = cursor.getInt(
110c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.SERIAL_NUMBER));
111c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int category = cursor.getInt(
112c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.SERVICE_CATEGORY));
113c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        String language = cursor.getString(
114c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.LANGUAGE_CODE));
115c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        String body = cursor.getString(
116c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.MESSAGE_BODY));
117c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int format = cursor.getInt(
118c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.MESSAGE_FORMAT));
119c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int priority = cursor.getInt(
120c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cursor.getColumnIndexOrThrow(Telephony.CellBroadcasts.MESSAGE_PRIORITY));
121c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
122c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        String plmn;
123c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int plmnColumn = cursor.getColumnIndex(Telephony.CellBroadcasts.PLMN);
124c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (plmnColumn != -1 && !cursor.isNull(plmnColumn)) {
125c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            plmn = cursor.getString(plmnColumn);
126c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        } else {
127c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            plmn = null;
128c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
129c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
130c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int lac;
131c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int lacColumn = cursor.getColumnIndex(Telephony.CellBroadcasts.LAC);
132c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (lacColumn != -1 && !cursor.isNull(lacColumn)) {
133c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            lac = cursor.getInt(lacColumn);
134c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        } else {
135c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            lac = -1;
136c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
137c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
138c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int cid;
139c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int cidColumn = cursor.getColumnIndex(Telephony.CellBroadcasts.CID);
140c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (cidColumn != -1 && !cursor.isNull(cidColumn)) {
141c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cid = cursor.getInt(cidColumn);
142c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        } else {
143c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cid = -1;
144c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
145c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
146c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbLocation location = new SmsCbLocation(plmn, lac, cid);
147c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
148c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbEtwsInfo etwsInfo;
149c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int etwsWarningTypeColumn = cursor.getColumnIndex(
150c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                Telephony.CellBroadcasts.ETWS_WARNING_TYPE);
151c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (etwsWarningTypeColumn != -1 && !cursor.isNull(etwsWarningTypeColumn)) {
152c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int warningType = cursor.getInt(etwsWarningTypeColumn);
153c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            etwsInfo = new SmsCbEtwsInfo(warningType, false, false, null);
154c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        } else {
155c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            etwsInfo = null;
156c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
157c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
158c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbCmasInfo cmasInfo;
159c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int cmasMessageClassColumn = cursor.getColumnIndex(
160c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                Telephony.CellBroadcasts.CMAS_MESSAGE_CLASS);
161c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (cmasMessageClassColumn != -1 && !cursor.isNull(cmasMessageClassColumn)) {
162c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int messageClass = cursor.getInt(cmasMessageClassColumn);
163c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
164c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int cmasCategory;
165c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int cmasCategoryColumn = cursor.getColumnIndex(
166c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                    Telephony.CellBroadcasts.CMAS_CATEGORY);
167c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            if (cmasCategoryColumn != -1 && !cursor.isNull(cmasCategoryColumn)) {
168c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cmasCategory = cursor.getInt(cmasCategoryColumn);
169c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            } else {
170c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cmasCategory = SmsCbCmasInfo.CMAS_CATEGORY_UNKNOWN;
171c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            }
172c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
173c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int responseType;
174c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int cmasResponseTypeColumn = cursor.getColumnIndex(
175c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                    Telephony.CellBroadcasts.CMAS_RESPONSE_TYPE);
176c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            if (cmasResponseTypeColumn != -1 && !cursor.isNull(cmasResponseTypeColumn)) {
177c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                responseType = cursor.getInt(cmasResponseTypeColumn);
178c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            } else {
179c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                responseType = SmsCbCmasInfo.CMAS_RESPONSE_TYPE_UNKNOWN;
180c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            }
181c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
182c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int severity;
183c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int cmasSeverityColumn = cursor.getColumnIndex(
184c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                    Telephony.CellBroadcasts.CMAS_SEVERITY);
185c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            if (cmasSeverityColumn != -1 && !cursor.isNull(cmasSeverityColumn)) {
186c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                severity = cursor.getInt(cmasSeverityColumn);
187c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            } else {
188c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                severity = SmsCbCmasInfo.CMAS_SEVERITY_UNKNOWN;
189c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            }
190c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
191c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int urgency;
192c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int cmasUrgencyColumn = cursor.getColumnIndex(
193c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                    Telephony.CellBroadcasts.CMAS_URGENCY);
194c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            if (cmasUrgencyColumn != -1 && !cursor.isNull(cmasUrgencyColumn)) {
195c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                urgency = cursor.getInt(cmasUrgencyColumn);
196c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            } else {
197c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                urgency = SmsCbCmasInfo.CMAS_URGENCY_UNKNOWN;
198c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            }
199c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
200c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int certainty;
201c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            int cmasCertaintyColumn = cursor.getColumnIndex(
202c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                    Telephony.CellBroadcasts.CMAS_CERTAINTY);
203c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            if (cmasCertaintyColumn != -1 && !cursor.isNull(cmasCertaintyColumn)) {
204c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                certainty = cursor.getInt(cmasCertaintyColumn);
205c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            } else {
206c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                certainty = SmsCbCmasInfo.CMAS_CERTAINTY_UNKNOWN;
207c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            }
208c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
209c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cmasInfo = new SmsCbCmasInfo(messageClass, cmasCategory, responseType, severity,
210c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                    urgency, certainty);
211c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        } else {
212c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cmasInfo = null;
213c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
214c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
215c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbMessage msg = new SmsCbMessage(format, geoScope, serialNum, location, category,
216c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                language, body, priority, etwsInfo, cmasInfo);
217c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
218c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        long deliveryTime = cursor.getLong(cursor.getColumnIndexOrThrow(
219c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                Telephony.CellBroadcasts.DELIVERY_TIME));
220c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        boolean isRead = (cursor.getInt(cursor.getColumnIndexOrThrow(
221c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                Telephony.CellBroadcasts.MESSAGE_READ)) != 0);
222c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
223c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return new CellBroadcastMessage(msg, deliveryTime, isRead);
224c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
225c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
226c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
227c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return a ContentValues object for insertion into the database.
228c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return a new ContentValues object containing this object's data
229c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
230c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public ContentValues getContentValues() {
231c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        ContentValues cv = new ContentValues(16);
232c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbMessage msg = mSmsCbMessage;
233c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.GEOGRAPHICAL_SCOPE, msg.getGeographicalScope());
234c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbLocation location = msg.getLocation();
235c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (location.getPlmn() != null) {
236c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.PLMN, location.getPlmn());
237c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
238c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (location.getLac() != -1) {
239c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.LAC, location.getLac());
240c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
241c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (location.getCid() != -1) {
242c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CID, location.getCid());
243c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
244c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.SERIAL_NUMBER, msg.getSerialNumber());
245c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.SERVICE_CATEGORY, msg.getServiceCategory());
246c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.LANGUAGE_CODE, msg.getLanguageCode());
247c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_BODY, msg.getMessageBody());
248c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.DELIVERY_TIME, mDeliveryTime);
249c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_READ, mIsRead);
250c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_FORMAT, msg.getMessageFormat());
251c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        cv.put(Telephony.CellBroadcasts.MESSAGE_PRIORITY, msg.getMessagePriority());
252c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
253c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbEtwsInfo etwsInfo = mSmsCbMessage.getEtwsWarningInfo();
254c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (etwsInfo != null) {
255c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.ETWS_WARNING_TYPE, etwsInfo.getWarningType());
256c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
257c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
258c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbCmasInfo cmasInfo = mSmsCbMessage.getCmasWarningInfo();
259c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (cmasInfo != null) {
260c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_MESSAGE_CLASS, cmasInfo.getMessageClass());
261c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_CATEGORY, cmasInfo.getCategory());
262c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_RESPONSE_TYPE, cmasInfo.getResponseType());
263c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_SEVERITY, cmasInfo.getSeverity());
264c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_URGENCY, cmasInfo.getUrgency());
265c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            cv.put(Telephony.CellBroadcasts.CMAS_CERTAINTY, cmasInfo.getCertainty());
266c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
267c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
268c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return cv;
269c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
270c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
271c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
272c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Set or clear the "read message" flag.
273c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @param isRead true if the message has been read; false if not
274c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
275c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public void setIsRead(boolean isRead) {
276c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        mIsRead = isRead;
277c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
278c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
279c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public String getLanguageCode() {
280c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.getLanguageCode();
281c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
282c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
283c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public int getServiceCategory() {
284c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.getServiceCategory();
285c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
286c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
287c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public long getDeliveryTime() {
288c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mDeliveryTime;
289c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
290c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
291c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public String getMessageBody() {
292c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.getMessageBody();
293c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
294c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
295c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isRead() {
296c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mIsRead;
297c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
298c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
299c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public int getSerialNumber() {
300c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.getSerialNumber();
301c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
302c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
303c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public SmsCbCmasInfo getCmasWarningInfo() {
304c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.getCmasWarningInfo();
305c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
306c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
307c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public SmsCbEtwsInfo getEtwsWarningInfo() {
308c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.getEtwsWarningInfo();
309c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
310c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
311c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
312c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return whether the broadcast is an emergency (PWS) message type.
313c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * This includes lower priority test messages and Amber alerts.
314c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     *
315c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * All public alerts show the flashing warning icon in the dialog,
316c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * but only emergency alerts play the alert sound and speak the message.
317c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     *
318c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message is PWS type; false otherwise
319c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
320c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isPublicAlertMessage() {
321c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.isEmergencyMessage();
322c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
323c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
324c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
325c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Returns whether the broadcast is an emergency (PWS) message type,
326c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * including test messages, but excluding lower priority Amber alert broadcasts.
327c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     *
328c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message is PWS type, excluding Amber alerts
329c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
330c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isEmergencyAlertMessage() {
331c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (!mSmsCbMessage.isEmergencyMessage()) {
332c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            return false;
333c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
334c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbCmasInfo cmasInfo = mSmsCbMessage.getCmasWarningInfo();
335c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (cmasInfo != null &&
336c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                cmasInfo.getMessageClass() == SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY) {
337c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            return false;
338c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
339c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return true;
340c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
341c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
342c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
343c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return whether the broadcast is an ETWS emergency message type.
344c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message is ETWS emergency type; false otherwise
345c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
346c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isEtwsMessage() {
347c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.isEtwsMessage();
348c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
349c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
350c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
351c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return whether the broadcast is a CMAS emergency message type.
352c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message is CMAS emergency type; false otherwise
353c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
354c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isCmasMessage() {
355c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return mSmsCbMessage.isCmasMessage();
356c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
357c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
358c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
359c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return the CMAS message class.
360c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return the CMAS message class, e.g. {@link SmsCbCmasInfo#CMAS_CLASS_SEVERE_THREAT}, or
361c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     *  {@link SmsCbCmasInfo#CMAS_CLASS_UNKNOWN} if this is not a CMAS alert
362c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
363c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public int getCmasMessageClass() {
364c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        if (mSmsCbMessage.isCmasMessage()) {
365c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            return mSmsCbMessage.getCmasWarningInfo().getMessageClass();
366c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        } else {
367c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby            return SmsCbCmasInfo.CMAS_CLASS_UNKNOWN;
368c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        }
369c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
370c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
371c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
372c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return whether the broadcast is an ETWS popup alert.
373c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * This method checks the message ID and the message code.
374c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message indicates an ETWS popup alert
375c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
376c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isEtwsPopupAlert() {
377c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbEtwsInfo etwsInfo = mSmsCbMessage.getEtwsWarningInfo();
378c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return etwsInfo != null && etwsInfo.isPopupAlert();
379c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
380c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
381c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
382c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return whether the broadcast is an ETWS emergency user alert.
383c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * This method checks the message ID and the message code.
384c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message indicates an ETWS emergency user alert
385c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
386c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isEtwsEmergencyUserAlert() {
387c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbEtwsInfo etwsInfo = mSmsCbMessage.getEtwsWarningInfo();
388c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return etwsInfo != null && etwsInfo.isEmergencyUserAlert();
389c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
390c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
391c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
392c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return whether the broadcast is an ETWS test message.
393c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return true if the message is an ETWS test message; false otherwise
394c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
395c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public boolean isEtwsTestMessage() {
396c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        SmsCbEtwsInfo etwsInfo = mSmsCbMessage.getEtwsWarningInfo();
397c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return etwsInfo != null &&
398c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                etwsInfo.getWarningType() == SmsCbEtwsInfo.ETWS_WARNING_TYPE_TEST_MESSAGE;
399c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
400c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
401c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
402c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return the abbreviated date string for the message delivery time.
403c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @param context the context object
404c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return a String to use in the broadcast list UI
405c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
406c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public String getDateString(Context context) {
407c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int flags = DateUtils.FORMAT_NO_NOON_MIDNIGHT | DateUtils.FORMAT_SHOW_TIME |
408c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                DateUtils.FORMAT_ABBREV_ALL | DateUtils.FORMAT_SHOW_DATE |
409c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby                DateUtils.FORMAT_CAP_AMPM;
410c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return DateUtils.formatDateTime(context, mDeliveryTime, flags);
411c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
412c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby
413c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    /**
414c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * Return the date string for the message delivery time, suitable for text-to-speech.
415c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @param context the context object
416c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     * @return a String for populating the list item AccessibilityEvent for TTS
417c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby     */
418c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    public String getSpokenDateString(Context context) {
419c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        int flags = DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE;
420c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby        return DateUtils.formatDateTime(context, mDeliveryTime, flags);
421c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby    }
422c3296ffdfc70c6778b6ae760b812b4e53e335f97Jake Hamby}
423