summaryrefslogtreecommitdiff
path: root/src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java')
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastAlertService.java181
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);
+ }
}