diff options
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java')
-rw-r--r-- | src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java | 181 |
1 files changed, 86 insertions, 95 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java index b5edce295..85e62936b 100644 --- a/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java +++ b/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java @@ -57,6 +57,7 @@ import com.android.cellbroadcastservice.CellBroadcastStatsLog; import com.android.internal.annotations.VisibleForTesting; import java.util.ArrayList; +import java.util.List; import java.util.Locale; import java.util.Set; @@ -206,8 +207,8 @@ public class CellBroadcastAlertService extends Service { CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager(mContext, message.getSubscriptionId()); // check the full-screen message settings to hide or show message to users. - if (channelManager.checkCellBroadcastChannelRange(message.getServiceCategory(), - R.array.public_safety_messages_channels_range_strings)) { + if (channelManager.getCellBroadcastChannelResourcesKey(message.getServiceCategory()) + == R.array.public_safety_messages_channels_range_strings) { return PreferenceManager.getDefaultSharedPreferences(this) .getBoolean(CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES_FULL_SCREEN, true); @@ -455,35 +456,36 @@ public class CellBroadcastAlertService extends Service { * @return true if the channel is enabled on the device, otherwise false. */ private boolean isChannelEnabled(SmsCbMessage message) { - CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager(mContext, - message.getSubscriptionId()); + int subId = message.getSubscriptionId(); + CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager( + mContext, subId); CellBroadcastChannelRange chanelrange = channelManager .getCellBroadcastChannelRangeFromMessage(message); - Resources res = CellBroadcastSettings.getResources(mContext, message.getSubscriptionId()); + Resources res = CellBroadcastSettings.getResourcesByOperator(mContext, subId, + CellBroadcastReceiver.getRoamingOperatorSupported(this)); if (chanelrange != null && chanelrange.mAlwaysOn) { Log.d(TAG, "channel is enabled due to always-on, ignoring preference check"); return true; } - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); // Check if all emergency alerts are disabled. - boolean emergencyAlertEnabled = - prefs.getBoolean(CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, true); + boolean emergencyAlertEnabled = checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_ALERTS_MASTER_TOGGLE, true); int channel = message.getServiceCategory(); + int resourcesKey = channelManager.getCellBroadcastChannelResourcesKey(channel); + CellBroadcastChannelRange range = channelManager.getCellBroadcastChannelRange(channel); SmsCbEtwsInfo etwsInfo = message.getEtwsWarningInfo(); if ((etwsInfo != null && etwsInfo.getWarningType() == SmsCbEtwsInfo.ETWS_WARNING_TYPE_TEST_MESSAGE) - || channelManager.checkCellBroadcastChannelRange(channel, - R.array.etws_test_alerts_range_strings)) { + || resourcesKey == R.array.etws_test_alerts_range_strings) { return emergencyAlertEnabled && CellBroadcastSettings.isTestAlertsToggleVisible(getApplicationContext()) - && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); + && checkAlertConfigEnabled(subId, + CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); } - if (message.isEtwsMessage() || channelManager.checkCellBroadcastChannelRange(channel, - R.array.etws_alerts_range_strings)) { + if (message.isEtwsMessage() || resourcesKey == R.array.etws_alerts_range_strings) { // ETWS messages. // Turn on/off emergency notifications is the only way to turn on/off ETWS messages. return emergencyAlertEnabled; @@ -492,109 +494,79 @@ public class CellBroadcastAlertService extends Service { // Check if the messages are on additional channels enabled by the resource config. // If those channels are enabled by the carrier, but the device is actually roaming, we // should not allow the messages. - ArrayList<CellBroadcastChannelRange> ranges = channelManager.getCellBroadcastChannelRanges( - R.array.additional_cbs_channels_strings); - - for (CellBroadcastChannelRange range : ranges) { - if (range.mStartId <= channel && range.mEndId >= channel) { - // Check if the channel is within the scope. If not, ignore the alert message. - if (!channelManager.checkScope(range.mScope)) { - Log.d(TAG, "The range [" + range.mStartId + "-" + range.mEndId - + "] is not within the scope. mScope = " + range.mScope); - return false; - } - - if (range.mAlertType == AlertType.TEST) { - return emergencyAlertEnabled - && CellBroadcastSettings.isTestAlertsToggleVisible( - getApplicationContext()) - && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, - false); - } - if (range.mAlertType == AlertType.AREA) { - return emergencyAlertEnabled && PreferenceManager - .getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_AREA_UPDATE_INFO_ALERTS, - false); - } + if (resourcesKey == R.array.additional_cbs_channels_strings) { + // Check if the channel is within the scope. If not, ignore the alert message. + if (!channelManager.checkScope(range.mScope)) { + Log.d(TAG, "The range [" + range.mStartId + "-" + range.mEndId + + "] is not within the scope. mScope = " + range.mScope); + return false; + } - return emergencyAlertEnabled; + if (range.mAlertType == AlertType.TEST) { + return emergencyAlertEnabled + && CellBroadcastSettings.isTestAlertsToggleVisible(getApplicationContext()) + && checkAlertConfigEnabled(subId, + CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); + } + if (range.mAlertType == AlertType.AREA) { + return emergencyAlertEnabled && checkAlertConfigEnabled(subId, + CellBroadcastSettings.KEY_ENABLE_AREA_UPDATE_INFO_ALERTS, false); } + + return emergencyAlertEnabled; } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.emergency_alerts_channels_range_strings)) { - return emergencyAlertEnabled - && PreferenceManager.getDefaultSharedPreferences(this).getBoolean( - CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true); + if (resourcesKey == R.array.emergency_alerts_channels_range_strings) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true); } // CMAS warning types - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.cmas_presidential_alerts_channels_range_strings)) { + if (resourcesKey == R.array.cmas_presidential_alerts_channels_range_strings) { // always enabled return true; } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.cmas_alert_extreme_channels_range_strings)) { - return emergencyAlertEnabled - && PreferenceManager.getDefaultSharedPreferences(this).getBoolean( - CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, true); + if (resourcesKey == R.array.cmas_alert_extreme_channels_range_strings) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_CMAS_EXTREME_THREAT_ALERTS, true); } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.cmas_alerts_severe_range_strings)) { - return emergencyAlertEnabled - && PreferenceManager.getDefaultSharedPreferences(this).getBoolean( - CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, true); + if (resourcesKey == R.array.cmas_alerts_severe_range_strings) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_CMAS_SEVERE_THREAT_ALERTS, true); } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.cmas_amber_alerts_channels_range_strings)) { - return emergencyAlertEnabled - && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, true); + if (resourcesKey == R.array.cmas_amber_alerts_channels_range_strings) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_CMAS_AMBER_ALERTS, true); } - if (channelManager.checkCellBroadcastChannelRange( - channel, R.array.exercise_alert_range_strings) && - res.getBoolean(R.bool.show_separate_exercise_settings)) { - return emergencyAlertEnabled && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, false); + if (resourcesKey == R.array.exercise_alert_range_strings + && res.getBoolean(R.bool.show_separate_exercise_settings)) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_EXERCISE_ALERTS, false); } - if (channelManager.checkCellBroadcastChannelRange( - channel, R.array.operator_defined_alert_range_strings) && - res.getBoolean(R.bool.show_separate_operator_defined_settings)) { - return emergencyAlertEnabled && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, false); + if (resourcesKey == R.array.operator_defined_alert_range_strings + && res.getBoolean(R.bool.show_separate_operator_defined_settings)) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_OPERATOR_DEFINED_ALERTS, false); } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.required_monthly_test_range_strings) - || channelManager.checkCellBroadcastChannelRange(channel, - R.array.exercise_alert_range_strings) - || channelManager.checkCellBroadcastChannelRange(channel, - R.array.operator_defined_alert_range_strings)) { + if (resourcesKey == R.array.required_monthly_test_range_strings + || resourcesKey == R.array.exercise_alert_range_strings + || resourcesKey == R.array.operator_defined_alert_range_strings) { return emergencyAlertEnabled && CellBroadcastSettings.isTestAlertsToggleVisible(getApplicationContext()) - && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, - false); + && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_TEST_ALERTS, false); } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.public_safety_messages_channels_range_strings)) { - return emergencyAlertEnabled - && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES, - true); + if (resourcesKey == R.array.public_safety_messages_channels_range_strings) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_PUBLIC_SAFETY_MESSAGES, true); } - if (channelManager.checkCellBroadcastChannelRange(channel, - R.array.state_local_test_alert_range_strings)) { - return emergencyAlertEnabled - && PreferenceManager.getDefaultSharedPreferences(this) - .getBoolean(CellBroadcastSettings.KEY_ENABLE_STATE_LOCAL_TEST_ALERTS, - false); + if (resourcesKey == R.array.state_local_test_alert_range_strings) { + return emergencyAlertEnabled && checkAlertConfigEnabled( + subId, CellBroadcastSettings.KEY_ENABLE_STATE_LOCAL_TEST_ALERTS, false); } Log.e(TAG, "received undefined channels: " + channel); @@ -648,7 +620,7 @@ public class CellBroadcastAlertService extends Service { } } else { int channel = message.getServiceCategory(); - ArrayList<CellBroadcastChannelRange> ranges = channelManager + List<CellBroadcastChannelRange> ranges = channelManager .getAllCellBroadcastChannelRanges(); for (CellBroadcastChannelRange range : ranges) { if (channel >= range.mStartId && channel <= range.mEndId) { @@ -996,4 +968,23 @@ public class CellBroadcastAlertService extends Service { } return false; } + + private boolean checkAlertConfigEnabled(int subId, String key, boolean defaultValue) { + boolean result = defaultValue; + String roamingOperator = CellBroadcastReceiver.getRoamingOperatorSupported(this); + // For roaming supported case + if (!roamingOperator.isEmpty()) { + int resId = CellBroadcastSettings.getResourcesIdForDefaultPrefValue(key); + if (resId != 0) { + result = CellBroadcastSettings.getResourcesByOperator( + mContext, subId, roamingOperator).getBoolean(resId); + // For roaming support case, the channel can be enabled by the default config + // for the network even it is disabled by the preference + if (result) { + return true; + } + } + } + return PreferenceManager.getDefaultSharedPreferences(this).getBoolean(key, defaultValue); + } } |