diff options
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java')
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java | 151 |
1 files changed, 100 insertions, 51 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java index 17b9bee1..fc3b975b 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java @@ -1,4 +1,6 @@ /* + * Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Not a Contribution. * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,6 +26,8 @@ import android.content.res.Resources; import android.os.SystemProperties; import android.preference.PreferenceManager; import android.telephony.CellBroadcastMessage; +import android.telephony.MSimSmsManager; +import android.telephony.MSimTelephonyManager; import android.telephony.SmsManager; import android.telephony.TelephonyManager; import android.text.TextUtils; @@ -31,6 +35,7 @@ import android.util.Log; import com.android.internal.telephony.cdma.sms.SmsEnvelope; import com.android.internal.telephony.gsm.SmsCbConstants; +import com.android.internal.telephony.MSimConstants; import static com.android.cellbroadcastreceiver.CellBroadcastReceiver.DBG; @@ -53,13 +58,49 @@ public class CellBroadcastConfigService extends IntentService { static final String EMERGENCY_BROADCAST_RANGE_GSM = "ro.cb.gsm.emergencyids"; + private int mSubscription = MSimConstants.DEFAULT_SUBSCRIPTION; + public CellBroadcastConfigService() { super(TAG); // use class name for worker thread name } - private static void setChannelRange(SmsManager manager, String ranges, boolean enable) { - if (DBG)log("setChannelRange: " + ranges); + private void enableCellBroadcast(int messageIdentifier, boolean isMSim) { + if (isMSim) { + MSimSmsManager.getDefault().enableCellBroadcast(messageIdentifier, mSubscription); + } else { + SmsManager.getDefault().enableCellBroadcast(messageIdentifier); + } + } + private void disableCellBroadcast(int messageIdentifier, boolean isMSim) { + if (isMSim) { + MSimSmsManager.getDefault().disableCellBroadcast(messageIdentifier, mSubscription); + } else { + SmsManager.getDefault().disableCellBroadcast(messageIdentifier); + } + } + + private void enableCellBroadcastRange(int startMessageId, int endMessageId, boolean isMSim) { + if (isMSim) { + MSimSmsManager.getDefault().enableCellBroadcastRange(startMessageId, endMessageId, + mSubscription); + } else { + SmsManager.getDefault().enableCellBroadcastRange(startMessageId, endMessageId); + } + } + + private void disableCellBroadcastRange(int startMessageId, int endMessageId, boolean isMSim) { + if (isMSim) { + MSimSmsManager.getDefault().enableCellBroadcastRange(startMessageId, endMessageId, + mSubscription); + } else { + SmsManager.getDefault().enableCellBroadcastRange(startMessageId, endMessageId); + } + } + + private void setChannelRange(String ranges, boolean enable) { + if (DBG)log("setChannelRange: " + ranges); + boolean isMSim = MSimTelephonyManager.getDefault().isMultiSimEnabled(); try { for (String channelRange : ranges.split(",")) { int dashIndex = channelRange.indexOf('-'); @@ -68,19 +109,19 @@ public class CellBroadcastConfigService extends IntentService { int endId = Integer.decode(channelRange.substring(dashIndex + 1).trim()); if (enable) { if (DBG) log("enabling emergency IDs " + startId + '-' + endId); - manager.enableCellBroadcastRange(startId, endId); + enableCellBroadcastRange(startId, endId, isMSim); } else { if (DBG) log("disabling emergency IDs " + startId + '-' + endId); - manager.disableCellBroadcastRange(startId, endId); + disableCellBroadcastRange(startId, endId, isMSim); } } else { int messageId = Integer.decode(channelRange.trim()); if (enable) { if (DBG) log("enabling emergency message ID " + messageId); - manager.enableCellBroadcast(messageId); + enableCellBroadcast(messageId, isMSim); } else { if (DBG) log("disabling emergency message ID " + messageId); - manager.disableCellBroadcast(messageId); + disableCellBroadcast(messageId, isMSim); } } } @@ -90,10 +131,10 @@ public class CellBroadcastConfigService extends IntentService { // Make sure CMAS Presidential is enabled (See 3GPP TS 22.268 Section 6.2). if (DBG) log("setChannelRange: enabling CMAS Presidential"); - if (CellBroadcastReceiver.phoneIsCdma()) { - manager.enableCellBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT); + if (CellBroadcastReceiver.phoneIsCdma(mSubscription)) { + enableCellBroadcast(SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT, isMSim); } else { - manager.enableCellBroadcast(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL); + enableCellBroadcast(SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL, isMSim); } } @@ -109,7 +150,7 @@ public class CellBroadcastConfigService extends IntentService { } // Check for system property defining the emergency channel ranges to enable - String emergencyIdRange = (CellBroadcastReceiver.phoneIsCdma()) ? + String emergencyIdRange = (CellBroadcastReceiver.phoneIsCdma(message.getSubId())) ? "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM); if (TextUtils.isEmpty(emergencyIdRange)) { @@ -141,6 +182,8 @@ public class CellBroadcastConfigService extends IntentService { @Override protected void onHandleIntent(Intent intent) { if (ACTION_ENABLE_CHANNELS.equals(intent.getAction())) { + mSubscription = intent.getIntExtra(MSimConstants.SUBSCRIPTION_KEY, + MSimConstants.DEFAULT_SUBSCRIPTION); try { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); Resources res = getResources(); @@ -150,7 +193,7 @@ public class CellBroadcastConfigService extends IntentService { // except for cmas presidential. i.e. to receive cmas severe alerts, both // enableEmergencyAlerts AND enableCmasSevereAlerts must be true. boolean enableEmergencyAlerts = prefs.getBoolean( - CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true); + CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS + mSubscription, true); TelephonyManager tm = (TelephonyManager) getSystemService( Context.TELEPHONY_SERVICE); @@ -159,23 +202,26 @@ public class CellBroadcastConfigService extends IntentService { "br".equals(tm.getSimCountryIso()); boolean enableChannel50Alerts = enableChannel50Support && - prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CHANNEL_50_ALERTS, true); + prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_CHANNEL_50_ALERTS + + mSubscription, true); // Note: ETWS is for 3GPP only boolean enableEtwsTestAlerts = prefs.getBoolean( - CellBroadcastSettings.KEY_ENABLE_ETWS_TEST_ALERTS, false); + CellBroadcastSettings.KEY_ENABLE_ETWS_TEST_ALERTS + mSubscription, false); boolean enableCmasExtremeAlerts = prefs.getBoolean( - CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, true); + CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS + mSubscription, + true); boolean enableCmasSevereAlerts = prefs.getBoolean( - CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, true); + CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS + mSubscription, + true); boolean enableCmasAmberAlerts = prefs.getBoolean( - CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, true); + CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS + mSubscription, true); boolean enableCmasTestAlerts = prefs.getBoolean( - CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS, false); + CellBroadcastSettings.KEY_ENABLE_CMAS_TEST_ALERTS + mSubscription, false); // set up broadcast ID ranges to be used for each category int cmasExtremeStart = @@ -189,8 +235,10 @@ public class CellBroadcastConfigService extends IntentService { int cmasTestEnd = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_OPERATOR_DEFINED_USE; int cmasPresident = SmsCbConstants.MESSAGE_ID_CMAS_ALERT_PRESIDENTIAL_LEVEL; + boolean isMSim = MSimTelephonyManager.getDefault().isMultiSimEnabled(); + // set to CDMA broadcast ID rage if phone is in CDMA mode. - boolean isCdma = CellBroadcastReceiver.phoneIsCdma(); + boolean isCdma = CellBroadcastReceiver.phoneIsCdma(mSubscription); if (isCdma) { cmasExtremeStart = SmsEnvelope.SERVICE_CATEGORY_CMAS_EXTREME_THREAT; cmasExtremeEnd = cmasExtremeStart; @@ -202,68 +250,69 @@ public class CellBroadcastConfigService extends IntentService { cmasPresident = SmsEnvelope.SERVICE_CATEGORY_CMAS_PRESIDENTIAL_LEVEL_ALERT; } - SmsManager manager = SmsManager.getDefault(); // Check for system property defining the emergency channel ranges to enable String emergencyIdRange = isCdma ? "" : SystemProperties.get(EMERGENCY_BROADCAST_RANGE_GSM); if (enableEmergencyAlerts) { if (DBG) log("enabling emergency cell broadcast channels"); if (!TextUtils.isEmpty(emergencyIdRange)) { - setChannelRange(manager, emergencyIdRange, true); + setChannelRange(emergencyIdRange, true); } else { // No emergency channel system property, enable all emergency channels // that have checkbox checked if (!isCdma) { - manager.enableCellBroadcastRange( + enableCellBroadcastRange( SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING, - SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING); + SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING, + isMSim); if (enableEtwsTestAlerts) { - manager.enableCellBroadcast( - SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE); + enableCellBroadcast(SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE, + isMSim); } - manager.enableCellBroadcast( - SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE); + enableCellBroadcast( + SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE, isMSim); } if (enableCmasExtremeAlerts) { - manager.enableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd); + enableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd, isMSim); } if (enableCmasSevereAlerts) { - manager.enableCellBroadcastRange(cmasSevereStart, cmasSevereEnd); + enableCellBroadcastRange(cmasSevereStart, cmasSevereEnd, isMSim); } if (enableCmasAmberAlerts) { - manager.enableCellBroadcast(cmasAmber); + enableCellBroadcast(cmasAmber, isMSim); } if (enableCmasTestAlerts) { - manager.enableCellBroadcastRange(cmasTestStart, cmasTestEnd); + enableCellBroadcastRange(cmasTestStart, cmasTestEnd, isMSim); } // CMAS Presidential must be on (See 3GPP TS 22.268 Section 6.2). - manager.enableCellBroadcast(cmasPresident); + enableCellBroadcast(cmasPresident, isMSim); } if (DBG) log("enabled emergency cell broadcast channels"); } else { // we may have enabled these channels previously, so try to disable them if (DBG) log("disabling emergency cell broadcast channels"); if (!TextUtils.isEmpty(emergencyIdRange)) { - setChannelRange(manager, emergencyIdRange, false); + setChannelRange(emergencyIdRange, false); } else { // No emergency channel system property, disable all emergency channels // except for CMAS Presidential (See 3GPP TS 22.268 Section 6.2) if (!isCdma) { - manager.disableCellBroadcastRange( + disableCellBroadcastRange( SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_WARNING, - SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING); - manager.disableCellBroadcast( - SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE); - manager.disableCellBroadcast( - SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE); + SmsCbConstants.MESSAGE_ID_ETWS_EARTHQUAKE_AND_TSUNAMI_WARNING, + isMSim); + disableCellBroadcast(SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE, + isMSim); + disableCellBroadcast( + SmsCbConstants.MESSAGE_ID_ETWS_OTHER_EMERGENCY_TYPE, isMSim); } - manager.disableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd); - manager.disableCellBroadcastRange(cmasSevereStart, cmasSevereEnd); - manager.disableCellBroadcast(cmasAmber); - manager.disableCellBroadcastRange(cmasTestStart, cmasTestEnd); + disableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd, isMSim); + disableCellBroadcastRange(cmasSevereStart, cmasSevereEnd, isMSim); + disableCellBroadcast(cmasAmber, isMSim); + disableCellBroadcastRange(cmasTestStart, cmasTestEnd, isMSim); // CMAS Presidential must be on (See 3GPP TS 22.268 Section 6.2). - manager.enableCellBroadcast(cmasPresident); + enableCellBroadcast(cmasPresident, isMSim); } if (DBG) log("disabled emergency cell broadcast channels"); } @@ -272,11 +321,11 @@ public class CellBroadcastConfigService extends IntentService { if (DBG) log("channel 50 is not aplicable for cdma"); } else if (enableChannel50Alerts) { if (DBG) log("enabling cell broadcast channel 50"); - manager.enableCellBroadcast(50); + enableCellBroadcast(50, isMSim); if (DBG) log("enabled cell broadcast channel 50"); } else { if (DBG) log("disabling cell broadcast channel 50"); - manager.disableCellBroadcast(50); + disableCellBroadcast(50, isMSim); if (DBG) log("disabled cell broadcast channel 50"); } @@ -285,24 +334,24 @@ public class CellBroadcastConfigService extends IntentService { // but check box is unchecked to receive such as cmas severe alerts. if (!enableEtwsTestAlerts && !isCdma) { if (DBG) Log.d(TAG, "disabling cell broadcast ETWS test messages"); - manager.disableCellBroadcast( - SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE); + disableCellBroadcast( + SmsCbConstants.MESSAGE_ID_ETWS_TEST_MESSAGE, isMSim); } if (!enableCmasExtremeAlerts) { if (DBG) Log.d(TAG, "disabling cell broadcast CMAS extreme"); - manager.disableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd); + disableCellBroadcastRange(cmasExtremeStart, cmasExtremeEnd, isMSim); } if (!enableCmasSevereAlerts) { if (DBG) Log.d(TAG, "disabling cell broadcast CMAS severe"); - manager.disableCellBroadcastRange(cmasSevereStart, cmasSevereEnd); + disableCellBroadcastRange(cmasSevereStart, cmasSevereEnd, isMSim); } if (!enableCmasAmberAlerts) { if (DBG) Log.d(TAG, "disabling cell broadcast CMAS amber"); - manager.disableCellBroadcast(cmasAmber); + disableCellBroadcast(cmasAmber, isMSim); } if (!enableCmasTestAlerts) { if (DBG) Log.d(TAG, "disabling cell broadcast CMAS test messages"); - manager.disableCellBroadcastRange(cmasTestStart, cmasTestEnd); + disableCellBroadcastRange(cmasTestStart, cmasTestEnd, isMSim); } } catch (Exception ex) { Log.e(TAG, "exception enabling cell broadcast channels", ex); |