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;
2050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.Intent;
2150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.SharedPreferences;
2250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.content.res.Resources;
2350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.preference.PreferenceManager;
2450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.SmsCbConstants;
2550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.telephony.SmsManager;
2650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport android.util.Log;
2750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
2850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport com.android.internal.telephony.gsm.SmsCbHeader;
2950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambyimport static com.android.cellbroadcastreceiver.CellBroadcastReceiver.DBG;
3150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
3250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby/**
3350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * This service manages enabling and disabling ranges of message identifiers
3450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * that the radio should listen for. It operates independently of the other
3550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * services and runs at boot time and after exiting airplane mode.
3650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
3750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * Note that the entire range of emergency channels is enabled. Test messages
3850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * and lower priority broadcasts are filtered out in CellBroadcastAlertService
3950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * if the user has not enabled them in settings.
4050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby *
4150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby * TODO: add notification to re-enable channels after a radio reset.
4250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby */
4350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hambypublic class CellBroadcastConfigService extends IntentService {
4450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    private static final String TAG = "CellBroadcastConfigService";
4550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
4650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    static final String ACTION_ENABLE_CHANNELS = "ACTION_ENABLE_CHANNELS";
4750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
4850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    public CellBroadcastConfigService() {
4950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        super(TAG);          // use class name for worker thread name
5050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
5150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
5250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    @Override
5350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    protected void onHandleIntent(Intent intent) {
5450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        if (ACTION_ENABLE_CHANNELS.equals(intent.getAction())) {
5550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            try {
5650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
5750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Resources res = getResources();
5850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
5950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                boolean enableEmergencyAlerts = prefs.getBoolean(
6050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                        CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true);
6150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
6250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                boolean enableChannel50Alerts = res.getBoolean(R.bool.show_brazil_settings) &&
6350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                        prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CHANNEL_50_ALERTS, true);
6450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
6550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                SmsManager manager = SmsManager.getDefault();
6650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                if (enableEmergencyAlerts) {
6750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "enabling emergency cell broadcast channels");
6850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    manager.enableCellBroadcastRange(
6950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                            SmsCbConstants.MESSAGE_ID_PWS_FIRST_IDENTIFIER,
7050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                            SmsCbConstants.MESSAGE_ID_PWS_LAST_IDENTIFIER);
7150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "enabled emergency cell broadcast channels");
7250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                } else {
7350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    // we may have enabled these channels previously, so try to disable them
7450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "disabling emergency cell broadcast channels");
7550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    manager.disableCellBroadcastRange(
7650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                            SmsCbConstants.MESSAGE_ID_PWS_FIRST_IDENTIFIER,
7750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                            SmsCbConstants.MESSAGE_ID_PWS_LAST_IDENTIFIER);
7850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "disabled emergency cell broadcast channels");
7950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                }
8050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby
8150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                if (enableChannel50Alerts) {
8250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "enabling cell broadcast channel 50");
8350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    manager.enableCellBroadcast(50);
8450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "enabled cell broadcast channel 50");
8550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                } else {
8650a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "disabling cell broadcast channel 50");
8750a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    manager.disableCellBroadcast(50);
8850a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                    if (DBG) Log.d(TAG, "disabled cell broadcast channel 50");
8950a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                }
9050a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            } catch (Exception ex) {
9150a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby                Log.e(TAG, "exception enabling cell broadcast channels", ex);
9250a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby            }
9350a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby        }
9450a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby    }
9550a624a47ce645a7992e346e40a4e7ec5e0df9b7Jake Hamby}
96