1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5  * use this file except in compliance with the License. You may obtain a copy of
6  * the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13  * License for the specific language governing permissions and limitations under
14  * the License.
15  */
16 
17 package com.android.cellbroadcastreceiver;
18 
19 import android.content.Context;
20 import android.graphics.Typeface;
21 import android.telephony.CellBroadcastMessage;
22 import android.telephony.SmsCbCmasInfo;
23 import android.telephony.SmsCbEtwsInfo;
24 import android.text.Spannable;
25 import android.text.SpannableStringBuilder;
26 import android.text.style.StyleSpan;
27 
28 /**
29  * Returns the string resource ID's for CMAS and ETWS emergency alerts.
30  */
31 public class CellBroadcastResources {
32 
CellBroadcastResources()33     private CellBroadcastResources() {
34     }
35 
36     /**
37      * Returns a styled CharSequence containing the message date/time and alert details.
38      * @param context a Context for resource string access
39      * @return a CharSequence for display in the broadcast alert dialog
40      */
getMessageDetails(Context context, CellBroadcastMessage cbm)41     public static CharSequence getMessageDetails(Context context, CellBroadcastMessage cbm) {
42         SpannableStringBuilder buf = new SpannableStringBuilder();
43 
44         // Alert date/time
45         int start = buf.length();
46         buf.append(context.getString(R.string.delivery_time_heading));
47         int end = buf.length();
48         buf.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
49         buf.append(" ");
50         buf.append(cbm.getDateString(context));
51 
52         if (cbm.isCmasMessage()) {
53             // CMAS category, response type, severity, urgency, certainty
54             appendCmasAlertDetails(context, buf, cbm.getCmasWarningInfo());
55         }
56 
57         return buf;
58     }
59 
appendCmasAlertDetails(Context context, SpannableStringBuilder buf, SmsCbCmasInfo cmasInfo)60     private static void appendCmasAlertDetails(Context context, SpannableStringBuilder buf,
61             SmsCbCmasInfo cmasInfo) {
62         // CMAS category
63         int categoryId = getCmasCategoryResId(cmasInfo);
64         if (categoryId != 0) {
65             appendMessageDetail(context, buf, R.string.cmas_category_heading, categoryId);
66         }
67 
68         // CMAS response type
69         int responseId = getCmasResponseResId(cmasInfo);
70         if (responseId != 0) {
71             appendMessageDetail(context, buf, R.string.cmas_response_heading, responseId);
72         }
73 
74         // CMAS severity
75         int severityId = getCmasSeverityResId(cmasInfo);
76         if (severityId != 0) {
77             appendMessageDetail(context, buf, R.string.cmas_severity_heading, severityId);
78         }
79 
80         // CMAS urgency
81         int urgencyId = getCmasUrgencyResId(cmasInfo);
82         if (urgencyId != 0) {
83             appendMessageDetail(context, buf, R.string.cmas_urgency_heading, urgencyId);
84         }
85 
86         // CMAS certainty
87         int certaintyId = getCmasCertaintyResId(cmasInfo);
88         if (certaintyId != 0) {
89             appendMessageDetail(context, buf, R.string.cmas_certainty_heading, certaintyId);
90         }
91     }
92 
appendMessageDetail(Context context, SpannableStringBuilder buf, int typeId, int valueId)93     private static void appendMessageDetail(Context context, SpannableStringBuilder buf,
94             int typeId, int valueId) {
95         if (buf.length() != 0) {
96             buf.append("\n");
97         }
98         int start = buf.length();
99         buf.append(context.getString(typeId));
100         int end = buf.length();
101         buf.setSpan(new StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
102         buf.append(" ");
103         buf.append(context.getString(valueId));
104     }
105 
106     /**
107      * Returns the string resource ID for the CMAS category.
108      * @return a string resource ID, or 0 if the CMAS category is unknown or not present
109      */
getCmasCategoryResId(SmsCbCmasInfo cmasInfo)110     private static int getCmasCategoryResId(SmsCbCmasInfo cmasInfo) {
111         switch (cmasInfo.getCategory()) {
112             case SmsCbCmasInfo.CMAS_CATEGORY_GEO:
113                 return R.string.cmas_category_geo;
114 
115             case SmsCbCmasInfo.CMAS_CATEGORY_MET:
116                 return R.string.cmas_category_met;
117 
118             case SmsCbCmasInfo.CMAS_CATEGORY_SAFETY:
119                 return R.string.cmas_category_safety;
120 
121             case SmsCbCmasInfo.CMAS_CATEGORY_SECURITY:
122                 return R.string.cmas_category_security;
123 
124             case SmsCbCmasInfo.CMAS_CATEGORY_RESCUE:
125                 return R.string.cmas_category_rescue;
126 
127             case SmsCbCmasInfo.CMAS_CATEGORY_FIRE:
128                 return R.string.cmas_category_fire;
129 
130             case SmsCbCmasInfo.CMAS_CATEGORY_HEALTH:
131                 return R.string.cmas_category_health;
132 
133             case SmsCbCmasInfo.CMAS_CATEGORY_ENV:
134                 return R.string.cmas_category_env;
135 
136             case SmsCbCmasInfo.CMAS_CATEGORY_TRANSPORT:
137                 return R.string.cmas_category_transport;
138 
139             case SmsCbCmasInfo.CMAS_CATEGORY_INFRA:
140                 return R.string.cmas_category_infra;
141 
142             case SmsCbCmasInfo.CMAS_CATEGORY_CBRNE:
143                 return R.string.cmas_category_cbrne;
144 
145             case SmsCbCmasInfo.CMAS_CATEGORY_OTHER:
146                 return R.string.cmas_category_other;
147 
148             default:
149                 return 0;
150         }
151     }
152 
153     /**
154      * Returns the string resource ID for the CMAS response type.
155      * @return a string resource ID, or 0 if the CMAS response type is unknown or not present
156      */
getCmasResponseResId(SmsCbCmasInfo cmasInfo)157     private static int getCmasResponseResId(SmsCbCmasInfo cmasInfo) {
158         switch (cmasInfo.getResponseType()) {
159             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_SHELTER:
160                 return R.string.cmas_response_shelter;
161 
162             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_EVACUATE:
163                 return R.string.cmas_response_evacuate;
164 
165             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_PREPARE:
166                 return R.string.cmas_response_prepare;
167 
168             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_EXECUTE:
169                 return R.string.cmas_response_execute;
170 
171             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_MONITOR:
172                 return R.string.cmas_response_monitor;
173 
174             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_AVOID:
175                 return R.string.cmas_response_avoid;
176 
177             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_ASSESS:
178                 return R.string.cmas_response_assess;
179 
180             case SmsCbCmasInfo.CMAS_RESPONSE_TYPE_NONE:
181                 return R.string.cmas_response_none;
182 
183             default:
184                 return 0;
185         }
186     }
187 
188     /**
189      * Returns the string resource ID for the CMAS severity.
190      * @return a string resource ID, or 0 if the CMAS severity is unknown or not present
191      */
getCmasSeverityResId(SmsCbCmasInfo cmasInfo)192     private static int getCmasSeverityResId(SmsCbCmasInfo cmasInfo) {
193         switch (cmasInfo.getSeverity()) {
194             case SmsCbCmasInfo.CMAS_SEVERITY_EXTREME:
195                 return R.string.cmas_severity_extreme;
196 
197             case SmsCbCmasInfo.CMAS_SEVERITY_SEVERE:
198                 return R.string.cmas_severity_severe;
199 
200             default:
201                 return 0;
202         }
203     }
204 
205     /**
206      * Returns the string resource ID for the CMAS urgency.
207      * @return a string resource ID, or 0 if the CMAS urgency is unknown or not present
208      */
getCmasUrgencyResId(SmsCbCmasInfo cmasInfo)209     private static int getCmasUrgencyResId(SmsCbCmasInfo cmasInfo) {
210         switch (cmasInfo.getUrgency()) {
211             case SmsCbCmasInfo.CMAS_URGENCY_IMMEDIATE:
212                 return R.string.cmas_urgency_immediate;
213 
214             case SmsCbCmasInfo.CMAS_URGENCY_EXPECTED:
215                 return R.string.cmas_urgency_expected;
216 
217             default:
218                 return 0;
219         }
220     }
221 
222     /**
223      * Returns the string resource ID for the CMAS certainty.
224      * @return a string resource ID, or 0 if the CMAS certainty is unknown or not present
225      */
getCmasCertaintyResId(SmsCbCmasInfo cmasInfo)226     private static int getCmasCertaintyResId(SmsCbCmasInfo cmasInfo) {
227         switch (cmasInfo.getCertainty()) {
228             case SmsCbCmasInfo.CMAS_CERTAINTY_OBSERVED:
229                 return R.string.cmas_certainty_observed;
230 
231             case SmsCbCmasInfo.CMAS_CERTAINTY_LIKELY:
232                 return R.string.cmas_certainty_likely;
233 
234             default:
235                 return 0;
236         }
237     }
238 
getDialogTitleResource(CellBroadcastMessage cbm)239     public static int getDialogTitleResource(CellBroadcastMessage cbm) {
240         // ETWS warning types
241         SmsCbEtwsInfo etwsInfo = cbm.getEtwsWarningInfo();
242         if (etwsInfo != null) {
243             switch (etwsInfo.getWarningType()) {
244                 case SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE:
245                     return R.string.etws_earthquake_warning;
246 
247                 case SmsCbEtwsInfo.ETWS_WARNING_TYPE_TSUNAMI:
248                     return R.string.etws_tsunami_warning;
249 
250                 case SmsCbEtwsInfo.ETWS_WARNING_TYPE_EARTHQUAKE_AND_TSUNAMI:
251                     return R.string.etws_earthquake_and_tsunami_warning;
252 
253                 case SmsCbEtwsInfo.ETWS_WARNING_TYPE_TEST_MESSAGE:
254                     return R.string.etws_test_message;
255 
256                 case SmsCbEtwsInfo.ETWS_WARNING_TYPE_OTHER_EMERGENCY:
257                 default:
258                     return R.string.etws_other_emergency_type;
259             }
260         }
261 
262         // CMAS warning types
263         SmsCbCmasInfo cmasInfo = cbm.getCmasWarningInfo();
264         if (cmasInfo != null) {
265             switch (cmasInfo.getMessageClass()) {
266                 case SmsCbCmasInfo.CMAS_CLASS_PRESIDENTIAL_LEVEL_ALERT:
267                     return R.string.cmas_presidential_level_alert;
268 
269                 case SmsCbCmasInfo.CMAS_CLASS_EXTREME_THREAT:
270                     return R.string.cmas_extreme_alert;
271 
272                 case SmsCbCmasInfo.CMAS_CLASS_SEVERE_THREAT:
273                     return R.string.cmas_severe_alert;
274 
275                 case SmsCbCmasInfo.CMAS_CLASS_CHILD_ABDUCTION_EMERGENCY:
276                     return R.string.cmas_amber_alert;
277 
278                 case SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST:
279                     return R.string.cmas_required_monthly_test;
280 
281                 case SmsCbCmasInfo.CMAS_CLASS_CMAS_EXERCISE:
282                     return R.string.cmas_exercise_alert;
283 
284                 case SmsCbCmasInfo.CMAS_CLASS_OPERATOR_DEFINED_USE:
285                     return R.string.cmas_operator_defined_alert;
286 
287                 default:
288                     return R.string.pws_other_message_identifiers;
289             }
290         }
291 
292         if (CellBroadcastConfigService.isEmergencyAlertMessage(cbm)) {
293             return R.string.pws_other_message_identifiers;
294         } else {
295             return R.string.cb_other_message_identifiers;
296         }
297     }
298 }
299