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.Intent;
     21 import android.content.SharedPreferences;
     22 import android.content.res.Resources;
     23 import android.os.SystemProperties;
     24 import android.preference.PreferenceManager;
     25 import android.telephony.SmsCbConstants;
     26 import android.telephony.SmsManager;
     27 import android.text.TextUtils;
     28 import android.util.Log;
     29 
     30 import com.android.internal.telephony.gsm.SmsCbHeader;
     31 
     32 import static com.android.cellbroadcastreceiver.CellBroadcastReceiver.DBG;
     33 
     34 /**
     35  * This service manages enabling and disabling ranges of message identifiers
     36  * that the radio should listen for. It operates independently of the other
     37  * services and runs at boot time and after exiting airplane mode.
     38  *
     39  * Note that the entire range of emergency channels is enabled. Test messages
     40  * and lower priority broadcasts are filtered out in CellBroadcastAlertService
     41  * if the user has not enabled them in settings.
     42  *
     43  * TODO: add notification to re-enable channels after a radio reset.
     44  */
     45 public class CellBroadcastConfigService extends IntentService {
     46     private static final String TAG = "CellBroadcastConfigService";
     47 
     48     static final String ACTION_ENABLE_CHANNELS = "ACTION_ENABLE_CHANNELS";
     49 
     50     public CellBroadcastConfigService() {
     51         super(TAG);          // use class name for worker thread name
     52     }
     53 
     54     private void setChannelRange(SmsManager manager, String ranges, boolean enable) {
     55         try {
     56             for (String channelRange : ranges.split(",")) {
     57                 int dashIndex = channelRange.indexOf('-');
     58                 if (dashIndex != -1) {
     59                     int startId = Integer.decode(channelRange.substring(0, dashIndex));
     60                     int endId = Integer.decode(channelRange.substring(dashIndex + 1));
     61                     if (enable) {
     62                         if (DBG) Log.d(TAG, "enabling emergency IDs " + startId + '-' + endId);
     63                         manager.enableCellBroadcastRange(startId, endId);
     64                     } else {
     65                         if (DBG) Log.d(TAG, "disabling emergency IDs " + startId + '-' + endId);
     66                         manager.disableCellBroadcastRange(startId, endId);
     67                     }
     68                 } else {
     69                     int messageId = Integer.decode(channelRange);
     70                     if (enable) {
     71                         if (DBG) Log.d(TAG, "enabling emergency message ID " + messageId);
     72                         manager.enableCellBroadcast(messageId);
     73                     } else {
     74                         if (DBG) Log.d(TAG, "disabling emergency message ID " + messageId);
     75                         manager.disableCellBroadcast(messageId);
     76                     }
     77                 }
     78             }
     79         } catch (NumberFormatException e) {
     80             Log.e(TAG, "Number Format Exception parsing emergency channel range", e);
     81         }
     82     }
     83 
     84     static boolean isOperatorDefinedEmergencyId(int messageId) {
     85         // Check for system property defining the emergency channel ranges to enable
     86         String emergencyIdRange = SystemProperties.get("ro.cellbroadcast.emergencyids");
     87         if (TextUtils.isEmpty(emergencyIdRange)) {
     88             return false;
     89         }
     90         try {
     91             for (String channelRange : emergencyIdRange.split(",")) {
     92                 int dashIndex = channelRange.indexOf('-');
     93                 if (dashIndex != -1) {
     94                     int startId = Integer.decode(channelRange.substring(0, dashIndex));
     95                     int endId = Integer.decode(channelRange.substring(dashIndex + 1));
     96                     if (messageId >= startId && messageId <= endId) {
     97                         return true;
     98                     }
     99                 } else {
    100                     int emergencyMessageId = Integer.decode(channelRange);
    101                     if (emergencyMessageId == messageId) {
    102                         return true;
    103                     }
    104                 }
    105             }
    106         } catch (NumberFormatException e) {
    107             Log.e(TAG, "Number Format Exception parsing emergency channel range", e);
    108         }
    109         return false;
    110     }
    111 
    112     @Override
    113     protected void onHandleIntent(Intent intent) {
    114         if (ACTION_ENABLE_CHANNELS.equals(intent.getAction())) {
    115             try {
    116                 SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
    117                 Resources res = getResources();
    118 
    119                 // Check for system property defining the emergency channel ranges to enable
    120                 String emergencyIdRange = SystemProperties.get("ro.cellbroadcast.emergencyids");
    121 
    122                 boolean enableEmergencyAlerts = prefs.getBoolean(
    123                         CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true);
    124 
    125                 boolean enableChannel50Alerts = res.getBoolean(R.bool.show_brazil_settings) &&
    126                         prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CHANNEL_50_ALERTS, true);
    127 
    128                 SmsManager manager = SmsManager.getDefault();
    129                 if (enableEmergencyAlerts) {
    130                     if (DBG) Log.d(TAG, "enabling emergency cell broadcast channels");
    131                     if (!TextUtils.isEmpty(emergencyIdRange)) {
    132                         setChannelRange(manager, emergencyIdRange, true);
    133                     } else {
    134                         // No emergency channel system property, enable all emergency channels
    135                         manager.enableCellBroadcastRange(
    136                                 SmsCbConstants.MESSAGE_ID_PWS_FIRST_IDENTIFIER,
    137                                 SmsCbConstants.MESSAGE_ID_PWS_LAST_IDENTIFIER);
    138                     }
    139                     if (DBG) Log.d(TAG, "enabled emergency cell broadcast channels");
    140                 } else {
    141                     // we may have enabled these channels previously, so try to disable them
    142                     if (DBG) Log.d(TAG, "disabling emergency cell broadcast channels");
    143                     if (!TextUtils.isEmpty(emergencyIdRange)) {
    144                         setChannelRange(manager, emergencyIdRange, false);
    145                     } else {
    146                         // No emergency channel system property, disable all emergency channels
    147                         manager.disableCellBroadcastRange(
    148                                 SmsCbConstants.MESSAGE_ID_PWS_FIRST_IDENTIFIER,
    149                                 SmsCbConstants.MESSAGE_ID_PWS_LAST_IDENTIFIER);
    150                     }
    151                     if (DBG) Log.d(TAG, "disabled emergency cell broadcast channels");
    152                 }
    153 
    154                 if (enableChannel50Alerts) {
    155                     if (DBG) Log.d(TAG, "enabling cell broadcast channel 50");
    156                     manager.enableCellBroadcast(50);
    157                     if (DBG) Log.d(TAG, "enabled cell broadcast channel 50");
    158                 } else {
    159                     if (DBG) Log.d(TAG, "disabling cell broadcast channel 50");
    160                     manager.disableCellBroadcast(50);
    161                     if (DBG) Log.d(TAG, "disabled cell broadcast channel 50");
    162                 }
    163             } catch (Exception ex) {
    164                 Log.e(TAG, "exception enabling cell broadcast channels", ex);
    165             }
    166         }
    167     }
    168 }
    169