summaryrefslogtreecommitdiff
path: root/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java')
-rw-r--r--src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java164
1 files changed, 140 insertions, 24 deletions
diff --git a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
index 9b9b75af4..29f00243f 100644
--- a/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
+++ b/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
@@ -30,6 +30,7 @@ import android.preference.PreferenceManager;
import android.telephony.SmsManager;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -81,10 +82,13 @@ public class CellBroadcastConfigService extends IntentService {
for (int subId : subIds) {
log("Enable CellBroadcast on sub " + subId);
enableCellBroadcastChannels(subId);
+ enableCellBroadcastRoamingChannelsAsNeeded(subId);
}
} else {
// For no sim scenario.
enableCellBroadcastChannels(SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
+ enableCellBroadcastRoamingChannelsAsNeeded(
+ SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
}
}
} catch (Exception ex) {
@@ -109,7 +113,8 @@ public class CellBroadcastConfigService extends IntentService {
.setContentTitle(c.getString(R.string.notification_cb_settings_changed_title))
.setContentText(c.getString(R.string.notification_cb_settings_changed_text))
.setSmallIcon(R.drawable.ic_settings_gear_outline_24dp)
- .setContentIntent(pi);
+ .setContentIntent(pi)
+ .setAutoCancel(true);
NotificationManager notificationManager = c.getSystemService(
NotificationManager.class);
notificationManager.notify(
@@ -164,7 +169,7 @@ public class CellBroadcastConfigService extends IntentService {
resetCellBroadcastChannels(subId);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
- Resources res = CellBroadcastSettings.getResources(this, subId);
+ Resources res = getResources(subId, null);
// boolean for each user preference checkbox, true for checked, false for unchecked
// Note: If enableAlertsMasterToggle is false, it disables ALL emergency broadcasts
@@ -215,14 +220,29 @@ public class CellBroadcastConfigService extends IntentService {
boolean enableEmergencyAlerts = enableAlertsMasterToggle && prefs.getBoolean(
CellBroadcastSettings.KEY_ENABLE_EMERGENCY_ALERTS, true);
- boolean enableGeoFencingTriggerMessage = true;
+ setCellBroadcastChannelsEnabled(subId, null, enableAlertsMasterToggle, enableEtwsAlerts,
+ enablePresidential, enableCmasExtremeAlerts, enableCmasSevereAlerts,
+ enableCmasAmberAlerts, enableTestAlerts, enableExerciseAlerts,
+ enableOperatorDefined, enableAreaUpdateInfoAlerts,
+ enablePublicSafetyMessagesChannelAlerts, enableStateLocalTestAlerts,
+ enableEmergencyAlerts, true);
+ }
+
+ private void setCellBroadcastChannelsEnabled(int subId, @NonNull String operator,
+ boolean enableAlertsMasterToggle, boolean enableEtwsAlerts, boolean enablePresidential,
+ boolean enableCmasExtremeAlerts, boolean enableCmasSevereAlerts,
+ boolean enableCmasAmberAlerts, boolean enableTestAlerts, boolean enableExerciseAlerts,
+ boolean enableOperatorDefined, boolean enableAreaUpdateInfoAlerts,
+ boolean enablePublicSafetyMessagesChannelAlerts, boolean enableStateLocalTestAlerts,
+ boolean enableEmergencyAlerts, boolean enableGeoFencingTriggerMessage) {
if (VDBG) {
+ log("setCellBroadcastChannelsEnabled for " + subId + ", operator: " + operator);
log("enableAlertsMasterToggle = " + enableAlertsMasterToggle);
log("enableEtwsAlerts = " + enableEtwsAlerts);
log("enablePresidential = " + enablePresidential);
log("enableCmasExtremeAlerts = " + enableCmasExtremeAlerts);
- log("enableCmasSevereAlerts = " + enableCmasExtremeAlerts);
+ log("enableCmasSevereAlerts = " + enableCmasSevereAlerts);
log("enableCmasAmberAlerts = " + enableCmasAmberAlerts);
log("enableTestAlerts = " + enableTestAlerts);
log("enableExerciseAlerts = " + enableExerciseAlerts);
@@ -235,80 +255,81 @@ public class CellBroadcastConfigService extends IntentService {
log("enableGeoFencingTriggerMessage = " + enableGeoFencingTriggerMessage);
}
+ boolean isEnableOnly = !TextUtils.isEmpty(operator);
CellBroadcastChannelManager channelManager = new CellBroadcastChannelManager(
- getApplicationContext(), subId);
+ getApplicationContext(), subId, operator);
/** Enable CMAS series messages. */
// Enable/Disable Presidential messages.
- setCellBroadcastRange(subId, enablePresidential,
+ setCellBroadcastRange(subId, isEnableOnly, enablePresidential,
channelManager.getCellBroadcastChannelRanges(
R.array.cmas_presidential_alerts_channels_range_strings));
// Enable/Disable CMAS extreme messages.
- setCellBroadcastRange(subId, enableCmasExtremeAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableCmasExtremeAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.cmas_alert_extreme_channels_range_strings));
// Enable/Disable CMAS severe messages.
- setCellBroadcastRange(subId, enableCmasSevereAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableCmasSevereAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.cmas_alerts_severe_range_strings));
// Enable/Disable CMAS amber alert messages.
- setCellBroadcastRange(subId, enableCmasAmberAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableCmasAmberAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.cmas_amber_alerts_channels_range_strings));
// Enable/Disable test messages.
- setCellBroadcastRange(subId, enableTestAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableTestAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.required_monthly_test_range_strings));
// Enable/Disable exercise test messages.
// This could either controlled by main test toggle or separate exercise test toggle.
- setCellBroadcastRange(subId, enableTestAlerts || enableExerciseAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableTestAlerts || enableExerciseAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.exercise_alert_range_strings));
// Enable/Disable operator defined test messages.
// This could either controlled by main test toggle or separate operator defined test toggle
- setCellBroadcastRange(subId, enableTestAlerts || enableOperatorDefined,
+ setCellBroadcastRange(subId, isEnableOnly, enableTestAlerts || enableOperatorDefined,
channelManager.getCellBroadcastChannelRanges(
R.array.operator_defined_alert_range_strings));
// Enable/Disable GSM ETWS messages.
- setCellBroadcastRange(subId, enableEtwsAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableEtwsAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.etws_alerts_range_strings));
// Enable/Disable GSM ETWS test messages.
- setCellBroadcastRange(subId, enableTestAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableTestAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.etws_test_alerts_range_strings));
// Enable/Disable GSM public safety messages.
- setCellBroadcastRange(subId, enablePublicSafetyMessagesChannelAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enablePublicSafetyMessagesChannelAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.public_safety_messages_channels_range_strings));
// Enable/Disable GSM state/local test alerts.
- setCellBroadcastRange(subId, enableStateLocalTestAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableStateLocalTestAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.state_local_test_alert_range_strings));
// Enable/Disable GSM geo-fencing trigger messages.
- setCellBroadcastRange(subId, enableGeoFencingTriggerMessage,
+ setCellBroadcastRange(subId, isEnableOnly, enableGeoFencingTriggerMessage,
channelManager.getCellBroadcastChannelRanges(
R.array.geo_fencing_trigger_messages_range_strings));
// Enable non-CMAS series messages.
- setCellBroadcastRange(subId, enableEmergencyAlerts,
+ setCellBroadcastRange(subId, isEnableOnly, enableEmergencyAlerts,
channelManager.getCellBroadcastChannelRanges(
R.array.emergency_alerts_channels_range_strings));
// Enable/Disable additional channels based on carrier specific requirement.
- ArrayList<CellBroadcastChannelRange> ranges =
+ List<CellBroadcastChannelRange> ranges =
channelManager.getCellBroadcastChannelRanges(
R.array.additional_cbs_channels_strings);
@@ -324,17 +345,88 @@ public class CellBroadcastConfigService extends IntentService {
default:
enableAlerts = enableAlertsMasterToggle;
}
- setCellBroadcastRange(subId, enableAlerts, new ArrayList<>(Arrays.asList(range)));
+ setCellBroadcastRange(subId, isEnableOnly, enableAlerts,
+ new ArrayList<>(Arrays.asList(range)));
}
}
+
+ /**
+ * Enable cell broadcast messages channels. Messages can be only received on the
+ * enabled channels.
+ *
+ * @param subId Subscription index
+ */
+ @VisibleForTesting
+ public void enableCellBroadcastRoamingChannelsAsNeeded(int subId) {
+ if (!SubscriptionManager.isValidSubscriptionId(subId)) {
+ subId = SubscriptionManager.DEFAULT_SUBSCRIPTION_ID;
+ }
+
+ String roamingOperator = CellBroadcastReceiver.getRoamingOperatorSupported(this);
+ if (roamingOperator.isEmpty()) {
+ return;
+ }
+
+ log("enableCellBroadcastRoamingChannels for roaming network:" + roamingOperator);
+ Resources res = getResources(subId, roamingOperator);
+
+ // Get default config for roaming network as the settings are based on sim
+ boolean enablePresidential = true;
+
+ boolean enableAlertsMasterToggle = res.getBoolean(R.bool.master_toggle_enabled_default);
+
+ boolean enableEtwsAlerts = enableAlertsMasterToggle;
+
+ boolean enableCmasExtremeAlerts = enableAlertsMasterToggle && res.getBoolean(
+ R.bool.extreme_threat_alerts_enabled_default);
+
+ boolean enableCmasSevereAlerts = enableAlertsMasterToggle && res.getBoolean(
+ R.bool.severe_threat_alerts_enabled_default);
+
+ boolean enableCmasAmberAlerts = enableAlertsMasterToggle && res.getBoolean(
+ R.bool.amber_alerts_enabled_default);
+
+ boolean enableTestAlerts = enableAlertsMasterToggle && CellBroadcastSettings
+ .isTestAlertsToggleVisible(getApplicationContext(), roamingOperator)
+ && res.getBoolean(R.bool.test_alerts_enabled_default);
+
+ boolean enableExerciseAlerts = enableAlertsMasterToggle
+ && res.getBoolean(R.bool.show_separate_exercise_settings)
+ && res.getBoolean(R.bool.test_exercise_alerts_enabled_default);
+
+ boolean enableOperatorDefined = enableAlertsMasterToggle
+ && res.getBoolean(R.bool.show_separate_operator_defined_settings)
+ && res.getBoolean(R.bool.test_operator_defined_alerts_enabled_default);
+
+ boolean enableAreaUpdateInfoAlerts = res.getBoolean(
+ R.bool.config_showAreaUpdateInfoSettings)
+ && res.getBoolean(R.bool.area_update_info_alerts_enabled_default);
+
+ boolean enablePublicSafetyMessagesChannelAlerts = enableAlertsMasterToggle
+ && res.getBoolean(R.bool.public_safety_messages_enabled_default);
+ boolean enableStateLocalTestAlerts = enableAlertsMasterToggle
+ && res.getBoolean(R.bool.state_local_test_alerts_enabled_default);
+
+ boolean enableEmergencyAlerts = enableAlertsMasterToggle && res.getBoolean(
+ R.bool.emergency_alerts_enabled_default);
+
+ setCellBroadcastChannelsEnabled(subId, roamingOperator, enableAlertsMasterToggle,
+ enableEtwsAlerts, enablePresidential, enableCmasExtremeAlerts,
+ enableCmasSevereAlerts, enableCmasAmberAlerts, enableTestAlerts,
+ enableExerciseAlerts, enableOperatorDefined, enableAreaUpdateInfoAlerts,
+ enablePublicSafetyMessagesChannelAlerts, enableStateLocalTestAlerts,
+ enableEmergencyAlerts, true);
+ }
+
/**
* Enable/disable cell broadcast with messages id range
* @param subId Subscription index
- * @param enable True for enabling cell broadcast with id range, otherwise for disabling.
+ * @param isEnableOnly, True for enabling channel only for roaming network
+ * @param enable True for enabling cell broadcast with id range, otherwise for disabling
* @param ranges Cell broadcast id ranges
*/
- private void setCellBroadcastRange(int subId, boolean enable,
- List<CellBroadcastChannelRange> ranges) {
+ private void setCellBroadcastRange(int subId, boolean isEnableOnly,
+ boolean enable, List<CellBroadcastChannelRange> ranges) {
SmsManager manager;
if (subId != SubscriptionManager.DEFAULT_SUBSCRIPTION_ID) {
manager = SmsManager.getSmsManagerForSubscriptionId(subId);
@@ -349,15 +441,39 @@ public class CellBroadcastConfigService extends IntentService {
+ ":" + range.mEndId);
enable = true;
}
+
if (enable) {
+ if (VDBG) {
+ log("enableCellBroadcastRange[" + range.mStartId + "-" + range.mEndId
+ + "], type:" + range.mRanType);
+ }
manager.enableCellBroadcastRange(range.mStartId, range.mEndId, range.mRanType);
- } else {
+ } else if (!isEnableOnly) {
+ if (VDBG) {
+ log("disableCellBroadcastRange[" + range.mStartId + "-" + range.mEndId
+ + "], type:" + range.mRanType);
+ }
manager.disableCellBroadcastRange(range.mStartId, range.mEndId, range.mRanType);
}
}
}
}
+
+ /**
+ * Get resource according to the operator or subId
+ * @param subId Subscription index
+ * @param operator Operator numeric, the resource will be retrieved by it if it is no null,
+ * otherwise, by the sub id.
+ */
+ @VisibleForTesting
+ public Resources getResources(int subId, String operator) {
+ if (operator == null) {
+ return CellBroadcastSettings.getResources(this, subId);
+ }
+ return CellBroadcastSettings.getResourcesByOperator(this, subId, operator);
+ }
+
private static void log(String msg) {
Log.d(TAG, msg);
}