Home | History | Annotate | Download | only in cellbroadcastreceiver
      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 
     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      */
     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 
     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 
     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      */
    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      */
    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      */
    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      */
    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      */
    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 
    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