150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/* 250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Copyright (C) 2011 The Android Open Source Project 350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Licensed under the Apache License, Version 2.0 (the "License"); 550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * you may not use this file except in compliance with the License. 650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * You may obtain a copy of the License at 750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * http://www.apache.org/licenses/LICENSE-2.0 950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 1050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Unless required by applicable law or agreed to in writing, software 1150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * distributed under the License is distributed on an "AS IS" BASIS, 1250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * See the License for the specific language governing permissions and 1450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * limitations under the License. 1550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 1650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypackage com.android.cellbroadcastreceiver; 1850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.app.IntentService; 208524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.content.Context; 2150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent; 2250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.SharedPreferences; 2350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.res.Resources; 2459610ad5074acb5305c353a53c01676eb8258887Jake Hambyimport android.os.SystemProperties; 2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.preference.PreferenceManager; 2657273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hambyimport android.telephony.CellBroadcastMessage; 2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.SmsManager; 288524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hambyimport android.telephony.TelephonyManager; 2959610ad5074acb5305c353a53c01676eb8258887Jake Hambyimport android.text.TextUtils; 3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log; 3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 32a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooksimport com.android.internal.telephony.cdma.sms.SmsEnvelope; 3300b87064abfb9d254fbbf72110643d2e626365e6Jake Hambyimport com.android.internal.telephony.gsm.SmsCbConstants; 3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport static com.android.cellbroadcastreceiver.CellBroadcastReceiver.DBG; 3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 3750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/** 3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * This service manages enabling and disabling ranges of message identifiers 3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * that the radio should listen for. It operates independently of the other 4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * services and runs at boot time and after exiting airplane mode. 4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Note that the entire range of emergency channels is enabled. Test messages 4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * and lower priority broadcasts are filtered out in CellBroadcastAlertService 4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * if the user has not enabled them in settings. 4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * 4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * TODO: add notification to re-enable channels after a radio reset. 4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */ 4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class CellBroadcastConfigService extends IntentService { 4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby private static final String TAG = "CellBroadcastConfigService"; 5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby static final String ACTION_ENABLE_CHANNELS = "ACTION_ENABLE_CHANNELS"; 5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 53a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks static final String EMERGENCY_BROADCAST_RANGE_GSM = 54a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks "ro.cb.gsm.emergencyids"; 55a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks 5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby public CellBroadcastConfigService() { 5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby super(TAG); // use class name for worker thread name 5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 6000b87064abfb9d254fbbf72110643d2e626365e6Jake Hamby private static void setChannelRange(SmsManager manager, String ranges, boolean enable) { 61b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks if (DBG)log("setChannelRange: " + ranges); 62b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks 6359610ad5074acb5305c353a53c01676eb8258887Jake Hamby try { 6459610ad5074acb5305c353a53c01676eb8258887Jake Hamby for (String channelRange : ranges.split(",")) { 6559610ad5074acb5305c353a53c01676eb8258887Jake Hamby int dashIndex = channelRange.indexOf('-'); 6659610ad5074acb5305c353a53c01676eb8258887Jake Hamby if (dashIndex != -1) { 67b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks int startId = Integer.decode(channelRange.substring(0, dashIndex).trim()); 68b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks int endId = Integer.decode(channelRange.substring(dashIndex + 1).trim()); 6959610ad5074acb5305c353a53c01676eb8258887Jake Hamby if (enable) { 7047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("enabling emergency IDs " + startId + '-' + endId); 7159610ad5074acb5305c353a53c01676eb8258887Jake Hamby manager.enableCellBroadcastRange(startId, endId); 7259610ad5074acb5305c353a53c01676eb8258887Jake Hamby } else { 7347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("disabling emergency IDs " + startId + '-' + endId); 7459610ad5074acb5305c353a53c01676eb8258887Jake Hamby manager.disableCellBroadcastRange(startId, endId); 7559610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 7659610ad5074acb5305c353a53c01676eb8258887Jake Hamby } else { 77b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks int messageId = Integer.decode(channelRange.trim()); 7859610ad5074acb5305c353a53c01676eb8258887Jake Hamby if (enable) { 7947ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("enabling emergency message ID " + messageId); 8059610ad5074acb5305c353a53c01676eb8258887Jake Hamby manager.enableCellBroadcast(messageId); 8159610ad5074acb5305c353a53c01676eb8258887Jake Hamby } else { 8247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("disabling emergency message ID " + messageId); 8359610ad5074acb5305c353a53c01676eb8258887Jake Hamby manager.disableCellBroadcast(messageId); 8459610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 8559610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 8659610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 8759610ad5074acb5305c353a53c01676eb8258887Jake Hamby } catch (NumberFormatException e) { 8859610ad5074acb5305c353a53c01676eb8258887Jake Hamby Log.e(TAG, "Number Format Exception parsing emergency channel range", e); 8959610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 90b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks 91b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks // Make sure CMAS Presidential is enabled (See 3GPP TS 22.268 Section 6.2). 92b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks if (DBG) log("setChannelRange: enabling CMAS Presidential"); 93a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks if (CellBroadcastReceiver.phoneIsCdma()) { 94a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks manager.enableCellBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT); 95a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks } else { 96a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks manager.enableCellBroadcast(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL); 97a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks } 9859610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 9959610ad5074acb5305c353a53c01676eb8258887Jake Hamby 10057273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby /** 10157273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby * Returns true if this is a standard or operator-defined emergency alert message. 10257273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby * This includes all ETWS and CMAS alerts, except for AMBER alerts. 10357273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby * @param message the message to test 10457273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby * @return true if the message is an emergency alert; false otherwise 10557273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby */ 10657273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby static boolean isEmergencyAlertMessage(CellBroadcastMessage message) { 10757273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby if (message.isEmergencyAlertMessage()) { 10857273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby return true; 10957273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby } 11057273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby 111f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby // Check for system property defining the emergency channel ranges to enable 112a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks String emergencyIdRange = (CellBroadcastReceiver.phoneIsCdma()) ? 113a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM); 114a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks 115f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby if (TextUtils.isEmpty(emergencyIdRange)) { 116f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby return false; 117f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 118f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby try { 11957273ebfa13f96bf5aba9902b70e2b179fec9e4cJake Hamby int messageId = message.getServiceCategory(); 120f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby for (String channelRange : emergencyIdRange.split(",")) { 121f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby int dashIndex = channelRange.indexOf('-'); 122f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby if (dashIndex != -1) { 123b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks int startId = Integer.decode(channelRange.substring(0, dashIndex).trim()); 124b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks int endId = Integer.decode(channelRange.substring(dashIndex + 1).trim()); 125f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby if (messageId >= startId && messageId <= endId) { 126f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby return true; 127f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 128f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } else { 129b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks int emergencyMessageId = Integer.decode(channelRange.trim()); 130f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby if (emergencyMessageId == messageId) { 131f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby return true; 132f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 133f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 134f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 135f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } catch (NumberFormatException e) { 136f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby Log.e(TAG, "Number Format Exception parsing emergency channel range", e); 137f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 138f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby return false; 139f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby } 140f88de2b37383f138b3c7d876bdc3b6b6fae7b728Jake Hamby 14150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby @Override 14250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby protected void onHandleIntent(Intent intent) { 14350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (ACTION_ENABLE_CHANNELS.equals(intent.getAction())) { 14450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby try { 14550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 14650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Resources res = getResources(); 14759610ad5074acb5305c353a53c01676eb8258887Jake Hamby 1483880548e290746d40f0a669a2d35064bfc380095Rika Brooks // boolean for each user preference checkbox, true for checked, false for unchecked 1493880548e290746d40f0a669a2d35064bfc380095Rika Brooks // Note: If enableEmergencyAlerts is false, it disables ALL emergency broadcasts 1503880548e290746d40f0a669a2d35064bfc380095Rika Brooks // except for cmas presidential. i.e. to receive cmas severe alerts, both 1513880548e290746d40f0a669a2d35064bfc380095Rika Brooks // enableEmergencyAlerts AND enableCmasSevereAlerts must be true. 15250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby boolean enableEmergencyAlerts = prefs.getBoolean( 15350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true); 15450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1558524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby TelephonyManager tm = (TelephonyManager) getSystemService( 1568524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby Context.TELEPHONY_SERVICE); 1578524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby 1588524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby boolean enableChannel50Support = res.getBoolean(R.bool.show_brazil_settings) || 1598524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby "br".equals(tm.getSimCountryIso()); 1608524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby 1618524c0a36abccf29818d6e18c1080208cfee3ec4Jake Hamby boolean enableChannel50Alerts = enableChannel50Support && 16250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CHANNEL_50_ALERTS, true); 16350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 1643880548e290746d40f0a669a2d35064bfc380095Rika Brooks // Note: ETWS is for 3GPP only 1653880548e290746d40f0a669a2d35064bfc380095Rika Brooks boolean enableEtwsTestAlerts = prefs.getBoolean( 1663880548e290746d40f0a669a2d35064bfc380095Rika Brooks CellBroadcastSettings.KEY_ENABLE_ETWS_TEST_ALERTS, false); 1673880548e290746d40f0a669a2d35064bfc380095Rika Brooks 1683880548e290746d40f0a669a2d35064bfc380095Rika Brooks boolean enableCmasExtremeAlerts = prefs.getBoolean( 1693880548e290746d40f0a669a2d35064bfc380095Rika Brooks CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, true); 1703880548e290746d40f0a669a2d35064bfc380095Rika Brooks 1713880548e290746d40f0a669a2d35064bfc380095Rika Brooks boolean enableCmasSevereAlerts = prefs.getBoolean( 1723880548e290746d40f0a669a2d35064bfc380095Rika Brooks CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, true); 1733880548e290746d40f0a669a2d35064bfc380095Rika Brooks 1743880548e290746d40f0a669a2d35064bfc380095Rika Brooks boolean enableCmasAmberAlerts = prefs.getBoolean( 1753880548e290746d40f0a669a2d35064bfc380095Rika Brooks CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, true); 1763880548e290746d40f0a669a2d35064bfc380095Rika Brooks 1773880548e290746d40f0a669a2d35064bfc380095Rika Brooks boolean enableCmasTestAlerts = prefs.getBoolean( 1783880548e290746d40f0a669a2d35064bfc380095Rika Brooks CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS, false); 1793880548e290746d40f0a669a2d35064bfc380095Rika Brooks 1803880548e290746d40f0a669a2d35064bfc380095Rika Brooks // set up broadcast ID ranges to be used for each category 1813880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasExtremeStart = 1823880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_OBSERVED; 183e348e51fedf48b9d07f5f737c0ae2ca10acdd356Anju Mathapati int cmasExtremeEnd = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_IMMEDIATE_LIKELY; 1843880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasSevereStart = 185e348e51fedf48b9d07f5f737c0ae2ca10acdd356Anju Mathapati SmsCbConstants.MESSAGE_ID_CMAS_ALERT_EXTREME_EXPECTED_OBSERVED; 1863880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasSevereEnd = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_SEVERE_EXPECTED_LIKELY; 1873880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasAmber = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_CHILD_ABDUCTION_EMERGENCY; 1883880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasTestStart = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_REQUIRED_MONTHLY_TEST; 1893880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasTestEnd = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE; 1903880548e290746d40f0a669a2d35064bfc380095Rika Brooks int cmasPresident = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL; 1913880548e290746d40f0a669a2d35064bfc380095Rika Brooks 1923880548e290746d40f0a669a2d35064bfc380095Rika Brooks // set to CDMA broadcast ID rage if phone is in CDMA mode. 1933880548e290746d40f0a669a2d35064bfc380095Rika Brooks boolean isCdma = CellBroadcastReceiver.phoneIsCdma(); 1943880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (isCdma) { 1953880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasExtremeStart = SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT; 1963880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasExtremeEnd = cmasExtremeStart; 1973880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasSevereStart = SmsEnvelope.SERVICE_CATEGORY_CMAS_SEVERE_THREAT; 1983880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasSevereEnd = cmasSevereStart; 1993880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasAmber = SmsEnvelope.SERVICE_CATEGORY_CMAS_CHILD_ABDUCTION_EMERGENCY; 2003880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasTestStart = SmsEnvelope.SERVICE_CATEGORY_CMAS_TEST_MESSAGE; 2013880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasTestEnd = cmasTestStart; 2023880548e290746d40f0a669a2d35064bfc380095Rika Brooks cmasPresident = SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT; 2033880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2043880548e290746d40f0a669a2d35064bfc380095Rika Brooks 20550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby SmsManager manager = SmsManager.getDefault(); 2063880548e290746d40f0a669a2d35064bfc380095Rika Brooks // Check for system property defining the emergency channel ranges to enable 2073880548e290746d40f0a669a2d35064bfc380095Rika Brooks String emergencyIdRange = isCdma ? 2083880548e290746d40f0a669a2d35064bfc380095Rika Brooks "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM); 20950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby if (enableEmergencyAlerts) { 21047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("enabling emergency cell broadcast channels"); 21159610ad5074acb5305c353a53c01676eb8258887Jake Hamby if (!TextUtils.isEmpty(emergencyIdRange)) { 21259610ad5074acb5305c353a53c01676eb8258887Jake Hamby setChannelRange(manager, emergencyIdRange, true); 21359610ad5074acb5305c353a53c01676eb8258887Jake Hamby } else { 21459610ad5074acb5305c353a53c01676eb8258887Jake Hamby // No emergency channel system property, enable all emergency channels 2153880548e290746d40f0a669a2d35064bfc380095Rika Brooks // that have checkbox checked 2163880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!isCdma) { 2173880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcastRange( 2183880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING, 2193880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING); 2203880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (enableEtwsTestAlerts) { 2213880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcast( 2223880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE); 2233880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2243880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcast( 2253880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE); 2263880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2273880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (enableCmasExtremeAlerts) { 2283880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd); 2293880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2303880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (enableCmasSevereAlerts) { 2313880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcastRange(cmasSevereStart, cmasSevereEnd); 2323880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2333880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (enableCmasAmberAlerts) { 2343880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcast(cmasAmber); 2353880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2363880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (enableCmasTestAlerts) { 2373880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcastRange(cmasTestStart, cmasTestEnd); 2383880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 239b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks // CMAS Presidential must be on (See 3GPP TS 22.268 Section 6.2). 2403880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcast(cmasPresident); 24159610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 24247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("enabled emergency cell broadcast channels"); 24350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 24450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby // we may have enabled these channels previously, so try to disable them 24547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("disabling emergency cell broadcast channels"); 24659610ad5074acb5305c353a53c01676eb8258887Jake Hamby if (!TextUtils.isEmpty(emergencyIdRange)) { 24759610ad5074acb5305c353a53c01676eb8258887Jake Hamby setChannelRange(manager, emergencyIdRange, false); 24859610ad5074acb5305c353a53c01676eb8258887Jake Hamby } else { 24959610ad5074acb5305c353a53c01676eb8258887Jake Hamby // No emergency channel system property, disable all emergency channels 250b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks // except for CMAS Presidential (See 3GPP TS 22.268 Section 6.2) 2513880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!isCdma) { 2523880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange( 2533880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING, 2543880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING); 2553880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcast( 2563880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE); 2573880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcast( 2583880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE); 2593880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2603880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd); 2613880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange(cmasSevereStart, cmasSevereEnd); 2623880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcast(cmasAmber); 2633880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange(cmasTestStart, cmasTestEnd); 264b691740cc6c5e05f47b2eb8f0e766e6dfac9bfe7Rika Brooks 2653880548e290746d40f0a669a2d35064bfc380095Rika Brooks // CMAS Presidential must be on (See 3GPP TS 22.268 Section 6.2). 2663880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.enableCellBroadcast(cmasPresident); 26759610ad5074acb5305c353a53c01676eb8258887Jake Hamby } 26847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("disabled emergency cell broadcast channels"); 26950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 27050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby 271a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks if (isCdma) { 272a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks if (DBG) log("channel 50 is not aplicable for cdma"); 273a028d57ae657c29873abd1ba6969f6e4ce835ebaRika Brooks } else if (enableChannel50Alerts) { 27447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("enabling cell broadcast channel 50"); 27550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby manager.enableCellBroadcast(50); 27647ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("enabled cell broadcast channel 50"); 27750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } else { 27847ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("disabling cell broadcast channel 50"); 27950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby manager.disableCellBroadcast(50); 28047ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby if (DBG) log("disabled cell broadcast channel 50"); 28150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 2823880548e290746d40f0a669a2d35064bfc380095Rika Brooks 2833880548e290746d40f0a669a2d35064bfc380095Rika Brooks // Disable per user preference/checkbox. 2843880548e290746d40f0a669a2d35064bfc380095Rika Brooks // This takes care of the case where enableEmergencyAlerts is true, 2853880548e290746d40f0a669a2d35064bfc380095Rika Brooks // but check box is unchecked to receive such as cmas severe alerts. 2863880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!enableEtwsTestAlerts && !isCdma) { 2873880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (DBG) Log.d(TAG, "disabling cell broadcast ETWS test messages"); 2883880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcast( 2893880548e290746d40f0a669a2d35064bfc380095Rika Brooks SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE); 2903880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2913880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!enableCmasExtremeAlerts) { 2923880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (DBG) Log.d(TAG, "disabling cell broadcast CMAS extreme"); 2933880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd); 2943880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2953880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!enableCmasSevereAlerts) { 2963880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (DBG) Log.d(TAG, "disabling cell broadcast CMAS severe"); 2973880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange(cmasSevereStart, cmasSevereEnd); 2983880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 2993880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!enableCmasAmberAlerts) { 3003880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (DBG) Log.d(TAG, "disabling cell broadcast CMAS amber"); 3013880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcast(cmasAmber); 3023880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 3033880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (!enableCmasTestAlerts) { 3043880548e290746d40f0a669a2d35064bfc380095Rika Brooks if (DBG) Log.d(TAG, "disabling cell broadcast CMAS test messages"); 3053880548e290746d40f0a669a2d35064bfc380095Rika Brooks manager.disableCellBroadcastRange(cmasTestStart, cmasTestEnd); 3063880548e290746d40f0a669a2d35064bfc380095Rika Brooks } 30750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } catch (Exception ex) { 30850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby Log.e(TAG, "exception enabling cell broadcast channels", ex); 30950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 31050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 31150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby } 31247ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby 31347ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby private static void log(String msg) { 31447ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby Log.d(TAG, msg); 31547ffe15b440cb98548c0f2c58cbd1e64dd0435dbJake Hamby } 31650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby} 317