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");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of 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,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.cellbroadcastreceiver;
     18 
     19 import android.app.IntentService;
     20 import android.content.Context;
     21 import android.content.Intent;
     22 import android.content.SharedPreferences;
     23 import android.content.res.Resources;
     24 import android.os.SystemProperties;
     25 import android.preference.PreferenceManager;
     26 import android.telephony.CellBroadcastMessage;
     27 import android.telephony.SmsManager;
     28 import android.telephony.SubscriptionManager;
     29 import android.telephony.TelephonyManager;
     30 import android.text.TextUtils;
     31 import android.util.Log;
     32 
     33 import com.android.internal.telephony.cdma.sms.SmsEnvelope;
     34 import com.android.internal.telephony.gsm.SmsCbConstants;
     35 
     36 import static com.android.cellbroadcastreceiver.CellBroadcastReceiver.DBG;
     37 
     38 /**
     39  * This service manages enabling and disabling ranges of message identifiers
     40  * that the radio should listen for. It operates independently of the other
     41  * services and runs at boot time and after exiting airplane mode.
     42  *
     43  * Note that the entire range of emergency channels is enabled. Test messages
     44  * and lower priority broadcasts are filtered out in CellBroadcastAlertService
     45  * if the user has not enabled them in settings.
     46  *
     47  * TODO: add notification to re-enable channels after a radio reset.
     48  */
     49 public class CellBroadcastConfigService extends IntentService {
     50     private static final String TAG = "CellBroadcastConfigService";
     51 
     52     static final String ACTION_ENABLE_CHANNELS = "ACTION_ENABLE_CHANNELS";
     53 
     54     static final String EMERGENCY_BROADCAST_RANGE_GSM =
     55             "ro.cb.gsm.emergencyids";
     56 
     57     private static final String COUNTRY_TAIWAN = "tw";
     58     private static final String COUNTRY_ISRAEL = "ir";
     59     private static final String COUNTRY_BRAZIL = "br";
     60 
     61     public CellBroadcastConfigService() {
     62         super(TAG);          // use class name for worker thread name
     63     }
     64 
     65     private static void setChannelRange(SmsManager manager, String ranges, boolean enable) {
     66         if (DBG)log("setChannelRange: " + ranges);
     67 
     68         try {
     69             for (String channelRange : ranges.split(",")) {
     70                 int dashIndex = channelRange.indexOf('-');
     71                 if (dashIndex != -1) {
     72                     int startId = Integer.decode(channelRange.substring(0, dashIndex).trim());
     73                     int endId = Integer.decode(channelRange.substring(dashIndex + 1).trim());
     74                     if (enable) {
     75                         if (DBG) log("enabling emergency IDs " + startId + '-' + endId);
     76                         manager.enableCellBroadcastRange(startId, endId,
     77                                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
     78                     } else {
     79                         if (DBG) log("disabling emergency IDs " + startId + '-' + endId);
     80                         manager.disableCellBroadcastRange(startId, endId,
     81                                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
     82                     }
     83                 } else {
     84                     int messageId = Integer.decode(channelRange.trim());
     85                     if (enable) {
     86                         if (DBG) log("enabling emergency message ID " + messageId);
     87                         manager.enableCellBroadcast(messageId,
     88                                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
     89                     } else {
     90                         if (DBG) log("disabling emergency message ID " + messageId);
     91                         manager.disableCellBroadcast(messageId,
     92                                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
     93                     }
     94                 }
     95             }
     96         } catch (NumberFormatException e) {
     97             Log.e(TAG, "Number Format Exception parsing emergency channel range", e);
     98         }
     99 
    100         // Make sure CMAS Presidential is enabled (See 3GPP TS 22.268 Section 6.2).
    101         if (DBG) log("setChannelRange: enabling CMAS Presidential");
    102         manager.enableCellBroadcast(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL,
    103                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
    104         // register Taiwan PWS 4383 also, by default
    105         manager.enableCellBroadcast(
    106                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE,
    107                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM);
    108         manager.enableCellBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT,
    109                 SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA);
    110     }
    111 
    112     /**
    113      * Returns true if this is a standard or operator-defined emergency alert message.
    114      * This includes all ETWS and CMAS alerts, except for AMBER alerts.
    115      * @param message the message to test
    116      * @return true if the message is an emergency alert; false otherwise
    117      */
    118     static boolean isEmergencyAlertMessage(CellBroadcastMessage message) {
    119 
    120         if (message == null) {
    121             return false;
    122         }
    123 
    124         if (message.isEmergencyAlertMessage()) {
    125             return true;
    126         }
    127 
    128         // Todo: Move the followings to CarrierConfig
    129         // Check for system property defining the emergency channel ranges to enable
    130         String emergencyIdRange = (CellBroadcastReceiver.phoneIsCdma()) ?
    131                 "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM);
    132 
    133         if (TextUtils.isEmpty(emergencyIdRange)) {
    134             return false;
    135         }
    136         try {
    137             int messageId = message.getServiceCategory();
    138             for (String channelRange : emergencyIdRange.split(",")) {
    139                 int dashIndex = channelRange.indexOf('-');
    140                 if (dashIndex != -1) {
    141                     int startId = Integer.decode(channelRange.substring(0, dashIndex).trim());
    142                     int endId = Integer.decode(channelRange.substring(dashIndex + 1).trim());
    143                     if (messageId >= startId && messageId <= endId) {
    144                         return true;
    145                     }
    146                 } else {
    147                     int emergencyMessageId = Integer.decode(channelRange.trim());
    148                     if (emergencyMessageId == messageId) {
    149                         return true;
    150                     }
    151                 }
    152             }
    153         } catch (NumberFormatException e) {
    154             Log.e(TAG, "Number Format Exception parsing emergency channel range", e);
    155         }
    156         return false;
    157     }
    158 
    159     @Override
    160     protected void onHandleIntent(Intent intent) {
    161         if (ACTION_ENABLE_CHANNELS.equals(intent.getAction())) {
    162             try {
    163 
    164                 SubscriptionManager subManager = SubscriptionManager.from(getApplicationContext());
    165                 int subId = SubscriptionManager.getDefaultSmsSubscriptionId();
    166                 if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
    167                     subId = SubscriptionManager.getDefaultSubscriptionId();
    168                     if (subId == SubscriptionManager.INVALID_SUBSCRIPTION_ID &&
    169                             subManager != null) {
    170                         int [] subIds = subManager.getActiveSubscriptionIdList();
    171                         if (subIds.length != 0) {
    172                             subId = subIds[0];
    173                         }
    174                     }
    175                 }
    176 
    177                 if (subManager != null) {
    178                     // Retrieve all the active sub ids. We only want to enable
    179                     // cell broadcast on the sub we are interested in and we'll disable
    180                     // it on other subs so the users will not receive duplicate messages from
    181                     // multiple carriers (e.g. for multi-sim users).
    182                     int [] subIds = subManager.getActiveSubscriptionIdList();
    183                     if (subIds.length != 0)
    184                     {
    185                         for (int id : subIds) {
    186                             SmsManager manager = SmsManager.getSmsManagerForSubscriptionId(id);
    187                             if (manager != null) {
    188                                 if (id == subId) {
    189                                     // Enable cell broadcast messages on this sub.
    190                                     log("Enable CellBroadcast on sub " + id);
    191                                     setCellBroadcastOnSub(manager, id, true);
    192                                 }
    193                                 else {
    194                                     // Disable all cell broadcast message on this sub.
    195                                     // This is only for multi-sim scenario. For single SIM device
    196                                     // we should not reach here.
    197                                     log("Disable CellBroadcast on sub " + id);
    198                                     setCellBroadcastOnSub(manager, id, false);
    199                                 }
    200                             }
    201                         }
    202                     }
    203                     else {
    204                         // For no sim scenario.
    205                         SmsManager manager = SmsManager.getDefault();
    206                         if (manager != null) {
    207                             setCellBroadcastOnSub(manager,
    208                                     SubscriptionManager.INVALID_SUBSCRIPTION_ID, true);
    209                         }
    210                     }
    211                 }
    212             } catch (Exception ex) {
    213                 Log.e(TAG, "exception enabling cell broadcast channels", ex);
    214             }
    215         }
    216     }
    217 
    218     /**
    219      * Enable/disable cell broadcast messages id on one subscription
    220      * This includes all ETWS and CMAS alerts.
    221      * @param manager SMS manager
    222      * @param subId Subscription id
    223      * @param enableForSub True if want to enable messages on this sub (e.g default SMS). False
    224      *                     will disable all messages
    225      */
    226     private void setCellBroadcastOnSub(SmsManager manager, int subId, boolean enableForSub) {
    227 
    228         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    229         Resources res = getResources();
    230 
    231         // boolean for each user preference checkbox, true for checked, false for unchecked
    232         // Note: If enableEmergencyAlerts is false, it disables ALL emergency broadcasts
    233         // except for CMAS presidential. i.e. to receive CMAS severe alerts, both
    234         // enableEmergencyAlerts AND enableCmasSevereAlerts must be true.
    235         boolean enableEmergencyAlerts = enableForSub && prefs.getBoolean(
    236                 CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true);
    237 
    238         // Todo: Move this to CarrierConfig later.
    239         String emergencyIdRange = (CellBroadcastReceiver.phoneIsCdma()) ?
    240                 "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM);
    241         if (enableEmergencyAlerts) {
    242             if (DBG) log("Enable CellBroadcast with carrier defined message id ranges.");
    243             if (!TextUtils.isEmpty(emergencyIdRange)) {
    244                 setChannelRange(manager, emergencyIdRange, true);
    245             }
    246         }
    247         else {
    248             if (DBG) log("Disable CellBroadcast with carrier defined message id ranges.");
    249             if (!TextUtils.isEmpty(emergencyIdRange)) {
    250                 setChannelRange(manager, emergencyIdRange, false);
    251             }
    252         }
    253 
    254         boolean enableEtwsAlerts = enableEmergencyAlerts;
    255 
    256         // CMAS Presidential must be always on (See 3GPP TS 22.268 Section 6.2) regardless
    257         // user's preference
    258         boolean enablePresidential = enableForSub;
    259 
    260         boolean enableCmasExtremeAlerts = enableEmergencyAlerts && prefs.getBoolean(
    261                 CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, true);
    262 
    263         boolean enableCmasSevereAlerts = enableEmergencyAlerts && prefs.getBoolean(
    264                 CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, true);
    265 
    266         boolean enableCmasAmberAlerts = enableEmergencyAlerts && prefs.getBoolean(
    267                 CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, true);
    268 
    269         // Check if ETWS/CMAS test message is forced disabled on the device.
    270         boolean forceDisableEtwsCmasTest =
    271                 CellBroadcastSettings.isEtwsCmasTestMessageForcedDisabled(this);
    272 
    273         boolean enableEtwsTestAlerts = !forceDisableEtwsCmasTest &&
    274                 enableEmergencyAlerts &&
    275                 prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_ETWS_TEST_ALERTS, false);
    276 
    277         boolean enableCmasTestAlerts = !forceDisableEtwsCmasTest &&
    278                 enableEmergencyAlerts &&
    279                 prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS, false);
    280 
    281         TelephonyManager tm = (TelephonyManager) getSystemService(
    282                 Context.TELEPHONY_SERVICE);
    283 
    284         boolean enableChannel50Support = res.getBoolean(R.bool.show_brazil_settings) ||
    285                 COUNTRY_BRAZIL.equals(tm.getSimCountryIso(subId));
    286 
    287         boolean enableChannel50Alerts = enableChannel50Support &&
    288                 prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CHANNEL_50_ALERTS, true);
    289 
    290         // Current Israel requires enable certain CMAS messages ids.
    291         // Todo: Move this to CarrierConfig later.
    292         boolean supportIsraelPwsAlerts = (COUNTRY_ISRAEL.equals(tm.getSimCountryIso(subId))
    293                 || COUNTRY_ISRAEL.equals(tm.getNetworkCountryIso(subId)));
    294 
    295         boolean supportTaiwanPwsAlerts = (COUNTRY_TAIWAN.equals(tm.getSimCountryIso(subId))
    296                 || COUNTRY_TAIWAN.equals(tm.getNetworkCountryIso(subId)));
    297 
    298         if (DBG) {
    299             log("enableEmergencyAlerts = " + enableEmergencyAlerts);
    300             log("enableEtwsAlerts = " + enableEtwsAlerts);
    301             log("enablePresidential = " + enablePresidential);
    302             log("enableCmasExtremeAlerts = " + enableCmasExtremeAlerts);
    303             log("enableCmasSevereAlerts = " + enableCmasExtremeAlerts);
    304             log("enableCmasAmberAlerts = " + enableCmasAmberAlerts);
    305             log("forceDisableEtwsCmasTest = " + forceDisableEtwsCmasTest);
    306             log("enableEtwsTestAlerts = " + enableEtwsTestAlerts);
    307             log("enableCmasTestAlerts = " + enableCmasTestAlerts);
    308             log("enableChannel50Alerts = " + enableChannel50Alerts);
    309             log("supportIsraelPwsAlerts = " + supportIsraelPwsAlerts);
    310             log("supportTaiwanPwsAlerts = " + supportTaiwanPwsAlerts);
    311         }
    312 
    313         /** Enable CDMA CMAS series messages. */
    314 
    315         // Enable/Disable CDMA Presidential messages.
    316         setCellBroadcastRange(manager, enablePresidential,
    317                 SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA,
    318                 SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT,
    319                 SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT);
    320 
    321         // Enable/Disable CDMA CMAS extreme messages.
    322         setCellBroadcastRange(manager, enableCmasExtremeAlerts,
    323                 SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA,
    324                 SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT,
    325                 SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT);
    326 
    327         // Enable/Disable CDMA CMAS severe messages.
    328         setCellBroadcastRange(manager, enableCmasSevereAlerts,
    329                 SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA,
    330                 SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT,
    331                 SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT);
    332 
    333         // Enable/Disable CDMA CMAS amber alert messages.
    334         setCellBroadcastRange(manager, enableCmasAmberAlerts,
    335                 SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA,
    336                 SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY,
    337                 SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY);
    338 
    339         // Enable/Disable CDMA CMAS test messages.
    340         setCellBroadcastRange(manager, enableCmasTestAlerts,
    341                 SmsManager.CELL_BROADCAST_RAN_TYPE_CDMA,
    342                 SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE,
    343                 SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE);
    344 
    345         /** Enable GSM ETWS series messages. */
    346 
    347         // Enable/Disable GSM ETWS messages.
    348         setCellBroadcastRange(manager, enableEtwsAlerts,
    349                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    350                 SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING,
    351                 SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING);
    352 
    353         // Enable/Disable GSM ETWS test messages (4355).
    354         setCellBroadcastRange(manager, enableEtwsTestAlerts,
    355                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    356                 SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE,
    357                 SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE);
    358 
    359         /** Enable GSM CMAS series messages. */
    360 
    361         // Enable/Disable GSM CMAS presidential message (4370).
    362         setCellBroadcastRange(manager, enablePresidential,
    363                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    364                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL,
    365                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL);
    366 
    367         // Enable/Disable GSM CMAS extreme messages (4371~4372).
    368         setCellBroadcastRange(manager, enableCmasExtremeAlerts,
    369                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    370                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED,
    371                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY);
    372 
    373         // Enable/Disable GSM CMAS severe messages (4373~4378).
    374         setCellBroadcastRange(manager, enableCmasSevereAlerts,
    375                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    376                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED,
    377                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY);
    378 
    379         // Enable/Disable GSM CMAS amber alert messages (4379).
    380         setCellBroadcastRange(manager, enableCmasAmberAlerts,
    381                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    382                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY,
    383                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY);
    384 
    385         // Enable/Disable GSM CMAS test messages (4380~4382).
    386         setCellBroadcastRange(manager, enableCmasTestAlerts,
    387                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    388                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST,
    389                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE);
    390 
    391 
    392         /** Enable GSM CMAS series messages for additional languages. */
    393 
    394         // Enable/Disable GSM CMAS presidential messages for additional languages (4383).
    395         setCellBroadcastRange(manager, enablePresidential,
    396                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    397                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE,
    398                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL_LANGUAGE);
    399 
    400         // Enable/Disable GSM CMAS extreme messages for additional languages (4384~4385).
    401         setCellBroadcastRange(manager, enableCmasExtremeAlerts,
    402                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    403                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED_LANGUAGE,
    404                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY_LANGUAGE);
    405 
    406         // Enable/Disable GSM CMAS severe messages for additional languages (4386~4391).
    407         setCellBroadcastRange(manager, enableCmasSevereAlerts,
    408                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    409                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED_LANGUAGE,
    410                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY_LANGUAGE);
    411 
    412         // Enable/Disable GSM CMAS amber alert messages for additional languages (4392).
    413         setCellBroadcastRange(manager, enableCmasAmberAlerts,
    414                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    415                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE,
    416                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY_LANGUAGE);
    417 
    418         // Enable/Disable GSM CMAS test messages for additional languages (4393~4395).
    419         setCellBroadcastRange(manager, enableCmasTestAlerts,
    420                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    421                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST_LANGUAGE,
    422                 SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE_LANGUAGE);
    423 
    424         // Enable/Disable channel 50 messages for Brazil.
    425         setCellBroadcastRange(manager, enableChannel50Alerts,
    426                 SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    427                 SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_50,
    428                 SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_50);
    429 
    430         if (supportIsraelPwsAlerts) {
    431             // Enable/Disable Israel PWS channels (919~928).
    432             setCellBroadcastRange(manager, enableEmergencyAlerts,
    433                     SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    434                     SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_919,
    435                     SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_928);
    436         }
    437         else if (supportTaiwanPwsAlerts) {
    438             // Enable/Disable Taiwan PWS Chinese channel (911).
    439             setCellBroadcastRange(manager, enableEmergencyAlerts,
    440                     SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    441                     SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_911,
    442                     SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_911);
    443 
    444             // Enable/Disable Taiwan PWS English channel (919).
    445             setCellBroadcastRange(manager, enableEmergencyAlerts,
    446                     SmsManager.CELL_BROADCAST_RAN_TYPE_GSM,
    447                     SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_919,
    448                     SmsCbConstants.MESSAGE_ID_GSMA_ALLOCATED_CHANNEL_919);
    449         }
    450     }
    451     /**
    452      * Enable/disable cell broadcast with messages id range
    453      * @param manager SMS manager
    454      * @param enable True for enabling cell broadcast with id range, otherwise for disabling.
    455      * @param type GSM or CDMA
    456      * @param start Cell broadcast id range start
    457      * @param end Cell broadcast id range end
    458      */
    459     private boolean setCellBroadcastRange(
    460             SmsManager manager, boolean enable, int type, int start, int end) {
    461         if (enable) {
    462             return manager.enableCellBroadcastRange(start, end, type);
    463         } else {
    464             return manager.disableCellBroadcastRange(start, end, type);
    465         }
    466     }
    467 
    468     private static void log(String msg) {
    469         Log.d(TAG, msg);
    470     }
    471 }
    472