• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CellBroadcastConfigService()50     public CellBroadcastConfigService() {
51         super(TAG);          // use class name for worker thread name
52     }
53 
setChannelRange(SmsManager manager, String ranges, boolean enable)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 
isOperatorDefinedEmergencyId(int messageId)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
onHandleIntent(Intent intent)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