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